]>
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 |
1a4d82fc | 28 | rtl/tsan_fd.cc |
5bcae85e | 29 | rtl/tsan_flags.cc |
1a4d82fc JJ |
30 | rtl/tsan_ignoreset.cc |
31 | rtl/tsan_interceptors.cc | |
5bcae85e | 32 | rtl/tsan_interface.cc |
1a4d82fc JJ |
33 | rtl/tsan_interface_ann.cc |
34 | rtl/tsan_interface_atomic.cc | |
1a4d82fc | 35 | rtl/tsan_interface_java.cc |
92a42be0 | 36 | rtl/tsan_malloc_mac.cc |
1a4d82fc JJ |
37 | rtl/tsan_md5.cc |
38 | rtl/tsan_mman.cc | |
39 | rtl/tsan_mutex.cc | |
40 | rtl/tsan_mutexset.cc | |
5bcae85e | 41 | rtl/tsan_preinit.cc |
1a4d82fc JJ |
42 | rtl/tsan_report.cc |
43 | rtl/tsan_rtl.cc | |
44 | rtl/tsan_rtl_mutex.cc | |
5bcae85e | 45 | rtl/tsan_rtl_proc.cc |
1a4d82fc JJ |
46 | rtl/tsan_rtl_report.cc |
47 | rtl/tsan_rtl_thread.cc | |
92a42be0 | 48 | rtl/tsan_stack_trace.cc |
1a4d82fc JJ |
49 | rtl/tsan_stat.cc |
50 | rtl/tsan_suppressions.cc | |
51 | rtl/tsan_symbolize.cc | |
52 | rtl/tsan_sync.cc) | |
53 | ||
92a42be0 SL |
54 | set(TSAN_CXX_SOURCES |
55 | rtl/tsan_new_delete.cc) | |
56 | ||
1a4d82fc | 57 | if(APPLE) |
92a42be0 | 58 | list(APPEND TSAN_SOURCES |
3157f602 XL |
59 | rtl/tsan_interceptors_mac.cc |
60 | rtl/tsan_libdispatch_mac.cc | |
92a42be0 SL |
61 | rtl/tsan_platform_mac.cc |
62 | rtl/tsan_platform_posix.cc) | |
1a4d82fc JJ |
63 | elseif(UNIX) |
64 | # Assume Linux | |
65 | list(APPEND TSAN_SOURCES | |
92a42be0 SL |
66 | rtl/tsan_platform_linux.cc |
67 | rtl/tsan_platform_posix.cc) | |
1a4d82fc JJ |
68 | endif() |
69 | ||
70 | set(TSAN_HEADERS | |
71 | rtl/tsan_clock.h | |
72 | rtl/tsan_defs.h | |
92a42be0 | 73 | rtl/tsan_dense_alloc.h |
1a4d82fc JJ |
74 | rtl/tsan_fd.h |
75 | rtl/tsan_flags.h | |
92a42be0 | 76 | rtl/tsan_flags.inc |
1a4d82fc | 77 | rtl/tsan_ignoreset.h |
92a42be0 | 78 | rtl/tsan_interceptors.h |
1a4d82fc JJ |
79 | rtl/tsan_interface_ann.h |
80 | rtl/tsan_interface.h | |
81 | rtl/tsan_interface_inl.h | |
82 | rtl/tsan_interface_java.h | |
83 | rtl/tsan_mman.h | |
84 | rtl/tsan_mutex.h | |
85 | rtl/tsan_mutexset.h | |
86 | rtl/tsan_platform.h | |
87 | rtl/tsan_report.h | |
88 | rtl/tsan_rtl.h | |
92a42be0 | 89 | rtl/tsan_stack_trace.h |
1a4d82fc JJ |
90 | rtl/tsan_stat.h |
91 | rtl/tsan_suppressions.h | |
92 | rtl/tsan_symbolize.h | |
93 | rtl/tsan_sync.h | |
94 | rtl/tsan_trace.h | |
95 | rtl/tsan_update_shadow_word_inl.h | |
96 | rtl/tsan_vector.h) | |
97 | ||
92a42be0 | 98 | set(TSAN_RUNTIME_LIBRARIES) |
7cac9316 | 99 | add_compiler_rt_component(tsan) |
92a42be0 SL |
100 | |
101 | if(APPLE) | |
3157f602 XL |
102 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_amd64.S) |
103 | # Xcode will try to compile this file as C ('clang -x c'), and that will fail. | |
104 | if (${CMAKE_GENERATOR} STREQUAL "Xcode") | |
105 | enable_language(ASM) | |
106 | else() | |
107 | # Pass ASM file directly to the C++ compiler. | |
108 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES LANGUAGE C) | |
109 | endif() | |
7cac9316 XL |
110 | |
111 | add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS) | |
112 | add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) | |
113 | ||
92a42be0 SL |
114 | add_compiler_rt_runtime(clang_rt.tsan |
115 | SHARED | |
116 | OS ${TSAN_SUPPORTED_OS} | |
117 | ARCHS ${TSAN_SUPPORTED_ARCH} | |
3157f602 | 118 | SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES} |
92a42be0 SL |
119 | OBJECT_LIBS RTInterception |
120 | RTSanitizerCommon | |
121 | RTSanitizerCommonLibc | |
122 | RTUbsan | |
1a4d82fc | 123 | CFLAGS ${TSAN_RTL_CFLAGS} |
7cac9316 | 124 | LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS} |
92a42be0 | 125 | PARENT_TARGET tsan) |
5bcae85e | 126 | add_compiler_rt_object_libraries(RTTsan_dynamic |
3157f602 XL |
127 | OS ${TSAN_SUPPORTED_OS} |
128 | ARCHS ${TSAN_SUPPORTED_ARCH} | |
129 | SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES} | |
130 | CFLAGS ${TSAN_RTL_CFLAGS}) | |
131 | ||
132 | # Build and check Go runtime. | |
133 | set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/go/buildgo.sh) | |
134 | add_custom_target(GotsanRuntimeCheck | |
135 | COMMAND env "CC=${CMAKE_C_COMPILER} ${OSX_SYSROOT_FLAG}" | |
136 | IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT} | |
137 | DEPENDS tsan ${BUILDGO_SCRIPT} | |
138 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/go | |
139 | COMMENT "Checking TSan Go runtime..." | |
140 | VERBATIM) | |
92a42be0 SL |
141 | else() |
142 | foreach(arch ${TSAN_SUPPORTED_ARCH}) | |
143 | if(arch STREQUAL "x86_64") | |
144 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_amd64.S) | |
145 | # Pass ASM file directly to the C++ compiler. | |
146 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
147 | LANGUAGE C) | |
148 | # Sanity check for Go runtime. | |
149 | set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/go/buildgo.sh) | |
150 | add_custom_target(GotsanRuntimeCheck | |
151 | COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" | |
152 | IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT} | |
153 | DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT} | |
154 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/go | |
155 | COMMENT "Checking TSan Go runtime..." | |
156 | VERBATIM) | |
3157f602 XL |
157 | elseif(arch STREQUAL "aarch64") |
158 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_aarch64.S) | |
159 | # Pass ASM file directly to the C++ compiler. | |
160 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
161 | LANGUAGE C) | |
162 | elseif(arch MATCHES "powerpc64|powerpc64le") | |
163 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_ppc64.S) | |
164 | # Pass ASM file directly to the C++ compiler. | |
165 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
166 | LANGUAGE C) | |
7cac9316 XL |
167 | elseif(arch MATCHES "mips64|mips64le") |
168 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_mips64.S) | |
169 | # Pass ASM file directly to the C++ compiler. | |
170 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
171 | LANGUAGE C) | |
92a42be0 SL |
172 | else() |
173 | set(TSAN_ASM_SOURCES) | |
174 | endif() | |
175 | add_compiler_rt_runtime(clang_rt.tsan | |
176 | STATIC | |
177 | ARCHS ${arch} | |
178 | SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES} | |
179 | $<TARGET_OBJECTS:RTInterception.${arch}> | |
180 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> | |
181 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}> | |
182 | $<TARGET_OBJECTS:RTUbsan.${arch}> | |
183 | CFLAGS ${TSAN_RTL_CFLAGS}) | |
184 | add_compiler_rt_runtime(clang_rt.tsan_cxx | |
185 | STATIC | |
186 | ARCHS ${arch} | |
187 | SOURCES ${TSAN_CXX_SOURCES} | |
188 | $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> | |
189 | CFLAGS ${TSAN_RTL_CFLAGS}) | |
190 | list(APPEND TSAN_RUNTIME_LIBRARIES clang_rt.tsan-${arch} | |
191 | clang_rt.tsan_cxx-${arch}) | |
192 | add_sanitizer_rt_symbols(clang_rt.tsan | |
193 | ARCHS ${arch} | |
194 | EXTRA rtl/tsan.syms.extra) | |
195 | add_sanitizer_rt_symbols(clang_rt.tsan_cxx | |
196 | ARCHS ${arch} | |
197 | EXTRA rtl/tsan.syms.extra) | |
198 | add_dependencies(tsan clang_rt.tsan-${arch} | |
199 | clang_rt.tsan_cxx-${arch} | |
200 | clang_rt.tsan-${arch}-symbols | |
201 | clang_rt.tsan_cxx-${arch}-symbols) | |
202 | endforeach() | |
1a4d82fc JJ |
203 | endif() |
204 | ||
3157f602 | 205 | # Make sure that non-platform-specific files don't include any system headers. |
5bcae85e SL |
206 | # FreeBSD does not install a number of Clang-provided headers for the compiler |
207 | # in the base system due to incompatibilities between FreeBSD's and Clang's | |
208 | # versions. As a workaround do not use --sysroot=. on FreeBSD until this is | |
209 | # addressed. | |
210 | if(COMPILER_RT_HAS_SYSROOT_FLAG AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD") | |
3157f602 XL |
211 | file(GLOB _tsan_generic_sources rtl/tsan*) |
212 | file(GLOB _tsan_platform_sources rtl/tsan*posix* rtl/tsan*mac* | |
213 | rtl/tsan*linux*) | |
214 | list(REMOVE_ITEM _tsan_generic_sources ${_tsan_platform_sources}) | |
215 | set_source_files_properties(${_tsan_generic_sources} | |
216 | PROPERTIES COMPILE_FLAGS "--sysroot=.") | |
217 | endif() | |
218 | ||
92a42be0 SL |
219 | # Build libcxx instrumented with TSan. |
220 | if(COMPILER_RT_HAS_LIBCXX_SOURCES AND | |
221 | COMPILER_RT_TEST_COMPILER_ID STREQUAL "Clang") | |
3157f602 XL |
222 | set(libcxx_tsan_deps) |
223 | foreach(arch ${TSAN_SUPPORTED_ARCH}) | |
224 | get_target_flags_for_arch(${arch} TARGET_CFLAGS) | |
225 | set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_tsan_${arch}) | |
226 | add_custom_libcxx(libcxx_tsan_${arch} ${LIBCXX_PREFIX} | |
227 | DEPS ${TSAN_RUNTIME_LIBRARIES} | |
228 | CFLAGS ${TARGET_CFLAGS} -fsanitize=thread) | |
229 | list(APPEND libcxx_tsan_deps libcxx_tsan_${arch}) | |
230 | endforeach() | |
231 | ||
232 | add_custom_target(libcxx_tsan DEPENDS ${libcxx_tsan_deps}) | |
92a42be0 SL |
233 | endif() |
234 | ||
1a4d82fc JJ |
235 | if(COMPILER_RT_INCLUDE_TESTS) |
236 | add_subdirectory(tests) | |
237 | endif() |