xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/asan/tests/CMakeLists.txt (revision a7c257b03e4462df2b1020128fb82716512d7856)
1# Testing rules for AddressSanitizer.
2#
3# These are broken into two buckets. One set of tests directly interacts with
4# the runtime library and checks its functionality. These are the
5# no-instrumentation tests.
6#
7# Another group of tests relies upon the ability to compile the test with
8# address sanitizer instrumentation pass. These tests form "integration" tests
9# and have some elements of version skew -- they test the *host* compiler's
10# instrumentation against the just-built runtime library.
11
12include(CheckCXXCompilerFlag)
13include(CompilerRTCompile)
14
15include_directories(..)
16include_directories(../..)
17
18set(ASAN_UNITTEST_HEADERS
19  asan_mac_test.h
20  asan_test_config.h
21  asan_test_utils.h)
22
23set(ASAN_UNITTEST_COMMON_CFLAGS
24  ${COMPILER_RT_UNITTEST_CFLAGS}
25  ${COMPILER_RT_GTEST_CFLAGS}
26  ${COMPILER_RT_ASAN_SHADOW_SCALE_LLVM_FLAG}
27  -I${COMPILER_RT_SOURCE_DIR}/include
28  -I${COMPILER_RT_SOURCE_DIR}/lib
29  -I${COMPILER_RT_SOURCE_DIR}/lib/asan
30  -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/tests
31  -fno-rtti
32  -O2
33  -Wno-format
34  -Werror=sign-compare
35  -Wno-non-virtual-dtor)
36append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros ASAN_UNITTEST_COMMON_CFLAGS)
37
38# This will ensure the target linker is used
39# during cross compilation
40set(ASAN_UNITTEST_COMMON_LINK_FLAGS
41  ${COMPILER_RT_UNITTEST_LINK_FLAGS})
42
43# -gline-tables-only must be enough for ASan, so use it if possible.
44if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
45  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only)
46else()
47  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g)
48endif()
49if(MSVC)
50  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gcodeview)
51endif()
52list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -g)
53
54# Use -D instead of definitions to please custom compile command.
55list(APPEND ASAN_UNITTEST_COMMON_CFLAGS
56  ${COMPILER_RT_ASAN_SHADOW_SCALE_FLAG}
57  -DASAN_HAS_BLACKLIST=1
58  -DASAN_HAS_EXCEPTIONS=1
59  -DASAN_UAR=0)
60
61if(APPLE)
62  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS ${DARWIN_osx_CFLAGS})
63  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS})
64
65  add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS)
66  add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)
67  add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
68  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS})
69endif()
70
71set(ASAN_BLACKLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore")
72set(ASAN_UNITTEST_INSTRUMENTED_CFLAGS
73  ${ASAN_UNITTEST_COMMON_CFLAGS}
74  -fsanitize=address
75  "-fsanitize-blacklist=${ASAN_BLACKLIST_FILE}"
76)
77if(CAN_TARGET_x86_64 OR CAN_TARGET_i386)
78  list(APPEND ASAN_UNITTEST_INSTRUMENTED_CFLAGS -mllvm -asan-instrument-assembly)
79endif()
80
81if(NOT MSVC)
82  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS --driver-mode=g++)
83endif()
84
85# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests.
86if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")
87  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS "-lc++")
88endif()
89
90# Unit tests on Mac depend on Foundation.
91if(APPLE)
92  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -framework Foundation)
93endif()
94if(ANDROID)
95  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -pie)
96endif()
97
98set(ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS
99  ${ASAN_UNITTEST_COMMON_LINK_FLAGS})
100list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS -fsanitize=address)
101
102set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS
103  ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}
104  -shared-libasan)
105
106set(ASAN_UNITTEST_INSTRUMENTED_LIBS)
107# NDK r10 requires -latomic almost always.
108append_list_if(ANDROID atomic ASAN_UNITTEST_INSTRUMENTED_LIBS)
109
110set(ASAN_UNITTEST_NOINST_LINK_FLAGS ${ASAN_UNITTEST_COMMON_LINK_FLAGS})
111if(NOT APPLE)
112  append_list_if(COMPILER_RT_HAS_LIBM -lm ASAN_UNITTEST_NOINST_LINK_FLAGS)
113  append_list_if(COMPILER_RT_HAS_LIBDL -ldl ASAN_UNITTEST_NOINST_LINK_FLAGS)
114  append_list_if(COMPILER_RT_HAS_LIBRT -lrt ASAN_UNITTEST_NOINST_LINK_FLAGS)
115  append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_UNITTEST_NOINST_LINK_FLAGS)
116  append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS)
117endif()
118
119# TODO(eugenis): move all -l flags above to _LIBS?
120set(ASAN_UNITTEST_NOINST_LIBS)
121append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_UNITTEST_NOINST_LIBS)
122# NDK r10 requires -latomic almost always.
123append_list_if(ANDROID atomic ASAN_UNITTEST_NOINST_LIBS)
124
125# Main AddressSanitizer unit tests.
126add_custom_target(AsanUnitTests)
127set_target_properties(AsanUnitTests PROPERTIES FOLDER "Compiler-RT Tests")
128
129# AddressSanitizer unit tests with dynamic runtime (on platforms where it's
130# not the default).
131add_custom_target(AsanDynamicUnitTests)
132set_target_properties(AsanDynamicUnitTests PROPERTIES FOLDER "Compiler-RT Tests")
133# ASan benchmarks (not actively used now).
134add_custom_target(AsanBenchmarks)
135set_target_properties(AsanBenchmarks PROPERTIES FOLDER "Compiler-RT Tests")
136
137set(ASAN_NOINST_TEST_SOURCES
138  ${COMPILER_RT_GTEST_SOURCE}
139  asan_fake_stack_test.cc
140  asan_noinst_test.cc
141  asan_test_main.cc)
142
143set(ASAN_INST_TEST_SOURCES
144  ${COMPILER_RT_GTEST_SOURCE}
145  asan_asm_test.cc
146  asan_globals_test.cc
147  asan_interface_test.cc
148  asan_internal_interface_test.cc
149  asan_test.cc
150  asan_oob_test.cc
151  asan_mem_test.cc
152  asan_str_test.cc
153  asan_test_main.cc)
154if(APPLE)
155  list(APPEND ASAN_INST_TEST_SOURCES asan_mac_test.cc asan_mac_test_helpers.mm)
156endif()
157
158set(ASAN_BENCHMARKS_SOURCES
159  ${COMPILER_RT_GTEST_SOURCE}
160  asan_benchmarks_test.cc)
161
162function(add_asan_tests arch test_runtime)
163  cmake_parse_arguments(TEST "" "KIND" "CFLAGS" ${ARGN})
164
165  # Closure to keep the values.
166  function(generate_asan_tests test_objects test_suite testname)
167    generate_compiler_rt_tests(${test_objects} ${test_suite} ${testname} ${arch}
168      COMPILE_DEPS ${ASAN_UNITTEST_HEADERS} ${ASAN_BLACKLIST_FILE}
169      DEPS gtest asan
170      KIND ${TEST_KIND}
171      ${ARGN}
172      )
173    set("${test_objects}" "${${test_objects}}" PARENT_SCOPE)
174  endfunction()
175
176  set(ASAN_INST_TEST_OBJECTS)
177  generate_asan_tests(ASAN_INST_TEST_OBJECTS AsanUnitTests
178    "Asan-${arch}${TEST_KIND}-Test"
179    SUBDIR "default"
180    LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}
181    SOURCES ${ASAN_INST_TEST_SOURCES}
182    CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${TEST_CFLAGS})
183
184  if(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME)
185    set(dynamic_test_name "Asan-${arch}${TEST_KIND}-Dynamic-Test")
186    if(MSVC)
187
188      # With the MSVC CRT, the choice between static and dynamic CRT is made at
189      # compile time with a macro. Simulate the effect of passing /MD to clang-cl.
190      set(ASAN_DYNAMIC_TEST_OBJECTS)
191      generate_asan_tests(ASAN_DYNAMIC_TEST_OBJECTS
192        AsanDynamicUnitTests "${dynamic_test_name}"
193        SUBDIR "dynamic"
194        CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} -D_MT -D_DLL
195        SOURCES ${ASAN_INST_TEST_SOURCES}
196        LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS}
197          -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames
198        )
199    else()
200
201      # Otherwise, reuse ASAN_INST_TEST_OBJECTS.
202      add_compiler_rt_test(AsanDynamicUnitTests "${dynamic_test_name}" "${arch}"
203        SUBDIR "dynamic"
204        OBJECTS ${ASAN_INST_TEST_OBJECTS}
205        DEPS asan ${ASAN_INST_TEST_OBJECTS}
206        LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS}
207        )
208    endif()
209  endif()
210
211  # Uninstrumented tests.
212  set(ASAN_NOINST_TEST_OBJECTS)
213  generate_asan_tests(ASAN_NOINST_TEST_OBJECTS
214    AsanUnitTests "Asan-${arch}${TEST_KIND}-Noinst-Test"
215    SUBDIR "default"
216    CFLAGS ${ASAN_UNITTEST_COMMON_CFLAGS}
217    LINK_FLAGS ${ASAN_UNITTEST_NOINST_LINK_FLAGS}
218    SOURCES ${ASAN_NOINST_TEST_SOURCES}
219    RUNTIME ${test_runtime})
220
221  set(ASAN_BENCHMARK_OBJECTS)
222  generate_asan_tests(ASAN_BENCHMARK_OBJECTS
223    AsanBenchmarks "Asan-${arch}${TEST_KIND}-Benchmark"
224    SUBDIR "default"
225    CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}
226    SOURCES ${ASAN_BENCHMARKS_SOURCES}
227    LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS})
228endfunction()
229
230if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID)
231  set(ASAN_TEST_ARCH ${ASAN_SUPPORTED_ARCH})
232  if(APPLE)
233    darwin_filter_host_archs(ASAN_SUPPORTED_ARCH ASAN_TEST_ARCH)
234  endif()
235  if(OS_NAME MATCHES "SunOS")
236    list(REMOVE_ITEM ASAN_TEST_ARCH x86_64)
237  endif()
238
239  foreach(arch ${ASAN_TEST_ARCH})
240
241    # Add static ASan runtime that will be linked with uninstrumented tests.
242    set(ASAN_TEST_RUNTIME RTAsanTest.${arch})
243    if(APPLE)
244      set(ASAN_TEST_RUNTIME_OBJECTS
245        $<TARGET_OBJECTS:RTAsan_dynamic.osx>
246        $<TARGET_OBJECTS:RTInterception.osx>
247        $<TARGET_OBJECTS:RTSanitizerCommon.osx>
248        $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>
249        $<TARGET_OBJECTS:RTSanitizerCommonCoverage.osx>
250        $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.osx>
251        $<TARGET_OBJECTS:RTLSanCommon.osx>
252        $<TARGET_OBJECTS:RTUbsan.osx>)
253    else()
254      set(ASAN_TEST_RUNTIME_OBJECTS
255        $<TARGET_OBJECTS:RTAsan.${arch}>
256        $<TARGET_OBJECTS:RTAsan_cxx.${arch}>
257        $<TARGET_OBJECTS:RTInterception.${arch}>
258        $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
259        $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
260        $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
261        $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
262        $<TARGET_OBJECTS:RTLSanCommon.${arch}>
263        $<TARGET_OBJECTS:RTUbsan.${arch}>
264        $<TARGET_OBJECTS:RTUbsan_cxx.${arch}>)
265    endif()
266    add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS})
267    set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES
268      ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
269      FOLDER "Compiler-RT Runtime tests")
270
271    add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-inline")
272    add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-calls"
273      CFLAGS -mllvm -asan-instrumentation-with-call-threshold=0)
274  endforeach()
275endif()
276
277if(ANDROID)
278  foreach(arch ${ASAN_SUPPORTED_ARCH})
279    # Test w/o ASan instrumentation. Link it with ASan statically.
280    add_executable(AsanNoinstTest # FIXME: .arch?
281      $<TARGET_OBJECTS:RTAsan.${arch}>
282      $<TARGET_OBJECTS:RTInterception.${arch}>
283      $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
284      $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
285      $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
286      $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
287      $<TARGET_OBJECTS:RTUbsan.${arch}>
288      $<TARGET_OBJECTS:RTUbsan_cxx.${arch}>
289      ${COMPILER_RT_GTEST_SOURCE}
290      ${ASAN_NOINST_TEST_SOURCES})
291    set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS})
292    set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINK_FLAGS})
293    target_link_libraries(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LIBS})
294
295    # Test with ASan instrumentation. Link with ASan dynamic runtime.
296    add_executable(AsanTest
297      ${COMPILER_RT_GTEST_SOURCE}
298      ${ASAN_INST_TEST_SOURCES})
299    set_target_compile_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS})
300    set_target_link_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS})
301    target_link_libraries(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LIBS})
302
303    # Setup correct output directory and link flags.
304    set_target_properties(AsanNoinstTest AsanTest PROPERTIES
305      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
306    # Add unit tests to the test suite.
307    add_dependencies(AsanUnitTests AsanNoinstTest AsanTest)
308  endforeach()
309endif()
310