1 include(CompilerRTCompile)
3 set(SANITIZER_UNITTESTS
4 sanitizer_allocator_test.cc
5 sanitizer_atomic_test.cc
6 sanitizer_bitvector_test.cc
7 sanitizer_bvgraph_test.cc
8 sanitizer_common_test.cc
9 sanitizer_deadlock_detector_test.cc
10 sanitizer_flags_test.cc
11 sanitizer_format_interceptor_test.cc
12 sanitizer_ioctl_test.cc
13 sanitizer_libc_test.cc
14 sanitizer_linux_test.cc
15 sanitizer_list_test.cc
16 sanitizer_mutex_test.cc
17 sanitizer_nolibc_test.cc
18 sanitizer_posix_test.cc
19 sanitizer_printf_test.cc
20 sanitizer_procmaps_test.cc
21 sanitizer_stackdepot_test.cc
22 sanitizer_stacktrace_test.cc
23 sanitizer_stoptheworld_test.cc
24 sanitizer_suppressions_test.cc
25 sanitizer_test_main.cc
26 sanitizer_thread_registry_test.cc)
28 set(SANITIZER_TEST_HEADERS
29 sanitizer_test_utils.h)
30 foreach(header ${SANITIZER_HEADERS})
31 list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header})
34 set(SANITIZER_TEST_CFLAGS_COMMON
35 ${COMPILER_RT_GTEST_CFLAGS}
36 -I${COMPILER_RT_SOURCE_DIR}/include
37 -I${COMPILER_RT_SOURCE_DIR}/lib
38 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common
42 -Wno-non-virtual-dtor)
44 set(SANITIZER_TEST_LINK_FLAGS_COMMON
46 append_if(COMPILER_RT_HAS_LIBDL -ldl SANITIZER_TEST_LINK_FLAGS_COMMON)
47 append_if(COMPILER_RT_HAS_LIBPTHREAD -lpthread SANITIZER_TEST_LINK_FLAGS_COMMON)
48 # x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests.
49 if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")
50 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON "-lc++")
53 include_directories(..)
54 include_directories(../..)
56 # Adds static library which contains sanitizer_common object file
57 # (universal binary on Mac and arch-specific object files on Linux).
58 macro(add_sanitizer_common_lib library)
59 add_library(${library} STATIC ${ARGN})
60 set_target_properties(${library} PROPERTIES
61 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
64 function(get_sanitizer_common_lib_for_arch arch lib lib_name)
66 set(tgt_name "RTSanitizerCommon.test.osx")
68 set(tgt_name "RTSanitizerCommon.test.${arch}")
70 set(${lib} "${tgt_name}" PARENT_SCOPE)
71 set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE)
74 # Sanitizer_common unit tests testsuite.
75 add_custom_target(SanitizerUnitTests)
76 set_target_properties(SanitizerUnitTests PROPERTIES
77 FOLDER "Sanitizer unittests")
79 # Adds sanitizer tests for architecture.
80 macro(add_sanitizer_tests_for_arch arch)
81 get_target_flags_for_arch(${arch} TARGET_FLAGS)
82 set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS}
83 ${COMPILER_RT_GTEST_SOURCE})
84 set(SANITIZER_TEST_COMPILE_DEPS ${SANITIZER_TEST_HEADERS})
85 if(NOT COMPILER_RT_STANDALONE_BUILD)
86 list(APPEND SANITIZER_TEST_COMPILE_DEPS gtest)
88 set(SANITIZER_TEST_OBJECTS)
89 foreach(source ${SANITIZER_TEST_SOURCES})
90 get_filename_component(basename ${source} NAME)
91 set(output_obj "${basename}.${arch}.o")
92 clang_compile(${output_obj} ${source}
93 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
94 DEPS ${SANITIZER_TEST_COMPILE_DEPS})
95 list(APPEND SANITIZER_TEST_OBJECTS ${output_obj})
97 get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB
98 SANITIZER_COMMON_LIB_NAME)
99 # Add unittest target.
100 set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test")
101 add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME}
102 OBJECTS ${SANITIZER_TEST_OBJECTS}
103 ${SANITIZER_COMMON_LIB_NAME}
104 DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB}
105 LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON}
108 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64")
109 # Test that the libc-independent part of sanitizer_common is indeed
110 # independent of libc, by linking this binary without libc (here) and
111 # executing it (unit test in sanitizer_nolibc_test.cc).
112 clang_compile(sanitizer_nolibc_test_main.${arch}.o
113 sanitizer_nolibc_test_main.cc
114 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
115 DEPS ${SANITIZER_TEST_COMPILE_DEPS})
116 add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc"
117 OBJECTS sanitizer_nolibc_test_main.${arch}.o
119 libRTSanitizerCommon.test.nolibc.${arch}.a
120 -Wl,-no-whole-archive
121 DEPS sanitizer_nolibc_test_main.${arch}.o
122 RTSanitizerCommon.test.nolibc.${arch}
123 LINK_FLAGS -nostdlib ${TARGET_FLAGS})
127 if(COMPILER_RT_CAN_EXECUTE_TESTS)
128 # We use just-built clang to build sanitizer_common unittests, so we must
129 # be sure that produced binaries would work.
131 add_sanitizer_common_lib("RTSanitizerCommon.test.osx"
132 $<TARGET_OBJECTS:RTSanitizerCommon.osx>)
134 if(CAN_TARGET_x86_64)
135 add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64"
136 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>
137 $<TARGET_OBJECTS:RTSanitizerCommonLibc.x86_64>)
138 add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64"
139 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>)
142 add_sanitizer_common_lib("RTSanitizerCommon.test.i386"
143 $<TARGET_OBJECTS:RTSanitizerCommon.i386>
144 $<TARGET_OBJECTS:RTSanitizerCommonLibc.i386>)
147 if(CAN_TARGET_x86_64)
148 add_sanitizer_tests_for_arch(x86_64)
151 add_sanitizer_tests_for_arch(i386)
156 # We assume that unit tests on Android are built in a build
157 # tree with fresh Clang as a host compiler.
158 add_executable(SanitizerTest
159 ${SANITIZER_UNITTESTS}
160 ${COMPILER_RT_GTEST_SOURCE}
161 $<TARGET_OBJECTS:RTSanitizerCommon.arm.android>)
162 set_target_compile_flags(SanitizerTest
163 ${SANITIZER_COMMON_CFLAGS}
164 ${SANITIZER_TEST_CFLAGS_COMMON})
165 # Setup correct output directory and link flags.
166 set_target_properties(SanitizerTest PROPERTIES
167 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
168 set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON})
169 target_link_libraries(SanitizerTest log)
170 # Add unit test to test suite.
171 add_dependencies(SanitizerUnitTests SanitizerTest)