1include_directories(../..)
2
3set(TSAN_RTL_CFLAGS ${TSAN_CFLAGS})
4append_list_if(COMPILER_RT_HAS_MSSE4_2_FLAG -msse4.2 TSAN_RTL_CFLAGS)
5append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=530
6               TSAN_RTL_CFLAGS)
7append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors
8               TSAN_RTL_CFLAGS)
9append_list_if(COMPILER_RT_INTERCEPT_LIBDISPATCH ${COMPILER_RT_LIBDISPATCH_CFLAGS}
10               TSAN_RTL_CFLAGS)
11
12set(TSAN_RTL_DYNAMIC_CFLAGS ${TSAN_RTL_CFLAGS})
13list(REMOVE_ITEM TSAN_RTL_DYNAMIC_CFLAGS -fPIE)
14
15set(TSAN_DYNAMIC_LINK_LIBS
16  ${COMPILER_RT_UNWINDER_LINK_LIBS}
17  ${SANITIZER_CXX_ABI_LIBRARIES}
18  ${SANITIZER_COMMON_LINK_LIBS})
19
20append_list_if(COMPILER_RT_HAS_LIBDL dl TSAN_DYNAMIC_LINK_LIBS)
21append_list_if(COMPILER_RT_HAS_LIBM m TSAN_DYNAMIC_LINK_LIBS)
22append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread TSAN_DYNAMIC_LINK_LIBS)
23
24set(TSAN_SOURCES
25  tsan_debugging.cpp
26  tsan_external.cpp
27  tsan_fd.cpp
28  tsan_flags.cpp
29  tsan_ignoreset.cpp
30  tsan_interceptors_posix.cpp
31  tsan_interface.cpp
32  tsan_interface_ann.cpp
33  tsan_interface_atomic.cpp
34  tsan_interface_java.cpp
35  tsan_malloc_mac.cpp
36  tsan_md5.cpp
37  tsan_mman.cpp
38  tsan_mutexset.cpp
39  tsan_report.cpp
40  tsan_rtl.cpp
41  tsan_rtl_access.cpp
42  tsan_rtl_mutex.cpp
43  tsan_rtl_proc.cpp
44  tsan_rtl_report.cpp
45  tsan_rtl_thread.cpp
46  tsan_stack_trace.cpp
47  tsan_suppressions.cpp
48  tsan_symbolize.cpp
49  tsan_sync.cpp
50  tsan_vector_clock.cpp
51  )
52
53set(TSAN_CXX_SOURCES
54  tsan_new_delete.cpp
55  )
56
57set(TSAN_PREINIT_SOURCES
58  tsan_preinit.cpp
59  )
60
61if(APPLE)
62  list(APPEND TSAN_SOURCES
63    tsan_interceptors_mac.cpp
64    tsan_interceptors_mach_vm.cpp
65    tsan_platform_mac.cpp
66    tsan_platform_posix.cpp
67    )
68elseif(UNIX)
69  # Assume Linux
70  list(APPEND TSAN_SOURCES
71    tsan_platform_linux.cpp
72    tsan_platform_posix.cpp
73    )
74endif()
75
76if(COMPILER_RT_INTERCEPT_LIBDISPATCH)
77  list(APPEND TSAN_SOURCES
78    tsan_interceptors_libdispatch.cpp
79    )
80endif()
81
82set(TSAN_HEADERS
83  tsan_defs.h
84  tsan_dense_alloc.h
85  tsan_fd.h
86  tsan_flags.h
87  tsan_flags.inc
88  tsan_ignoreset.h
89  tsan_ilist.h
90  tsan_interceptors.h
91  tsan_interface.h
92  tsan_interface.inc
93  tsan_interface_ann.h
94  tsan_interface_java.h
95  tsan_mman.h
96  tsan_mutexset.h
97  tsan_platform.h
98  tsan_ppc_regs.h
99  tsan_report.h
100  tsan_rtl.h
101  tsan_shadow.h
102  tsan_stack_trace.h
103  tsan_suppressions.h
104  tsan_symbolize.h
105  tsan_sync.h
106  tsan_trace.h
107  tsan_vector_clock.h
108  )
109
110set(TSAN_RUNTIME_LIBRARIES)
111add_compiler_rt_component(tsan)
112
113if("${CMAKE_C_FLAGS}" MATCHES "-Wno-(error=)?unused-command-line-argument")
114  set(EXTRA_CFLAGS "-Wno-error=unused-command-line-argument ${EXTRA_CFLAGS}")
115endif()
116
117if(APPLE)
118  # Ideally we would check the SDK version for the actual platform we are
119  # building for here.  To make our lifes easier we assume the host SDK setup is
120  # sane and use the macOS SDK version as a proxy for aligned SDKs.
121  find_darwin_sdk_version(macosx_sdk_version "macosx")
122  if ("${macosx_sdk_version}" VERSION_LESS 10.12)
123    message(FATAL_ERROR "Building the TSan runtime requires at least macOS SDK 10.12 (or aligned SDK on other platforms)")
124  endif()
125
126  add_asm_sources(TSAN_ASM_SOURCES
127    tsan_rtl_amd64.S
128    tsan_rtl_aarch64.S
129    )
130
131  set(TSAN_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS})
132
133  add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)
134  add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
135
136  add_compiler_rt_runtime(clang_rt.tsan
137    SHARED
138    OS ${TSAN_SUPPORTED_OS}
139    ARCHS ${TSAN_SUPPORTED_ARCH}
140    SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES}
141    ADDITIONAL_HEADERS ${TSAN_HEADERS}
142    OBJECT_LIBS RTInterception
143                RTSanitizerCommon
144                RTSanitizerCommonLibc
145                RTSanitizerCommonCoverage
146                RTSanitizerCommonSymbolizer
147                RTUbsan
148    CFLAGS ${TSAN_RTL_CFLAGS}
149    LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
150    LINK_LIBS ${TSAN_LINK_LIBS} objc
151    PARENT_TARGET tsan)
152  add_compiler_rt_object_libraries(RTTsan_dynamic
153    OS ${TSAN_SUPPORTED_OS}
154    ARCHS ${TSAN_SUPPORTED_ARCH}
155    SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES}
156    ADDITIONAL_HEADERS ${TSAN_HEADERS}
157    CFLAGS ${TSAN_RTL_CFLAGS})
158
159  # Build and check Go runtime.
160  set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)
161  add_custom_target(GotsanRuntimeCheck
162    COMMAND env "CC=${CMAKE_C_COMPILER} ${OSX_SYSROOT_FLAG}"
163            EXTRA_CFLAGS=${EXTRA_CFLAGS}
164            IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}
165    DEPENDS tsan ${BUILDGO_SCRIPT}
166    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go
167    COMMENT "Checking TSan Go runtime..."
168    VERBATIM)
169  set_target_properties(GotsanRuntimeCheck PROPERTIES FOLDER "Compiler-RT Misc")
170else()
171  foreach(arch ${TSAN_SUPPORTED_ARCH})
172    if(arch STREQUAL "x86_64")
173      add_asm_sources(TSAN_ASM_SOURCES
174        tsan_rtl_amd64.S
175        )
176      # Check for Go runtime.
177      set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)
178      add_custom_target(GotsanRuntimeCheck
179        COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"
180                EXTRA_CFLAGS=${EXTRA_CFLAGS}
181                IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}
182        DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}
183        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go
184        COMMENT "Checking TSan Go runtime..."
185        VERBATIM)
186    elseif(arch STREQUAL "aarch64")
187      add_asm_sources(TSAN_ASM_SOURCES
188        tsan_rtl_aarch64.S
189        )
190      # Check for Go runtime.
191      set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)
192      add_custom_target(GotsanRuntimeCheck
193	COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"
194		EXTRA_CFLAGS=${EXTRA_CFLAGS}
195		IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}
196	DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}
197	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go
198	COMMENT "Checking TSan Go runtime..."
199	VERBATIM)
200    elseif(arch MATCHES "powerpc64|powerpc64le")
201      add_asm_sources(TSAN_ASM_SOURCES
202        tsan_rtl_ppc64.S
203        )
204      # Check for Go runtime.
205      set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)
206      add_custom_target(GotsanRuntimeCheck
207	COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"
208		EXTRA_CFLAGS=${EXTRA_CFLAGS}
209		IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}
210	DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}
211	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go
212	COMMENT "Checking TSan Go runtime..."
213	VERBATIM)
214    elseif(arch MATCHES "loongarch64")
215      add_asm_sources(TSAN_ASM_SOURCES
216        tsan_rtl_loongarch64.S
217        )
218    elseif(arch MATCHES "mips64|mips64le")
219      add_asm_sources(TSAN_ASM_SOURCES
220        tsan_rtl_mips64.S
221        )
222    elseif(arch MATCHES "s390x")
223      add_asm_sources(TSAN_ASM_SOURCES
224        tsan_rtl_s390x.S
225        )
226      # Check for Go runtime.
227      set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)
228      add_custom_target(GotsanRuntimeCheck
229	COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"
230		EXTRA_CFLAGS=${EXTRA_CFLAGS}
231		IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}
232	DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}
233	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go
234	COMMENT "Checking TSan Go runtime..."
235	VERBATIM)
236    else()
237      set(TSAN_ASM_SOURCES)
238    endif()
239    add_compiler_rt_runtime(clang_rt.tsan
240      STATIC
241      ARCHS ${arch}
242      SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES} ${TSAN_PREINIT_SOURCES}
243              $<TARGET_OBJECTS:RTInterception.${arch}>
244              $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
245              $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
246              $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
247              $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
248              $<TARGET_OBJECTS:RTUbsan.${arch}>
249      ADDITIONAL_HEADERS ${TSAN_HEADERS}
250      CFLAGS ${TSAN_RTL_CFLAGS}
251      PARENT_TARGET tsan)
252    add_compiler_rt_runtime(clang_rt.tsan_cxx
253      STATIC
254      ARCHS ${arch}
255      SOURCES ${TSAN_CXX_SOURCES}
256              $<TARGET_OBJECTS:RTUbsan_cxx.${arch}>
257      ADDITIONAL_HEADERS ${TSAN_HEADERS}
258      CFLAGS ${TSAN_RTL_CFLAGS}
259      PARENT_TARGET tsan)
260    list(APPEND TSAN_RUNTIME_LIBRARIES clang_rt.tsan-${arch}
261                                       clang_rt.tsan_cxx-${arch})
262    add_compiler_rt_runtime(clang_rt.tsan
263      SHARED
264      ARCHS ${arch}
265      SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES}
266              $<TARGET_OBJECTS:RTInterception.${arch}>
267              $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
268              $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
269              $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
270              $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
271              $<TARGET_OBJECTS:RTUbsan.${arch}>
272      ADDITIONAL_HEADERS ${TSAN_HEADERS}
273      CFLAGS ${TSAN_RTL_DYNAMIC_CFLAGS}
274      DEFS SANITIZER_SHARED
275      LINK_LIBS ${TSAN_DYNAMIC_LINK_LIBS}
276      LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}
277      PARENT_TARGET tsan)
278    add_sanitizer_rt_symbols(clang_rt.tsan
279      ARCHS ${arch}
280      EXTRA tsan.syms.extra)
281    add_sanitizer_rt_symbols(clang_rt.tsan_cxx
282      ARCHS ${arch}
283      EXTRA tsan.syms.extra)
284    add_dependencies(tsan clang_rt.tsan-${arch}
285                          clang_rt.tsan_cxx-${arch}
286                          clang_rt.tsan-${arch}-symbols
287                          clang_rt.tsan_cxx-${arch}-symbols)
288  endforeach()
289endif()
290
291
292