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