]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
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} | |
5bcae85e | 9 | ${COMPILER_RT_UNITTEST_CFLAGS} |
1a4d82fc JJ |
10 | ${COMPILER_RT_GTEST_CFLAGS} |
11 | -I${COMPILER_RT_SOURCE_DIR}/lib | |
12 | -I${COMPILER_RT_SOURCE_DIR}/lib/tsan/rtl | |
13 | -DGTEST_HAS_RTTI=0) | |
14 | ||
15 | set(TSAN_RTL_HEADERS) | |
16 | foreach (header ${TSAN_HEADERS}) | |
17 | list(APPEND TSAN_RTL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header}) | |
18 | endforeach() | |
19 | ||
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) | |
25 | set(COMPILE_DEPS ${TSAN_RTL_HEADERS} ${ARGN}) | |
26 | if(NOT COMPILER_RT_STANDALONE_BUILD) | |
27 | list(APPEND COMPILE_DEPS gtest tsan) | |
28 | endif() | |
29 | clang_compile(${output_obj} ${source} | |
30 | CFLAGS ${TSAN_UNITTEST_CFLAGS} ${TARGET_CFLAGS} | |
31 | DEPS ${COMPILE_DEPS}) | |
32 | list(APPEND ${obj_list} ${output_obj}) | |
33 | endmacro() | |
34 | ||
35 | macro(add_tsan_unittest testname) | |
3157f602 XL |
36 | set(TSAN_TEST_ARCH ${TSAN_SUPPORTED_ARCH}) |
37 | if(APPLE) | |
38 | darwin_filter_host_archs(TSAN_SUPPORTED_ARCH TSAN_TEST_ARCH) | |
39 | endif() | |
40 | if(UNIX) | |
41 | foreach(arch ${TSAN_TEST_ARCH}) | |
92a42be0 SL |
42 | cmake_parse_arguments(TEST "" "" "SOURCES;HEADERS" ${ARGN}) |
43 | set(TEST_OBJECTS) | |
44 | foreach(SOURCE ${TEST_SOURCES} ${COMPILER_RT_GTEST_SOURCE}) | |
45 | tsan_compile(TEST_OBJECTS ${SOURCE} ${arch} ${TEST_HEADERS}) | |
46 | endforeach() | |
47 | get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS) | |
48 | set(TEST_DEPS ${TEST_OBJECTS}) | |
49 | if(NOT COMPILER_RT_STANDALONE_BUILD) | |
50 | list(APPEND TEST_DEPS tsan) | |
51 | endif() | |
3157f602 XL |
52 | if(NOT APPLE) |
53 | # FIXME: Looks like we should link TSan with just-built runtime, | |
54 | # and not rely on -fsanitize=thread, as these tests are essentially | |
55 | # unit tests. | |
56 | add_compiler_rt_test(TsanUnitTests ${testname} | |
57 | OBJECTS ${TEST_OBJECTS} | |
58 | DEPS ${TEST_DEPS} | |
59 | LINK_FLAGS ${TARGET_LINK_FLAGS} | |
60 | -fsanitize=thread | |
61 | -lstdc++ -lm) | |
62 | else() | |
63 | set(TSAN_TEST_RUNTIME_OBJECTS | |
64 | $<TARGET_OBJECTS:RTTsan_dynamic.osx> | |
65 | $<TARGET_OBJECTS:RTInterception.osx> | |
66 | $<TARGET_OBJECTS:RTSanitizerCommon.osx> | |
67 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx> | |
68 | $<TARGET_OBJECTS:RTUbsan.osx>) | |
69 | set(TSAN_TEST_RUNTIME RTTsanTest.${testname}.${arch}) | |
70 | add_library(${TSAN_TEST_RUNTIME} STATIC ${TSAN_TEST_RUNTIME_OBJECTS}) | |
71 | set_target_properties(${TSAN_TEST_RUNTIME} PROPERTIES | |
72 | ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) | |
73 | list(APPEND TEST_OBJECTS lib${TSAN_TEST_RUNTIME}.a) | |
74 | list(APPEND TEST_DEPS ${TSAN_TEST_RUNTIME}) | |
75 | # Intentionally do *not* link with `-fsanitize=thread`. We already link | |
76 | # against a static version of the runtime, and we don't want the dynamic | |
77 | # one. | |
78 | add_compiler_rt_test(TsanUnitTests "${testname}-${arch}-Test" | |
79 | OBJECTS ${TEST_OBJECTS} | |
80 | DEPS ${TEST_DEPS} | |
81 | LINK_FLAGS ${TARGET_LINK_FLAGS} | |
82 | -lc++) | |
83 | endif() | |
1a4d82fc | 84 | endforeach() |
1a4d82fc JJ |
85 | endif() |
86 | endmacro() | |
87 | ||
88 | if(COMPILER_RT_CAN_EXECUTE_TESTS) | |
89 | add_subdirectory(rtl) | |
90 | add_subdirectory(unit) | |
91 | endif() |