]>
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 SL |
19 | append_list_if(COMPILER_RT_HAS_MSSE3_FLAG -msse3 TSAN_RTL_CFLAGS) |
20 | append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=512 | |
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) |
1a4d82fc | 99 | add_custom_target(tsan) |
5bcae85e | 100 | set_target_properties(tsan PROPERTIES FOLDER "Compiler-RT Misc") |
92a42be0 SL |
101 | |
102 | if(APPLE) | |
3157f602 XL |
103 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_amd64.S) |
104 | # Xcode will try to compile this file as C ('clang -x c'), and that will fail. | |
105 | if (${CMAKE_GENERATOR} STREQUAL "Xcode") | |
106 | enable_language(ASM) | |
107 | else() | |
108 | # Pass ASM file directly to the C++ compiler. | |
109 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES LANGUAGE C) | |
110 | endif() | |
92a42be0 SL |
111 | add_compiler_rt_runtime(clang_rt.tsan |
112 | SHARED | |
113 | OS ${TSAN_SUPPORTED_OS} | |
114 | ARCHS ${TSAN_SUPPORTED_ARCH} | |
3157f602 | 115 | SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES} |
92a42be0 SL |
116 | OBJECT_LIBS RTInterception |
117 | RTSanitizerCommon | |
118 | RTSanitizerCommonLibc | |
119 | RTUbsan | |
1a4d82fc | 120 | CFLAGS ${TSAN_RTL_CFLAGS} |
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") | |
140 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_amd64.S) | |
141 | # Pass ASM file directly to the C++ compiler. | |
142 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
143 | LANGUAGE C) | |
144 | # Sanity check for Go runtime. | |
145 | set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/go/buildgo.sh) | |
146 | add_custom_target(GotsanRuntimeCheck | |
147 | COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" | |
148 | IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT} | |
149 | DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT} | |
150 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/go | |
151 | COMMENT "Checking TSan Go runtime..." | |
152 | VERBATIM) | |
3157f602 XL |
153 | elseif(arch STREQUAL "aarch64") |
154 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_aarch64.S) | |
155 | # Pass ASM file directly to the C++ compiler. | |
156 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
157 | LANGUAGE C) | |
158 | elseif(arch MATCHES "powerpc64|powerpc64le") | |
159 | set(TSAN_ASM_SOURCES rtl/tsan_rtl_ppc64.S) | |
160 | # Pass ASM file directly to the C++ compiler. | |
161 | set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES | |
162 | LANGUAGE C) | |
92a42be0 SL |
163 | else() |
164 | set(TSAN_ASM_SOURCES) | |
165 | endif() | |
166 | add_compiler_rt_runtime(clang_rt.tsan | |
167 | STATIC | |
168 | ARCHS ${arch} | |
169 | SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES} | |
170 | $<TARGET_OBJECTS:RTInterception.${arch}> | |
171 | $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> | |
172 | $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}> | |
173 | $<TARGET_OBJECTS:RTUbsan.${arch}> | |
174 | CFLAGS ${TSAN_RTL_CFLAGS}) | |
175 | add_compiler_rt_runtime(clang_rt.tsan_cxx | |
176 | STATIC | |
177 | ARCHS ${arch} | |
178 | SOURCES ${TSAN_CXX_SOURCES} | |
179 | $<TARGET_OBJECTS:RTUbsan_cxx.${arch}> | |
180 | CFLAGS ${TSAN_RTL_CFLAGS}) | |
181 | list(APPEND TSAN_RUNTIME_LIBRARIES clang_rt.tsan-${arch} | |
182 | clang_rt.tsan_cxx-${arch}) | |
183 | add_sanitizer_rt_symbols(clang_rt.tsan | |
184 | ARCHS ${arch} | |
185 | EXTRA rtl/tsan.syms.extra) | |
186 | add_sanitizer_rt_symbols(clang_rt.tsan_cxx | |
187 | ARCHS ${arch} | |
188 | EXTRA rtl/tsan.syms.extra) | |
189 | add_dependencies(tsan clang_rt.tsan-${arch} | |
190 | clang_rt.tsan_cxx-${arch} | |
191 | clang_rt.tsan-${arch}-symbols | |
192 | clang_rt.tsan_cxx-${arch}-symbols) | |
193 | endforeach() | |
1a4d82fc JJ |
194 | endif() |
195 | ||
196 | add_dependencies(compiler-rt tsan) | |
197 | ||
3157f602 | 198 | # Make sure that non-platform-specific files don't include any system headers. |
5bcae85e SL |
199 | # FreeBSD does not install a number of Clang-provided headers for the compiler |
200 | # in the base system due to incompatibilities between FreeBSD's and Clang's | |
201 | # versions. As a workaround do not use --sysroot=. on FreeBSD until this is | |
202 | # addressed. | |
203 | if(COMPILER_RT_HAS_SYSROOT_FLAG AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD") | |
3157f602 XL |
204 | file(GLOB _tsan_generic_sources rtl/tsan*) |
205 | file(GLOB _tsan_platform_sources rtl/tsan*posix* rtl/tsan*mac* | |
206 | rtl/tsan*linux*) | |
207 | list(REMOVE_ITEM _tsan_generic_sources ${_tsan_platform_sources}) | |
208 | set_source_files_properties(${_tsan_generic_sources} | |
209 | PROPERTIES COMPILE_FLAGS "--sysroot=.") | |
210 | endif() | |
211 | ||
92a42be0 SL |
212 | # Build libcxx instrumented with TSan. |
213 | if(COMPILER_RT_HAS_LIBCXX_SOURCES AND | |
214 | COMPILER_RT_TEST_COMPILER_ID STREQUAL "Clang") | |
3157f602 XL |
215 | set(libcxx_tsan_deps) |
216 | foreach(arch ${TSAN_SUPPORTED_ARCH}) | |
217 | get_target_flags_for_arch(${arch} TARGET_CFLAGS) | |
218 | set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_tsan_${arch}) | |
219 | add_custom_libcxx(libcxx_tsan_${arch} ${LIBCXX_PREFIX} | |
220 | DEPS ${TSAN_RUNTIME_LIBRARIES} | |
221 | CFLAGS ${TARGET_CFLAGS} -fsanitize=thread) | |
222 | list(APPEND libcxx_tsan_deps libcxx_tsan_${arch}) | |
223 | endforeach() | |
224 | ||
225 | add_custom_target(libcxx_tsan DEPENDS ${libcxx_tsan_deps}) | |
92a42be0 SL |
226 | endif() |
227 | ||
1a4d82fc JJ |
228 | if(COMPILER_RT_INCLUDE_TESTS) |
229 | add_subdirectory(tests) | |
230 | endif() |