CMakeLists.txt revision 851e22ad83fe5f389ca845731fe0abf749a86214
1include(CompilerRTCompile) 2 3set(SANITIZER_UNITTESTS 4 sanitizer_allocator_test.cc 5 sanitizer_atomic_test.cc 6 sanitizer_common_test.cc 7 sanitizer_flags_test.cc 8 sanitizer_ioctl_test.cc 9 sanitizer_libc_test.cc 10 sanitizer_linux_test.cc 11 sanitizer_list_test.cc 12 sanitizer_mutex_test.cc 13 sanitizer_nolibc_test.cc 14 sanitizer_printf_test.cc 15 sanitizer_scanf_interceptor_test.cc 16 sanitizer_stackdepot_test.cc 17 sanitizer_stacktrace_test.cc 18 sanitizer_stoptheworld_test.cc 19 sanitizer_test_main.cc 20 sanitizer_thread_registry_test.cc 21 ) 22 23set(SANITIZER_TEST_HEADERS) 24foreach(header ${SANITIZER_HEADERS}) 25 list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 26endforeach() 27 28set(SANITIZER_TEST_CFLAGS_COMMON 29 ${COMPILER_RT_GTEST_INCLUDE_CFLAGS} 30 -I${COMPILER_RT_SOURCE_DIR}/include 31 -I${COMPILER_RT_SOURCE_DIR}/lib 32 -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common 33 -DGTEST_HAS_RTTI=0 34 -O2 -g -fno-rtti 35 -Wall -Werror -Werror=sign-compare) 36 37set(SANITIZER_TEST_LINK_FLAGS_COMMON 38 -lstdc++ -ldl) 39 40include_directories(..) 41include_directories(../..) 42 43# Adds static library which contains sanitizer_common object file 44# (universal binary on Mac and arch-specific object files on Linux). 45macro(add_sanitizer_common_lib library) 46 add_library(${library} STATIC ${ARGN}) 47 set_target_properties(${library} PROPERTIES 48 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 49endmacro() 50 51function(get_sanitizer_common_lib_for_arch arch lib lib_name) 52 if(APPLE) 53 set(tgt_name "RTSanitizerCommon.test.osx") 54 else() 55 set(tgt_name "RTSanitizerCommon.test.${arch}") 56 endif() 57 set(${lib} "${tgt_name}" PARENT_SCOPE) 58 set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE) 59endfunction() 60 61# Sanitizer_common unit tests testsuite. 62add_custom_target(SanitizerUnitTests) 63set_target_properties(SanitizerUnitTests PROPERTIES 64 FOLDER "Sanitizer unittests") 65 66# Adds sanitizer tests for architecture. 67macro(add_sanitizer_tests_for_arch arch) 68 get_target_flags_for_arch(${arch} TARGET_FLAGS) 69 set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS} 70 ${COMPILER_RT_GTEST_SOURCE}) 71 set(SANITIZER_TEST_OBJECTS) 72 foreach(source ${SANITIZER_TEST_SOURCES}) 73 get_filename_component(basename ${source} NAME) 74 set(output_obj "${basename}.${arch}.o") 75 clang_compile(${output_obj} ${source} 76 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} 77 DEPS gtest ${SANITIZER_RUNTIME_LIBRARIES} 78 ${SANITIZER_TEST_HEADERS}) 79 list(APPEND SANITIZER_TEST_OBJECTS ${output_obj}) 80 endforeach() 81 get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB 82 SANITIZER_COMMON_LIB_NAME) 83 # Add unittest target. 84 set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test") 85 add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME} 86 OBJECTS ${SANITIZER_TEST_OBJECTS} 87 ${SANITIZER_COMMON_LIB_NAME} 88 DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} 89 LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON} 90 -lpthread ${TARGET_FLAGS}) 91 92 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64") 93 # Test that the libc-independent part of sanitizer_common is indeed 94 # independent of libc, by linking this binary without libc (here) and 95 # executing it (unit test in sanitizer_nolibc_test.cc). 96 clang_compile(sanitizer_nolibc_test_main.${arch}.o 97 sanitizer_nolibc_test_main.cc 98 CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} 99 DEPS ${SANITIZER_RUNTIME_LIBRARIES} ${SANITIZER_TEST_HEADERS}) 100 add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc" 101 OBJECTS sanitizer_nolibc_test_main.${arch}.o 102 -Wl,-whole-archive 103 libRTSanitizerCommon.test.nolibc.${arch}.a 104 -Wl,-no-whole-archive 105 DEPS sanitizer_nolibc_test_main.${arch}.o 106 RTSanitizerCommon.test.nolibc.${arch} 107 LINK_FLAGS -nostdlib ${TARGET_FLAGS}) 108 endif() 109endmacro() 110 111if(COMPILER_RT_CAN_EXECUTE_TESTS) 112 # We use just-built clang to build sanitizer_common unittests, so we must 113 # be sure that produced binaries would work. 114 if(APPLE) 115 add_sanitizer_common_lib("RTSanitizerCommon.test.osx" 116 $<TARGET_OBJECTS:RTSanitizerCommon.osx>) 117 else() 118 if(CAN_TARGET_x86_64) 119 add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64" 120 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64> 121 $<TARGET_OBJECTS:RTSanitizerCommonLibc.x86_64>) 122 add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64" 123 $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>) 124 endif() 125 if(CAN_TARGET_i386) 126 add_sanitizer_common_lib("RTSanitizerCommon.test.i386" 127 $<TARGET_OBJECTS:RTSanitizerCommon.i386> 128 $<TARGET_OBJECTS:RTSanitizerCommonLibc.i386>) 129 endif() 130 endif() 131 if(CAN_TARGET_x86_64) 132 add_sanitizer_tests_for_arch(x86_64) 133 endif() 134 if(CAN_TARGET_i386) 135 add_sanitizer_tests_for_arch(i386) 136 endif() 137 138 # Run unittests as a part of lit testsuite. 139 configure_lit_site_cfg( 140 ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in 141 ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg 142 ) 143 144 add_lit_testsuite(check-sanitizer "Running sanitizer library unittests" 145 ${CMAKE_CURRENT_BINARY_DIR} 146 DEPENDS SanitizerUnitTests 147 ) 148 set_target_properties(check-sanitizer PROPERTIES FOLDER "Sanitizer unittests") 149endif() 150 151if(ANDROID) 152 # We assume that unit tests on Android are built in a build 153 # tree with fresh Clang as a host compiler. 154 add_executable(SanitizerTest 155 ${SANITIZER_UNITTESTS} 156 ${COMPILER_RT_GTEST_SOURCE} 157 $<TARGET_OBJECTS:RTSanitizerCommon.arm.android>) 158 set_target_compile_flags(SanitizerTest 159 ${SANITIZER_COMMON_CFLAGS} 160 ${SANITIZER_TEST_CFLAGS_COMMON}) 161 # Setup correct output directory and link flags. 162 set_target_properties(SanitizerTest PROPERTIES 163 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 164 set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) 165 # Add unit test to test suite. 166 add_dependencies(SanitizerUnitTests SanitizerTest) 167endif() 168