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