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