1 include_directories(../rtl) 2 3 add_custom_target(TsanUnitTests) 4 set_target_properties(TsanUnitTests PROPERTIES 5 FOLDER "TSan unittests") 6 7 set(TSAN_UNITTEST_CFLAGS 8 ${TSAN_CFLAGS} 9 ${COMPILER_RT_GTEST_CFLAGS} 10 -I${COMPILER_RT_SOURCE_DIR}/lib 11 -I${COMPILER_RT_SOURCE_DIR}/lib/tsan/rtl 12 -DGTEST_HAS_RTTI=0) 13 14 set(TSAN_RTL_HEADERS) 15 foreach (header ${TSAN_HEADERS}) 16 list(APPEND TSAN_RTL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) 17 endforeach() 18 19 # tsan_compile(obj_list, source, arch, {headers}) 20 macro(tsan_compile obj_list source arch) 21 get_filename_component(basename ${source} NAME) 22 set(output_obj "${basename}.${arch}.o") 23 get_target_flags_for_arch(${arch} TARGET_CFLAGS) 24 set(COMPILE_DEPS ${TSAN_RTL_HEADERS} ${ARGN}) 25 if(NOT COMPILER_RT_STANDALONE_BUILD) 26 list(APPEND COMPILE_DEPS gtest tsan) 27 endif() 28 clang_compile(${output_obj} ${source} 29 CFLAGS ${TSAN_UNITTEST_CFLAGS} ${TARGET_CFLAGS} 30 DEPS ${COMPILE_DEPS}) 31 list(APPEND ${obj_list} ${output_obj}) 32 endmacro() 33 34 macro(add_tsan_unittest testname) 35 # Build unit tests only for 64-bit Linux. 36 if(UNIX AND NOT APPLE AND CAN_TARGET_x86_64) 37 parse_arguments(TEST "SOURCES;HEADERS" "" ${ARGN}) 38 set(TEST_OBJECTS) 39 foreach(SOURCE ${TEST_SOURCES} ${COMPILER_RT_GTEST_SOURCE}) 40 tsan_compile(TEST_OBJECTS ${SOURCE} x86_64 ${TEST_HEADERS}) 41 endforeach() 42 get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS) 43 set(TEST_DEPS ${TEST_OBJECTS}) 44 if(NOT COMPILER_RT_STANDALONE_BUILD) 45 list(APPEND TEST_DEPS tsan) 46 endif() 47 # FIXME: Looks like we should link TSan with just-built runtime, 48 # and not rely on -fsanitize=thread, as these tests are essentially 49 # unit tests. 50 add_compiler_rt_test(TsanUnitTests ${testname} 51 OBJECTS ${TEST_OBJECTS} 52 DEPS ${TEST_DEPS} 53 LINK_FLAGS ${TARGET_LINK_FLAGS} 54 -fsanitize=thread 55 -lstdc++ -lm) 56 endif() 57 endmacro() 58 59 if(COMPILER_RT_CAN_EXECUTE_TESTS) 60 add_subdirectory(rtl) 61 add_subdirectory(unit) 62 endif() 63