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