| include_directories(../rtl) |
| |
| add_custom_target(TsanUnitTests) |
| set_target_properties(TsanUnitTests PROPERTIES |
| FOLDER "TSan unittests") |
| |
| set(TSAN_UNITTEST_CFLAGS |
| ${TSAN_CFLAGS} |
| ${COMPILER_RT_UNITTEST_CFLAGS} |
| ${COMPILER_RT_GTEST_CFLAGS} |
| -I${COMPILER_RT_SOURCE_DIR}/lib |
| -I${COMPILER_RT_SOURCE_DIR}/lib/tsan/rtl |
| -DGTEST_HAS_RTTI=0) |
| |
| set(TSAN_RTL_HEADERS) |
| foreach (header ${TSAN_HEADERS}) |
| list(APPEND TSAN_RTL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) |
| endforeach() |
| |
| # tsan_compile(obj_list, source, arch, {headers}) |
| macro(tsan_compile obj_list source arch) |
| get_filename_component(basename ${source} NAME) |
| set(output_obj "${basename}.${arch}.o") |
| get_target_flags_for_arch(${arch} TARGET_CFLAGS) |
| set(COMPILE_DEPS ${TSAN_RTL_HEADERS} ${ARGN}) |
| if(NOT COMPILER_RT_STANDALONE_BUILD) |
| list(APPEND COMPILE_DEPS gtest tsan) |
| endif() |
| clang_compile(${output_obj} ${source} |
| CFLAGS ${TSAN_UNITTEST_CFLAGS} ${TARGET_CFLAGS} |
| DEPS ${COMPILE_DEPS}) |
| list(APPEND ${obj_list} ${output_obj}) |
| endmacro() |
| |
| macro(add_tsan_unittest testname) |
| set(TSAN_TEST_ARCH ${TSAN_SUPPORTED_ARCH}) |
| if(APPLE) |
| darwin_filter_host_archs(TSAN_SUPPORTED_ARCH TSAN_TEST_ARCH) |
| endif() |
| if(UNIX) |
| foreach(arch ${TSAN_TEST_ARCH}) |
| cmake_parse_arguments(TEST "" "" "SOURCES;HEADERS" ${ARGN}) |
| set(TEST_OBJECTS) |
| foreach(SOURCE ${TEST_SOURCES} ${COMPILER_RT_GTEST_SOURCE}) |
| tsan_compile(TEST_OBJECTS ${SOURCE} ${arch} ${TEST_HEADERS}) |
| endforeach() |
| get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS) |
| set(TEST_DEPS ${TEST_OBJECTS}) |
| if(NOT COMPILER_RT_STANDALONE_BUILD) |
| list(APPEND TEST_DEPS tsan) |
| endif() |
| if(NOT APPLE) |
| # FIXME: Looks like we should link TSan with just-built runtime, |
| # and not rely on -fsanitize=thread, as these tests are essentially |
| # unit tests. |
| add_compiler_rt_test(TsanUnitTests ${testname} |
| OBJECTS ${TEST_OBJECTS} |
| DEPS ${TEST_DEPS} |
| LINK_FLAGS ${TARGET_LINK_FLAGS} |
| -fsanitize=thread |
| -lstdc++ -lm) |
| else() |
| set(TSAN_TEST_RUNTIME_OBJECTS |
| $<TARGET_OBJECTS:RTTsan_dynamic.osx> |
| $<TARGET_OBJECTS:RTInterception.osx> |
| $<TARGET_OBJECTS:RTSanitizerCommon.osx> |
| $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx> |
| $<TARGET_OBJECTS:RTUbsan.osx>) |
| set(TSAN_TEST_RUNTIME RTTsanTest.${testname}.${arch}) |
| add_library(${TSAN_TEST_RUNTIME} STATIC ${TSAN_TEST_RUNTIME_OBJECTS}) |
| set_target_properties(${TSAN_TEST_RUNTIME} PROPERTIES |
| ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) |
| list(APPEND TEST_OBJECTS lib${TSAN_TEST_RUNTIME}.a) |
| list(APPEND TEST_DEPS ${TSAN_TEST_RUNTIME}) |
| # Intentionally do *not* link with `-fsanitize=thread`. We already link |
| # against a static version of the runtime, and we don't want the dynamic |
| # one. |
| add_compiler_rt_test(TsanUnitTests "${testname}-${arch}-Test" |
| OBJECTS ${TEST_OBJECTS} |
| DEPS ${TEST_DEPS} |
| LINK_FLAGS ${TARGET_LINK_FLAGS} |
| -lc++) |
| endif() |
| endforeach() |
| endif() |
| endmacro() |
| |
| if(COMPILER_RT_CAN_EXECUTE_TESTS) |
| add_subdirectory(rtl) |
| add_subdirectory(unit) |
| endif() |