1include_directories(../rtl) 2 3add_custom_target(TsanUnitTests) 4set_target_properties(TsanUnitTests PROPERTIES 5 FOLDER "Compiler-RT Tests") 6 7set(TSAN_UNITTEST_CFLAGS 8 ${COMPILER_RT_UNITTEST_CFLAGS} 9 ${COMPILER_RT_GTEST_CFLAGS} 10 ${SANITIZER_TEST_CXX_CFLAGS} 11 -I${COMPILER_RT_SOURCE_DIR}/include 12 -I${COMPILER_RT_SOURCE_DIR}/lib 13 -I${COMPILER_RT_SOURCE_DIR}/lib/tsan/rtl 14 -DGTEST_HAS_RTTI=0 15 -fno-rtti 16) 17 18if(COMPILER_RT_TSAN_DEBUG_OUTPUT) 19 # Need to match these flags with the runtime. 20 list(APPEND TSAN_UNITTEST_CFLAGS -DTSAN_COLLECT_STATS=1 21 -DTSAN_DEBUG_OUTPUT=2) 22endif() 23 24append_list_if(COMPILER_RT_HAS_MSSE4_2_FLAG -msse4.2 TSAN_UNITTEST_CFLAGS) 25 26set(TSAN_TEST_ARCH ${TSAN_SUPPORTED_ARCH}) 27 28set(TSAN_UNITTEST_LINK_FLAGS 29 ${COMPILER_RT_UNITTEST_LINK_FLAGS} 30 ${COMPILER_RT_UNWINDER_LINK_LIBS} 31 ${SANITIZER_TEST_CXX_LIBRARIES}) 32 33if(APPLE) 34 35 # Create a static library for test dependencies. 36 set(TSAN_TEST_RUNTIME_OBJECTS 37 $<TARGET_OBJECTS:RTTsan_dynamic.osx> 38 $<TARGET_OBJECTS:RTInterception.osx> 39 $<TARGET_OBJECTS:RTSanitizerCommon.osx> 40 $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx> 41 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.osx> 42 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.osx> 43 $<TARGET_OBJECTS:RTUbsan.osx>) 44 set(TSAN_TEST_RUNTIME RTTsanTest) 45 add_library(${TSAN_TEST_RUNTIME} STATIC ${TSAN_TEST_RUNTIME_OBJECTS}) 46 set_target_properties(${TSAN_TEST_RUNTIME} PROPERTIES 47 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 48 49 darwin_filter_host_archs(TSAN_SUPPORTED_ARCH TSAN_TEST_ARCH) 50 list(APPEND TSAN_UNITTEST_CFLAGS ${DARWIN_osx_CFLAGS}) 51 52 list(APPEND TSAN_UNITTEST_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS}) 53 add_weak_symbols("ubsan" TSAN_UNITTEST_LINK_FLAGS) 54 add_weak_symbols("sanitizer_common" TSAN_UNITTEST_LINK_FLAGS) 55else() 56 list(APPEND TSAN_UNITTEST_LINK_FLAGS -fsanitize=thread) 57 list(APPEND TSAN_UNITTEST_LINK_FLAGS -lm) 58 list(APPEND TSAN_UNITTEST_LINK_FLAGS ${COMPILER_RT_TEST_LIBDISPATCH_CFLAGS}) 59endif() 60 61set(TSAN_RTL_HEADERS) 62foreach (header ${TSAN_HEADERS}) 63 list(APPEND TSAN_RTL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 64endforeach() 65 66set(TSAN_DEPS llvm_gtest tsan) 67# TSan uses C++ standard library headers. 68if (TARGET cxx-headers OR HAVE_LIBCXX) 69 set(TSAN_DEPS cxx-headers) 70endif() 71 72# add_tsan_unittest(<name> 73# SOURCES <sources list> 74# HEADERS <extra headers list>) 75macro(add_tsan_unittest testname) 76 cmake_parse_arguments(TEST "" "" "SOURCES;HEADERS" ${ARGN}) 77 if(UNIX) 78 foreach(arch ${TSAN_TEST_ARCH}) 79 set(TsanUnitTestsObjects) 80 generate_compiler_rt_tests(TsanUnitTestsObjects TsanUnitTests 81 "${testname}-${arch}-Test" ${arch} 82 SOURCES ${TEST_SOURCES} ${COMPILER_RT_GTEST_SOURCE} 83 RUNTIME ${TSAN_TEST_RUNTIME} 84 COMPILE_DEPS ${TEST_HEADERS} ${TSAN_RTL_HEADERS} 85 DEPS ${TSAN_DEPS} 86 CFLAGS ${TSAN_UNITTEST_CFLAGS} 87 LINK_FLAGS ${TSAN_UNITTEST_LINK_FLAGS}) 88 endforeach() 89 endif() 90endmacro() 91 92if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) 93 add_subdirectory(rtl) 94 add_subdirectory(unit) 95endif() 96