[ASan] Update sanitizer_common and asan test_util headers to support building on...
[blocksruntime.git] / lib / sanitizer_common / tests / CMakeLists.txt
blobf6f435a89d73149ef6a53d3d38223db1517195a5
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})
32 endforeach()
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
39   -DGTEST_HAS_RTTI=0
40   -O2 -g -fno-rtti
41   -Werror=sign-compare
42   -Wno-non-virtual-dtor)
44 set(SANITIZER_TEST_LINK_FLAGS_COMMON
45   -lstdc++)
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++")
51 endif()
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})
62 endmacro()
64 function(get_sanitizer_common_lib_for_arch arch lib lib_name)
65   if(APPLE)
66     set(tgt_name "RTSanitizerCommon.test.osx")
67   else()
68     set(tgt_name "RTSanitizerCommon.test.${arch}")
69   endif()
70   set(${lib} "${tgt_name}" PARENT_SCOPE)
71   set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE)
72 endfunction()
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)
87   endif()
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})
96   endforeach()
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}
106                                   ${TARGET_FLAGS})
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
118                                  -Wl,-whole-archive
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})
124   endif()
125 endmacro()
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.
130   if(APPLE)
131     add_sanitizer_common_lib("RTSanitizerCommon.test.osx"
132                              $<TARGET_OBJECTS:RTSanitizerCommon.osx>)
133   else()
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>)
140     endif()
141     if(CAN_TARGET_i386)
142       add_sanitizer_common_lib("RTSanitizerCommon.test.i386"
143                                $<TARGET_OBJECTS:RTSanitizerCommon.i386>
144                                $<TARGET_OBJECTS:RTSanitizerCommonLibc.i386>)
145     endif()
146   endif()
147   if(CAN_TARGET_x86_64)
148     add_sanitizer_tests_for_arch(x86_64)
149   endif()
150   if(CAN_TARGET_i386)
151     add_sanitizer_tests_for_arch(i386)
152   endif()
153 endif()
155 if(ANDROID)
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)
172 endif()