]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | include(CompilerRTCompile) |
2 | ||
92a42be0 SL |
3 | clang_compiler_add_cxx_check() |
4 | ||
5 | # FIXME: use SANITIZER_COMMON_SUPPORTED_ARCH here | |
6 | filter_available_targets(SANITIZER_UNITTEST_SUPPORTED_ARCH x86_64 i386 mips64 mips64el) | |
7 | if(APPLE) | |
8 | darwin_filter_host_archs(SANITIZER_UNITTEST_SUPPORTED_ARCH SANITIZER_COMMON_SUPPORTED_ARCH) | |
9 | endif() | |
10 | ||
1a4d82fc JJ |
11 | set(SANITIZER_UNITTESTS |
12 | sanitizer_allocator_test.cc | |
13 | sanitizer_atomic_test.cc | |
14 | sanitizer_bitvector_test.cc | |
15 | sanitizer_bvgraph_test.cc | |
16 | sanitizer_common_test.cc | |
17 | sanitizer_deadlock_detector_test.cc | |
18 | sanitizer_flags_test.cc | |
19 | sanitizer_format_interceptor_test.cc | |
20 | sanitizer_ioctl_test.cc | |
21 | sanitizer_libc_test.cc | |
22 | sanitizer_linux_test.cc | |
23 | sanitizer_list_test.cc | |
24 | sanitizer_mutex_test.cc | |
25 | sanitizer_nolibc_test.cc | |
26 | sanitizer_posix_test.cc | |
27 | sanitizer_printf_test.cc | |
28 | sanitizer_procmaps_test.cc | |
29 | sanitizer_stackdepot_test.cc | |
92a42be0 | 30 | sanitizer_stacktrace_printer_test.cc |
1a4d82fc JJ |
31 | sanitizer_stacktrace_test.cc |
32 | sanitizer_stoptheworld_test.cc | |
33 | sanitizer_suppressions_test.cc | |
92a42be0 | 34 | sanitizer_symbolizer_test.cc |
1a4d82fc JJ |
35 | sanitizer_test_main.cc |
36 | sanitizer_thread_registry_test.cc) | |
37 | ||
38 | set(SANITIZER_TEST_HEADERS | |
92a42be0 SL |
39 | sanitizer_pthread_wrappers.h |
40 | sanitizer_test_config.h | |
1a4d82fc JJ |
41 | sanitizer_test_utils.h) |
42 | foreach(header ${SANITIZER_HEADERS}) | |
43 | list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) | |
44 | endforeach() | |
45 | ||
46 | set(SANITIZER_TEST_CFLAGS_COMMON | |
5bcae85e | 47 | ${COMPILER_RT_UNITTEST_CFLAGS} |
1a4d82fc JJ |
48 | ${COMPILER_RT_GTEST_CFLAGS} |
49 | -I${COMPILER_RT_SOURCE_DIR}/include | |
50 | -I${COMPILER_RT_SOURCE_DIR}/lib | |
51 | -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common | |
92a42be0 SL |
52 | -fno-rtti |
53 | -O2 | |
1a4d82fc JJ |
54 | -Werror=sign-compare |
55 | -Wno-non-virtual-dtor) | |
56 | ||
92a42be0 SL |
57 | if(MSVC) |
58 | # Disable exceptions on Windows until they work reliably. | |
59 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -fno-exceptions -DGTEST_HAS_SEH=0) | |
60 | endif() | |
61 | ||
62 | # -gline-tables-only must be enough for these tests, so use it if possible. | |
63 | if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang") | |
64 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gline-tables-only) | |
65 | else() | |
66 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -g) | |
67 | endif() | |
5bcae85e SL |
68 | if(MSVC) |
69 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gcodeview) | |
70 | endif() | |
71 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON -g) | |
92a42be0 SL |
72 | |
73 | if(NOT MSVC) | |
74 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON --driver-mode=g++) | |
75 | endif() | |
76 | ||
77 | if(ANDROID) | |
78 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON -pie) | |
79 | endif() | |
80 | ||
7cac9316 XL |
81 | if(APPLE) |
82 | list(APPEND SANITIZER_TEST_CFLAGS_COMMON ${DARWIN_osx_CFLAGS}) | |
83 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON ${DARWIN_osx_LINK_FLAGS}) | |
84 | ||
85 | add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) | |
86 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON ${WEAK_SYMBOL_LINK_FLAGS}) | |
87 | endif() | |
88 | ||
5bcae85e SL |
89 | # MSVC linker is allocating 1M for the stack by default, which is not |
90 | # enough for the unittests. Some unittests require more than 2M. | |
91 | # The default stack size for clang is 8M. | |
92 | if(MSVC) | |
93 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON -Wl,/STACK:0xC00000) | |
94 | endif() | |
95 | ||
92a42be0 SL |
96 | set(SANITIZER_TEST_LINK_LIBS) |
97 | append_list_if(COMPILER_RT_HAS_LIBLOG log SANITIZER_TEST_LINK_LIBS) | |
98 | # NDK r10 requires -latomic almost always. | |
99 | append_list_if(ANDROID atomic SANITIZER_TEST_LINK_LIBS) | |
100 | ||
101 | append_list_if(COMPILER_RT_HAS_LIBDL -ldl SANITIZER_TEST_LINK_FLAGS_COMMON) | |
102 | append_list_if(COMPILER_RT_HAS_LIBRT -lrt SANITIZER_TEST_LINK_FLAGS_COMMON) | |
103 | append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SANITIZER_TEST_LINK_FLAGS_COMMON) | |
104 | # x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also, | |
105 | # 'libm' shall be specified explicitly to build i386 tests. | |
1a4d82fc | 106 | if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE") |
92a42be0 | 107 | list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON "-lc++ -lm") |
1a4d82fc JJ |
108 | endif() |
109 | ||
110 | include_directories(..) | |
111 | include_directories(../..) | |
112 | ||
113 | # Adds static library which contains sanitizer_common object file | |
114 | # (universal binary on Mac and arch-specific object files on Linux). | |
115 | macro(add_sanitizer_common_lib library) | |
116 | add_library(${library} STATIC ${ARGN}) | |
117 | set_target_properties(${library} PROPERTIES | |
5bcae85e SL |
118 | ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} |
119 | FOLDER "Compiler-RT Runtime tests") | |
1a4d82fc JJ |
120 | endmacro() |
121 | ||
122 | function(get_sanitizer_common_lib_for_arch arch lib lib_name) | |
123 | if(APPLE) | |
124 | set(tgt_name "RTSanitizerCommon.test.osx") | |
125 | else() | |
126 | set(tgt_name "RTSanitizerCommon.test.${arch}") | |
127 | endif() | |
128 | set(${lib} "${tgt_name}" PARENT_SCOPE) | |
5bcae85e SL |
129 | if(CMAKE_CONFIGURATION_TYPES) |
130 | set(configuration_path "${CMAKE_CFG_INTDIR}/") | |
131 | else() | |
132 | set(configuration_path "") | |
133 | endif() | |
92a42be0 | 134 | if(NOT MSVC) |
5bcae85e | 135 | set(${lib_name} "${configuration_path}lib${tgt_name}.a" PARENT_SCOPE) |
92a42be0 | 136 | else() |
5bcae85e | 137 | set(${lib_name} "${configuration_path}${tgt_name}.lib" PARENT_SCOPE) |
92a42be0 | 138 | endif() |
1a4d82fc JJ |
139 | endfunction() |
140 | ||
141 | # Sanitizer_common unit tests testsuite. | |
142 | add_custom_target(SanitizerUnitTests) | |
5bcae85e | 143 | set_target_properties(SanitizerUnitTests PROPERTIES FOLDER "Compiler-RT Tests") |
1a4d82fc JJ |
144 | |
145 | # Adds sanitizer tests for architecture. | |
146 | macro(add_sanitizer_tests_for_arch arch) | |
147 | get_target_flags_for_arch(${arch} TARGET_FLAGS) | |
148 | set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS} | |
149 | ${COMPILER_RT_GTEST_SOURCE}) | |
150 | set(SANITIZER_TEST_COMPILE_DEPS ${SANITIZER_TEST_HEADERS}) | |
151 | if(NOT COMPILER_RT_STANDALONE_BUILD) | |
152 | list(APPEND SANITIZER_TEST_COMPILE_DEPS gtest) | |
153 | endif() | |
154 | set(SANITIZER_TEST_OBJECTS) | |
155 | foreach(source ${SANITIZER_TEST_SOURCES}) | |
156 | get_filename_component(basename ${source} NAME) | |
5bcae85e SL |
157 | if(CMAKE_CONFIGURATION_TYPES) |
158 | set(output_obj "${CMAKE_CFG_INTDIR}/${basename}.${arch}.o") | |
159 | else() | |
160 | set(output_obj "${basename}.${arch}.o") | |
161 | endif() | |
1a4d82fc JJ |
162 | clang_compile(${output_obj} ${source} |
163 | CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} | |
164 | DEPS ${SANITIZER_TEST_COMPILE_DEPS}) | |
165 | list(APPEND SANITIZER_TEST_OBJECTS ${output_obj}) | |
166 | endforeach() | |
167 | get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB | |
168 | SANITIZER_COMMON_LIB_NAME) | |
169 | # Add unittest target. | |
170 | set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test") | |
171 | add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME} | |
172 | OBJECTS ${SANITIZER_TEST_OBJECTS} | |
173 | ${SANITIZER_COMMON_LIB_NAME} | |
174 | DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} | |
175 | LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON} | |
176 | ${TARGET_FLAGS}) | |
177 | ||
178 | if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64") | |
179 | # Test that the libc-independent part of sanitizer_common is indeed | |
180 | # independent of libc, by linking this binary without libc (here) and | |
181 | # executing it (unit test in sanitizer_nolibc_test.cc). | |
182 | clang_compile(sanitizer_nolibc_test_main.${arch}.o | |
183 | sanitizer_nolibc_test_main.cc | |
184 | CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} | |
185 | DEPS ${SANITIZER_TEST_COMPILE_DEPS}) | |
186 | add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc" | |
187 | OBJECTS sanitizer_nolibc_test_main.${arch}.o | |
188 | -Wl,-whole-archive | |
189 | libRTSanitizerCommon.test.nolibc.${arch}.a | |
190 | -Wl,-no-whole-archive | |
191 | DEPS sanitizer_nolibc_test_main.${arch}.o | |
192 | RTSanitizerCommon.test.nolibc.${arch} | |
193 | LINK_FLAGS -nostdlib ${TARGET_FLAGS}) | |
194 | endif() | |
195 | endmacro() | |
196 | ||
92a42be0 | 197 | if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) |
1a4d82fc JJ |
198 | # We use just-built clang to build sanitizer_common unittests, so we must |
199 | # be sure that produced binaries would work. | |
200 | if(APPLE) | |
201 | add_sanitizer_common_lib("RTSanitizerCommon.test.osx" | |
92a42be0 SL |
202 | $<TARGET_OBJECTS:RTSanitizerCommon.osx> |
203 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>) | |
1a4d82fc JJ |
204 | else() |
205 | if(CAN_TARGET_x86_64) | |
1a4d82fc | 206 | add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64" |
92a42be0 SL |
207 | $<TARGET_OBJECTS:RTSanitizerCommon.x86_64> |
208 | $<TARGET_OBJECTS:RTSanitizerCommonNoLibc.x86_64>) | |
1a4d82fc | 209 | endif() |
92a42be0 SL |
210 | foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH}) |
211 | add_sanitizer_common_lib("RTSanitizerCommon.test.${arch}" | |
212 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> | |
213 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>) | |
214 | endforeach() | |
1a4d82fc | 215 | endif() |
92a42be0 SL |
216 | foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH}) |
217 | add_sanitizer_tests_for_arch(${arch}) | |
218 | endforeach() | |
1a4d82fc JJ |
219 | endif() |
220 | ||
221 | if(ANDROID) | |
92a42be0 SL |
222 | foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH}) |
223 | add_executable(SanitizerTest | |
224 | ${SANITIZER_UNITTESTS} | |
225 | ${COMPILER_RT_GTEST_SOURCE} | |
226 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> | |
227 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>) | |
228 | set_target_compile_flags(SanitizerTest | |
229 | ${SANITIZER_COMMON_CFLAGS} | |
230 | ${SANITIZER_TEST_CFLAGS_COMMON}) | |
231 | # Setup correct output directory and link flags. | |
232 | set_target_properties(SanitizerTest PROPERTIES | |
233 | RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) | |
234 | set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) | |
235 | target_link_libraries(SanitizerTest ${SANITIZER_TEST_LINK_LIBS}) | |
236 | # Add unit test to test suite. | |
237 | add_dependencies(SanitizerUnitTests SanitizerTest) | |
238 | endforeach() | |
1a4d82fc | 239 | endif() |