]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | # Build for the ThreadSanitizer runtime support library. |
2 | ||
3 | include_directories(..) | |
4 | ||
5 | set(TSAN_CFLAGS ${SANITIZER_COMMON_CFLAGS}) | |
6 | # SANITIZER_COMMON_CFLAGS contains -fPIC, but it's performance-critical for | |
7 | # TSan runtime to be built with -fPIE to reduce the number of register spills. | |
92a42be0 | 8 | append_list_if(COMPILER_RT_HAS_FPIE_FLAG -fPIE TSAN_CFLAGS) |
5bcae85e | 9 | append_rtti_flag(OFF TSAN_CFLAGS) |
1a4d82fc | 10 | |
3157f602 XL |
11 | if(COMPILER_RT_TSAN_DEBUG_OUTPUT) |
12 | # Add extra debug information to TSan runtime. This configuration is rarely | |
13 | # used, but we need to support it so that debug output will not bitrot. | |
14 | list(APPEND TSAN_CFLAGS -DTSAN_COLLECT_STATS=1 | |
15 | -DTSAN_DEBUG_OUTPUT=2) | |
16 | endif() | |
17 | ||
1a4d82fc | 18 | set(TSAN_RTL_CFLAGS ${TSAN_CFLAGS}) |
92a42be0 | 19 | append_list_if(COMPILER_RT_HAS_MSSE3_FLAG -msse3 TSAN_RTL_CFLAGS) |
7cac9316 | 20 | append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=530 |
92a42be0 SL |
21 | TSAN_RTL_CFLAGS) |
22 | append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors | |
23 | TSAN_RTL_CFLAGS) | |
1a4d82fc | 24 | |
1a4d82fc JJ |
25 | set(TSAN_SOURCES |
26 | rtl/tsan_clock.cc | |
5bcae85e | 27 | rtl/tsan_debugging.cc |
2c00a5a8 | 28 | rtl/tsan_external.cc |
1a4d82fc | 29 | rtl/tsan_fd.cc |
5bcae85e | 30 | rtl/tsan_flags.cc |
1a4d82fc JJ |
31 | rtl/tsan_ignoreset.cc |
32 | rtl/tsan_interceptors.cc | |
5bcae85e | 33 | rtl/tsan_interface.cc |
1a4d82fc JJ |
34 | rtl/tsan_interface_ann.cc |
35 | rtl/tsan_interface_atomic.cc | |
1a4d82fc | 36 | rtl/tsan_interface_java.cc |
92a42be0 | 37 | rtl/tsan_malloc_mac.cc |
1a4d82fc JJ |
38 | rtl/tsan_md5.cc |
39 | rtl/tsan_mman.cc | |
40 | rtl/tsan_mutex.cc | |
41 | rtl/tsan_mutexset.cc | |
5bcae85e | 42 | rtl/tsan_preinit.cc |
1a4d82fc JJ |
43 | rtl/tsan_report.cc |
44 | rtl/tsan_rtl.cc | |
45 | rtl/tsan_rtl_mutex.cc | |
5bcae85e | 46 | rtl/tsan_rtl_proc.cc |
1a4d82fc JJ |
47 | rtl/tsan_rtl_report.cc |
48 | rtl/tsan_rtl_thread.cc | |
92a42be0 | 49 | rtl/tsan_stack_trace.cc |
1a4d82fc JJ |
50 | rtl/tsan_stat.cc |
51 | rtl/tsan_suppressions.cc | |
52 | rtl/tsan_symbolize.cc | |
53 | rtl/tsan_sync.cc) | |
54 | ||
92a42be0 SL |
55 | set(TSAN_CXX_SOURCES |
56 | rtl/tsan_new_delete.cc) | |
57 | ||
1a4d82fc | 58 | if(APPLE) |
92a42be0 | 59 | list(APPEND TSAN_SOURCES |
3157f602 XL |
60 | rtl/tsan_interceptors_mac.cc |
61 | rtl/tsan_libdispatch_mac.cc | |
92a42be0 SL |
62 | rtl/tsan_platform_mac.cc |
63 | rtl/tsan_platform_posix.cc) | |
1a4d82fc JJ |
64 | elseif(UNIX) |
65 | # Assume Linux | |
66 | list(APPEND TSAN_SOURCES | |
92a42be0 SL |
67 | rtl/tsan_platform_linux.cc |
68 | rtl/tsan_platform_posix.cc) | |
1a4d82fc JJ |
69 | endif() |
70 | ||
71 | set(TSAN_HEADERS | |
72 | rtl/tsan_clock.h | |
73 | rtl/tsan_defs.h | |
92a42be0 | 74 | rtl/tsan_dense_alloc.h |
1a4d82fc JJ |
75 | rtl/tsan_fd.h |
76 | rtl/tsan_flags.h | |
92a42be0 | 77 | rtl/tsan_flags.inc |
1a4d82fc | 78 | rtl/tsan_ignoreset.h |
92a42be0 | 79 | rtl/tsan_interceptors.h |
1a4d82fc JJ |
80 | rtl/tsan_interface_ann.h |
81 | rtl/tsan_interface.h | |
82 | rtl/tsan_interface_inl.h | |
83 | rtl/tsan_interface_java.h | |
84 | rtl/tsan_mman.h | |
85 | rtl/tsan_mutex.h | |
86 | rtl/tsan_mutexset.h | |
87 | rtl/tsan_platform.h | |
88 | rtl/tsan_report.h | |
89 | rtl/tsan_rtl.h | |
92a42be0 | 90 | rtl/tsan_stack_trace.h |
1a4d82fc JJ |
91 | rtl/tsan_stat.h |
92 | rtl/tsan_suppressions.h | |
93 | rtl/tsan_symbolize.h | |
94 | rtl/tsan_sync.h | |
95 | rtl/tsan_trace.h | |
2c00a5a8 | 96 | rtl/tsan_update_shadow_word_inl.h) |
1a4d82fc | 97 | |
92a42be0 | 98 | set(TSAN_RUNTIME_LIBRARIES) |
7cac9316 | 99 | add_compiler_rt_component(tsan) |
92a42be0 SL |
100 | |
101 | if(APPLE) | |
2c00a5a8 XL |
102 | add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_amd64.S rtl/tsan_rtl_aarch64.S) |
103 | ||
104 | set(TSAN_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS}) | |
7cac9316 XL |
105 | |
106 | add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS) | |
107 | add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) | |
108 | ||
92a42be0 SL |
109 | add_compiler_rt_runtime(clang_rt.tsan |
110 | SHARED | |
111 | OS ${TSAN_SUPPORTED_OS} | |
112 | ARCHS ${TSAN_SUPPORTED_ARCH} | |
3157f602 | 113 | SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES} |
92a42be0 SL |
114 | OBJECT_LIBS RTInterception |
115 | RTSanitizerCommon | |
116 | RTSanitizerCommonLibc | |
117 | RTUbsan | |
1a4d82fc | 118 | CFLAGS ${TSAN_RTL_CFLAGS} |
2c00a5a8 XL |
119 | LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} |
120 | LINK_LIBS ${TSAN_LINK_LIBS} | |
92a42be0 | 121 | PARENT_TARGET tsan) |
5bcae85e | 122 | add_compiler_rt_object_libraries(RTTsan_dynamic |
3157f602 XL |
123 | OS ${TSAN_SUPPORTED_OS} |
124 | ARCHS ${TSAN_SUPPORTED_ARCH} | |
125 | SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES} | |
126 | CFLAGS ${TSAN_RTL_CFLAGS}) | |
127 | ||
128 | # Build and check Go runtime. | |
129 | set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/go/buildgo.sh) | |
130 | add_custom_target(GotsanRuntimeCheck | |
131 | COMMAND env "CC=${CMAKE_C_COMPILER} ${OSX_SYSROOT_FLAG}" | |
132 | IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT} | |
133 | DEPENDS tsan ${BUILDGO_SCRIPT} | |
134 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/go | |
135 | COMMENT "Checking TSan Go runtime..." | |
136 | VERBATIM) | |
92a42be0 SL |
137 | else() |
138 | foreach(arch ${TSAN_SUPPORTED_ARCH}) | |
139 | if(arch STREQUAL "x86_64") | |
2c00a5a8 | 140 | add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_amd64.S) |
92a42be0 SL |
141 | # Sanity check for Go runtime. |
142 | set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/go/buildgo.sh) | |
143 | add_custom_target(GotsanRuntimeCheck | |
144 | COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" | |
145 | IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT} | |
146 | DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT} | |
147 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/go | |
148 | COMMENT "Checking TSan Go runtime..." | |
149 | VERBATIM) | |
3157f602 | 150 | elseif(arch STREQUAL "aarch64") |
2c00a5a8 XL |
151 | add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_aarch64.S) |
152 | elseif(arch MATCHES "powerpc64|powerpc64le") | |
153 | add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_ppc64.S) | |
7cac9316 | 154 | elseif(arch MATCHES "mips64|mips64le") |
2c00a5a8 | 155 | add_asm_sources(TSAN_ASM_SOURCES rtl/tsan_rtl_mips64.S) |
92a42be0 SL |
156 | else() |
157 | set(TSAN_ASM_SOURCES) | |
158 | endif() | |
159 | add_compiler_rt_runtime(clang_rt.tsan | |
160 | STATIC | |
161 | ARCHS ${arch} | |
162 | SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES} | |
163 | $<TARGET_OBJECTS:RTInterception.${arch}> | |
164 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> | |
165 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}> | |
166 | $<TARGET_OBJECTS:RTUbsan.${arch}> | |
2c00a5a8 XL |
167 | CFLAGS ${TSAN_RTL_CFLAGS} |
168 | PARENT_TARGET tsan) | |
92a42be0 SL |
169 | add_compiler_rt_runtime(clang_rt.tsan_cxx |
170 | STATIC | |
171 | ARCHS ${arch} | |
172 | SOURCES ${TSAN_CXX_SOURCES} | |
173 | $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> | |
2c00a5a8 XL |
174 | CFLAGS ${TSAN_RTL_CFLAGS} |
175 | PARENT_TARGET tsan) | |
92a42be0 SL |
176 | list(APPEND TSAN_RUNTIME_LIBRARIES clang_rt.tsan-${arch} |
177 | clang_rt.tsan_cxx-${arch}) | |
178 | add_sanitizer_rt_symbols(clang_rt.tsan | |
179 | ARCHS ${arch} | |
180 | EXTRA rtl/tsan.syms.extra) | |
181 | add_sanitizer_rt_symbols(clang_rt.tsan_cxx | |
182 | ARCHS ${arch} | |
183 | EXTRA rtl/tsan.syms.extra) | |
184 | add_dependencies(tsan clang_rt.tsan-${arch} | |
185 | clang_rt.tsan_cxx-${arch} | |
186 | clang_rt.tsan-${arch}-symbols | |
187 | clang_rt.tsan_cxx-${arch}-symbols) | |
188 | endforeach() | |
1a4d82fc JJ |
189 | endif() |
190 | ||
3157f602 | 191 | # Make sure that non-platform-specific files don't include any system headers. |
5bcae85e SL |
192 | # FreeBSD does not install a number of Clang-provided headers for the compiler |
193 | # in the base system due to incompatibilities between FreeBSD's and Clang's | |
194 | # versions. As a workaround do not use --sysroot=. on FreeBSD until this is | |
195 | # addressed. | |
196 | if(COMPILER_RT_HAS_SYSROOT_FLAG AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD") | |
3157f602 XL |
197 | file(GLOB _tsan_generic_sources rtl/tsan*) |
198 | file(GLOB _tsan_platform_sources rtl/tsan*posix* rtl/tsan*mac* | |
199 | rtl/tsan*linux*) | |
200 | list(REMOVE_ITEM _tsan_generic_sources ${_tsan_platform_sources}) | |
201 | set_source_files_properties(${_tsan_generic_sources} | |
202 | PROPERTIES COMPILE_FLAGS "--sysroot=.") | |
203 | endif() | |
204 | ||
92a42be0 | 205 | # Build libcxx instrumented with TSan. |
2c00a5a8 XL |
206 | if(COMPILER_RT_LIBCXX_PATH AND |
207 | COMPILER_RT_TEST_COMPILER_ID STREQUAL "Clang" AND | |
208 | NOT ANDROID) | |
3157f602 XL |
209 | set(libcxx_tsan_deps) |
210 | foreach(arch ${TSAN_SUPPORTED_ARCH}) | |
211 | get_target_flags_for_arch(${arch} TARGET_CFLAGS) | |
212 | set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_tsan_${arch}) | |
213 | add_custom_libcxx(libcxx_tsan_${arch} ${LIBCXX_PREFIX} | |
214 | DEPS ${TSAN_RUNTIME_LIBRARIES} | |
215 | CFLAGS ${TARGET_CFLAGS} -fsanitize=thread) | |
216 | list(APPEND libcxx_tsan_deps libcxx_tsan_${arch}) | |
217 | endforeach() | |
218 | ||
219 | add_custom_target(libcxx_tsan DEPENDS ${libcxx_tsan_deps}) | |
92a42be0 SL |
220 | endif() |
221 | ||
1a4d82fc JJ |
222 | if(COMPILER_RT_INCLUDE_TESTS) |
223 | add_subdirectory(tests) | |
224 | endif() |