blob: 18b76369a675f4113764ea3f92a6c2d28249269b [file] [log] [blame]
Alexey Samsonov0414b252012-12-20 13:24:21 +00001include(CompilerRTCompile)
Alexey Samsonov0414b252012-12-20 13:24:21 +00002
Stephen Hines6d186232014-11-26 17:56:19 -08003clang_compiler_add_cxx_check()
4
Stephen Hines86277eb2015-03-23 12:06:32 -07005# FIXME: use SANITIZER_COMMON_SUPPORTED_ARCH here
6filter_available_targets(SANITIZER_UNITTEST_SUPPORTED_ARCH x86_64 i386 mips64 mips64el)
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -08007if(APPLE)
8 darwin_filter_host_archs(SANITIZER_UNITTEST_SUPPORTED_ARCH SANITIZER_COMMON_SUPPORTED_ARCH)
9endif()
Stephen Hines86277eb2015-03-23 12:06:32 -070010
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000011set(SANITIZER_UNITTESTS
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000012 sanitizer_allocator_test.cc
Alexey Samsonovd264ca02013-03-25 08:48:16 +000013 sanitizer_atomic_test.cc
Stephen Hines2d1fdb22014-05-28 23:58:16 -070014 sanitizer_bitvector_test.cc
15 sanitizer_bvgraph_test.cc
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000016 sanitizer_common_test.cc
Stephen Hines2d1fdb22014-05-28 23:58:16 -070017 sanitizer_deadlock_detector_test.cc
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000018 sanitizer_flags_test.cc
Stephen Hines2d1fdb22014-05-28 23:58:16 -070019 sanitizer_format_interceptor_test.cc
Evgeniy Stepanov4612aba2013-06-20 09:19:28 +000020 sanitizer_ioctl_test.cc
Alexander Potapenko341588a2012-10-26 13:24:20 +000021 sanitizer_libc_test.cc
Kostya Serebryany6fb47af2013-02-27 11:22:40 +000022 sanitizer_linux_test.cc
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000023 sanitizer_list_test.cc
Dmitry Vyukovf4f51f22013-01-14 07:51:39 +000024 sanitizer_mutex_test.cc
Peter Collingbournecc8ed302013-05-28 12:37:34 +000025 sanitizer_nolibc_test.cc
Sergey Matveev70db33e2013-10-11 14:19:14 +000026 sanitizer_posix_test.cc
Alexey Samsonova5176412012-11-02 12:36:11 +000027 sanitizer_printf_test.cc
Stephen Hines2d1fdb22014-05-28 23:58:16 -070028 sanitizer_procmaps_test.cc
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000029 sanitizer_stackdepot_test.cc
Stephen Hines6d186232014-11-26 17:56:19 -080030 sanitizer_stacktrace_printer_test.cc
Reid Kleckner0b487c02013-02-22 15:10:16 +000031 sanitizer_stacktrace_test.cc
Alexander Potapenko3614c162013-03-15 14:37:21 +000032 sanitizer_stoptheworld_test.cc
Sergey Matveeva52e5c62013-06-26 15:37:14 +000033 sanitizer_suppressions_test.cc
Pirama Arumuga Nainar7c915052015-04-08 08:58:29 -070034 sanitizer_symbolizer_test.cc
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000035 sanitizer_test_main.cc
Alexey Samsonov7bb2f9b2013-09-16 15:43:23 +000036 sanitizer_thread_registry_test.cc)
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000037
Alexey Samsonov7bb2f9b2013-09-16 15:43:23 +000038set(SANITIZER_TEST_HEADERS
Stephen Hines2d1fdb22014-05-28 23:58:16 -070039 sanitizer_pthread_wrappers.h
40 sanitizer_test_config.h
Alexey Samsonov7bb2f9b2013-09-16 15:43:23 +000041 sanitizer_test_utils.h)
Alexey Samsonov032e8332012-12-21 14:04:52 +000042foreach(header ${SANITIZER_HEADERS})
43 list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header})
44endforeach()
45
Alexey Samsonov6ef35e12013-03-15 10:39:26 +000046set(SANITIZER_TEST_CFLAGS_COMMON
Stephen Hines6a211c52014-07-21 00:49:56 -070047 ${COMPILER_RT_TEST_CFLAGS}
Stephen Hines2d1fdb22014-05-28 23:58:16 -070048 ${COMPILER_RT_GTEST_CFLAGS}
Alexey Samsonov6ef35e12013-03-15 10:39:26 +000049 -I${COMPILER_RT_SOURCE_DIR}/include
50 -I${COMPILER_RT_SOURCE_DIR}/lib
51 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common
Stephen Hines6a211c52014-07-21 00:49:56 -070052 -fno-rtti
Stephen Hines2d1fdb22014-05-28 23:58:16 -070053 -O2
54 -Werror=sign-compare
55 -Wno-non-virtual-dtor)
Alexey Samsonov6ef35e12013-03-15 10:39:26 +000056
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070057if(MSVC)
58 # Disable exceptions on Windows until they work reliably.
59 list(APPEND SANITIZER_TEST_CFLAGS_COMMON -fno-exceptions -DGTEST_HAS_SEH=0)
60endif()
61
Stephen Hines6a211c52014-07-21 00:49:56 -070062# -gline-tables-only must be enough for these tests, so use it if possible.
63if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070064 list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gline-tables-only)
Stephen Hines6a211c52014-07-21 00:49:56 -070065else()
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070066 list(APPEND SANITIZER_TEST_CFLAGS_COMMON -g)
Stephen Hines2d1fdb22014-05-28 23:58:16 -070067endif()
68
69if(NOT MSVC)
70 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON --driver-mode=g++)
71endif()
72
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080073if(ANDROID)
74 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON -pie)
75endif()
76
Stephen Hines6d186232014-11-26 17:56:19 -080077set(SANITIZER_TEST_LINK_LIBS)
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080078append_list_if(COMPILER_RT_HAS_LIBLOG log SANITIZER_TEST_LINK_LIBS)
Stephen Hines6d186232014-11-26 17:56:19 -080079# NDK r10 requires -latomic almost always.
80append_list_if(ANDROID atomic SANITIZER_TEST_LINK_LIBS)
81
82append_list_if(COMPILER_RT_HAS_LIBDL -ldl SANITIZER_TEST_LINK_FLAGS_COMMON)
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070083append_list_if(COMPILER_RT_HAS_LIBRT -lrt SANITIZER_TEST_LINK_FLAGS_COMMON)
Stephen Hines6d186232014-11-26 17:56:19 -080084append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SANITIZER_TEST_LINK_FLAGS_COMMON)
Stephen Hines6a211c52014-07-21 00:49:56 -070085# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also,
86# 'libm' shall be specified explicitly to build i386 tests.
Stephen Hines2d1fdb22014-05-28 23:58:16 -070087if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")
Stephen Hines6a211c52014-07-21 00:49:56 -070088 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON "-lc++ -lm")
Stephen Hines2d1fdb22014-05-28 23:58:16 -070089endif()
Alexey Samsonov6ef35e12013-03-15 10:39:26 +000090
Alexey Samsonov3f3ca962012-09-11 10:50:32 +000091include_directories(..)
92include_directories(../..)
93
Alexey Samsonovf85c06c2012-12-20 14:38:02 +000094# Adds static library which contains sanitizer_common object file
95# (universal binary on Mac and arch-specific object files on Linux).
96macro(add_sanitizer_common_lib library)
97 add_library(${library} STATIC ${ARGN})
98 set_target_properties(${library} PROPERTIES
99 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000100endmacro()
101
Alexey Samsonov32b89912012-12-21 08:56:14 +0000102function(get_sanitizer_common_lib_for_arch arch lib lib_name)
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000103 if(APPLE)
Alexey Samsonov32b89912012-12-21 08:56:14 +0000104 set(tgt_name "RTSanitizerCommon.test.osx")
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000105 else()
Alexey Samsonov32b89912012-12-21 08:56:14 +0000106 set(tgt_name "RTSanitizerCommon.test.${arch}")
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000107 endif()
Alexey Samsonov32b89912012-12-21 08:56:14 +0000108 set(${lib} "${tgt_name}" PARENT_SCOPE)
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700109 if(NOT MSVC)
110 set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE)
111 else()
112 set(${lib_name} "${tgt_name}.lib" PARENT_SCOPE)
113 endif()
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000114endfunction()
115
Alexey Samsonov0414b252012-12-20 13:24:21 +0000116# Sanitizer_common unit tests testsuite.
Alexey Samsonov3f3ca962012-09-11 10:50:32 +0000117add_custom_target(SanitizerUnitTests)
118set_target_properties(SanitizerUnitTests PROPERTIES
119 FOLDER "Sanitizer unittests")
Alexey Samsonov0414b252012-12-20 13:24:21 +0000120
121# Adds sanitizer tests for architecture.
122macro(add_sanitizer_tests_for_arch arch)
123 get_target_flags_for_arch(${arch} TARGET_FLAGS)
124 set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS}
125 ${COMPILER_RT_GTEST_SOURCE})
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700126 set(SANITIZER_TEST_COMPILE_DEPS ${SANITIZER_TEST_HEADERS})
127 if(NOT COMPILER_RT_STANDALONE_BUILD)
128 list(APPEND SANITIZER_TEST_COMPILE_DEPS gtest)
129 endif()
Alexey Samsonov0414b252012-12-20 13:24:21 +0000130 set(SANITIZER_TEST_OBJECTS)
131 foreach(source ${SANITIZER_TEST_SOURCES})
132 get_filename_component(basename ${source} NAME)
133 set(output_obj "${basename}.${arch}.o")
134 clang_compile(${output_obj} ${source}
Alexey Samsonov6ef35e12013-03-15 10:39:26 +0000135 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700136 DEPS ${SANITIZER_TEST_COMPILE_DEPS})
Alexey Samsonov0414b252012-12-20 13:24:21 +0000137 list(APPEND SANITIZER_TEST_OBJECTS ${output_obj})
138 endforeach()
Alexey Samsonov32b89912012-12-21 08:56:14 +0000139 get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB
140 SANITIZER_COMMON_LIB_NAME)
Alexey Samsonov0414b252012-12-20 13:24:21 +0000141 # Add unittest target.
142 set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test")
143 add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME}
144 OBJECTS ${SANITIZER_TEST_OBJECTS}
145 ${SANITIZER_COMMON_LIB_NAME}
Alexey Samsonov32b89912012-12-21 08:56:14 +0000146 DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB}
Alexey Samsonov6ef35e12013-03-15 10:39:26 +0000147 LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON}
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700148 ${TARGET_FLAGS})
Peter Collingbournecc8ed302013-05-28 12:37:34 +0000149
150 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64")
151 # Test that the libc-independent part of sanitizer_common is indeed
152 # independent of libc, by linking this binary without libc (here) and
153 # executing it (unit test in sanitizer_nolibc_test.cc).
154 clang_compile(sanitizer_nolibc_test_main.${arch}.o
155 sanitizer_nolibc_test_main.cc
156 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700157 DEPS ${SANITIZER_TEST_COMPILE_DEPS})
Peter Collingbournecc8ed302013-05-28 12:37:34 +0000158 add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc"
159 OBJECTS sanitizer_nolibc_test_main.${arch}.o
160 -Wl,-whole-archive
161 libRTSanitizerCommon.test.nolibc.${arch}.a
162 -Wl,-no-whole-archive
163 DEPS sanitizer_nolibc_test_main.${arch}.o
164 RTSanitizerCommon.test.nolibc.${arch}
165 LINK_FLAGS -nostdlib ${TARGET_FLAGS})
166 endif()
Alexey Samsonov0414b252012-12-20 13:24:21 +0000167endmacro()
168
Stephen Hines6d186232014-11-26 17:56:19 -0800169if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID)
Alexey Samsonovd7d7b5f2012-12-27 13:19:23 +0000170 # We use just-built clang to build sanitizer_common unittests, so we must
171 # be sure that produced binaries would work.
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000172 if(APPLE)
173 add_sanitizer_common_lib("RTSanitizerCommon.test.osx"
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800174 $<TARGET_OBJECTS:RTSanitizerCommon.osx>
175 $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>)
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000176 else()
Alexey Samsonov2f3aef02013-01-18 12:45:44 +0000177 if(CAN_TARGET_x86_64)
Peter Collingbournecc8ed302013-05-28 12:37:34 +0000178 add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64"
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800179 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>
180 $<TARGET_OBJECTS:RTSanitizerCommonNoLibc.x86_64>)
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000181 endif()
Stephen Hines86277eb2015-03-23 12:06:32 -0700182 foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH})
183 add_sanitizer_common_lib("RTSanitizerCommon.test.${arch}"
184 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
185 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>)
186 endforeach()
Alexey Samsonovf85c06c2012-12-20 14:38:02 +0000187 endif()
Stephen Hines86277eb2015-03-23 12:06:32 -0700188 foreach(arch ${SANITIZER_UNITTEST_SUPPORTED_ARCH})
189 add_sanitizer_tests_for_arch(${arch})
190 endforeach()
Alexey Samsonov0414b252012-12-20 13:24:21 +0000191endif()
Evgeniy Stepanov539f5e72013-01-14 14:08:25 +0000192
193if(ANDROID)
Stephen Hines6d186232014-11-26 17:56:19 -0800194 foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH})
195 add_executable(SanitizerTest
196 ${SANITIZER_UNITTESTS}
197 ${COMPILER_RT_GTEST_SOURCE}
198 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
199 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>)
200 set_target_compile_flags(SanitizerTest
201 ${SANITIZER_COMMON_CFLAGS}
202 ${SANITIZER_TEST_CFLAGS_COMMON})
203 # Setup correct output directory and link flags.
204 set_target_properties(SanitizerTest PROPERTIES
205 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
206 set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON})
207 target_link_libraries(SanitizerTest ${SANITIZER_TEST_LINK_LIBS})
208 # Add unit test to test suite.
209 add_dependencies(SanitizerUnitTests SanitizerTest)
210 endforeach()
Evgeniy Stepanov539f5e72013-01-14 14:08:25 +0000211endif()