298 lines · plain
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=5306 TSAN_RTL_CFLAGS)7append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors8 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_LIBS16 ${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_SOURCES25 tsan_debugging.cpp26 tsan_external.cpp27 tsan_fd.cpp28 tsan_flags.cpp29 tsan_ignoreset.cpp30 tsan_interceptors_memintrinsics.cpp31 tsan_interceptors_posix.cpp32 tsan_interface.cpp33 tsan_interface_ann.cpp34 tsan_interface_atomic.cpp35 tsan_interface_java.cpp36 tsan_malloc_mac.cpp37 tsan_md5.cpp38 tsan_mman.cpp39 tsan_mutexset.cpp40 tsan_report.cpp41 tsan_rtl.cpp42 tsan_rtl_access.cpp43 tsan_rtl_mutex.cpp44 tsan_rtl_proc.cpp45 tsan_rtl_report.cpp46 tsan_rtl_thread.cpp47 tsan_stack_trace.cpp48 tsan_suppressions.cpp49 tsan_symbolize.cpp50 tsan_sync.cpp51 tsan_vector_clock.cpp52 )53 54set(TSAN_CXX_SOURCES55 tsan_new_delete.cpp56 )57 58set(TSAN_PREINIT_SOURCES59 tsan_preinit.cpp60 )61 62if(APPLE)63 list(APPEND TSAN_SOURCES64 tsan_interceptors_mac.cpp65 tsan_interceptors_mach_vm.cpp66 tsan_platform_mac.cpp67 tsan_platform_posix.cpp68 )69elseif(UNIX)70 # Assume Linux71 list(APPEND TSAN_SOURCES72 tsan_platform_linux.cpp73 tsan_platform_posix.cpp74 )75endif()76 77if(COMPILER_RT_INTERCEPT_LIBDISPATCH)78 list(APPEND TSAN_SOURCES79 tsan_interceptors_libdispatch.cpp80 )81endif()82 83set(TSAN_HEADERS84 tsan_defs.h85 tsan_dense_alloc.h86 tsan_fd.h87 tsan_flags.h88 tsan_flags.inc89 tsan_ignoreset.h90 tsan_ilist.h91 tsan_interceptors.h92 tsan_interface.h93 tsan_interface.inc94 tsan_interface_ann.h95 tsan_interface_java.h96 tsan_mman.h97 tsan_mutexset.h98 tsan_platform.h99 tsan_ppc_regs.h100 tsan_report.h101 tsan_rtl.h102 tsan_shadow.h103 tsan_stack_trace.h104 tsan_suppressions.h105 tsan_symbolize.h106 tsan_sync.h107 tsan_trace.h108 tsan_vector_clock.h109 )110 111set(TSAN_RUNTIME_LIBRARIES)112add_compiler_rt_component(tsan)113 114if("${CMAKE_C_FLAGS}" MATCHES "-Wno-(error=)?unused-command-line-argument")115 set(EXTRA_CFLAGS "-Wno-error=unused-command-line-argument ${EXTRA_CFLAGS}")116endif()117 118if(APPLE)119 # Ideally we would check the SDK version for the actual platform we are120 # building for here. To make our lifes easier we assume the host SDK setup is121 # sane and use the macOS SDK version as a proxy for aligned SDKs.122 find_darwin_sdk_version(macosx_sdk_version "macosx")123 if ("${macosx_sdk_version}" VERSION_LESS 10.12)124 message(FATAL_ERROR "Building the TSan runtime requires at least macOS SDK 10.12 (or aligned SDK on other platforms)")125 endif()126 127 set(TSAN_ASM_SOURCES128 tsan_rtl_amd64.S129 tsan_rtl_aarch64.S130 )131 132 set(TSAN_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS})133 134 add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)135 add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)136 137 add_compiler_rt_runtime(clang_rt.tsan138 SHARED139 OS ${TSAN_SUPPORTED_OS}140 ARCHS ${TSAN_SUPPORTED_ARCH}141 SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES}142 ADDITIONAL_HEADERS ${TSAN_HEADERS}143 OBJECT_LIBS RTInterception144 RTSanitizerCommon145 RTSanitizerCommonLibc146 RTSanitizerCommonCoverage147 RTSanitizerCommonSymbolizer148 RTUbsan149 CFLAGS ${TSAN_RTL_CFLAGS}150 LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}151 LINK_LIBS ${TSAN_LINK_LIBS} objc152 PARENT_TARGET tsan)153 add_compiler_rt_object_libraries(RTTsan_dynamic154 OS ${TSAN_SUPPORTED_OS}155 ARCHS ${TSAN_SUPPORTED_ARCH}156 SOURCES ${TSAN_SOURCES} ${TSAN_CXX_SOURCES} ${TSAN_ASM_SOURCES}157 ADDITIONAL_HEADERS ${TSAN_HEADERS}158 CFLAGS ${TSAN_RTL_CFLAGS})159 160 # Build and check Go runtime.161 set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)162 add_custom_target(GotsanRuntimeCheck163 COMMAND env "CC=${CMAKE_C_COMPILER} ${OSX_SYSROOT_FLAG}"164 EXTRA_CFLAGS=${EXTRA_CFLAGS}165 IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}166 DEPENDS tsan ${BUILDGO_SCRIPT}167 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go168 COMMENT "Checking TSan Go runtime..."169 VERBATIM)170 set_target_properties(GotsanRuntimeCheck PROPERTIES FOLDER "Compiler-RT/Misc")171else()172 foreach(arch ${TSAN_SUPPORTED_ARCH})173 if(arch STREQUAL "x86_64")174 set(TSAN_ASM_SOURCES175 tsan_rtl_amd64.S176 )177 # Check for Go runtime.178 set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)179 add_custom_target(GotsanRuntimeCheck180 COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"181 EXTRA_CFLAGS=${EXTRA_CFLAGS}182 IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}183 DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}184 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go185 COMMENT "Checking TSan Go runtime..."186 VERBATIM)187 elseif(arch STREQUAL "aarch64")188 set(TSAN_ASM_SOURCES189 tsan_rtl_aarch64.S190 )191 # Check for Go runtime.192 set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)193 add_custom_target(GotsanRuntimeCheck194 COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"195 EXTRA_CFLAGS=${EXTRA_CFLAGS}196 IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}197 DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}198 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go199 COMMENT "Checking TSan Go runtime..."200 VERBATIM)201 elseif(arch MATCHES "powerpc64|powerpc64le")202 set(TSAN_ASM_SOURCES203 tsan_rtl_ppc64.S204 )205 # Check for Go runtime.206 set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)207 add_custom_target(GotsanRuntimeCheck208 COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"209 EXTRA_CFLAGS=${EXTRA_CFLAGS}210 IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}211 DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}212 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go213 COMMENT "Checking TSan Go runtime..."214 VERBATIM)215 elseif(arch MATCHES "loongarch64")216 set(TSAN_ASM_SOURCES217 tsan_rtl_loongarch64.S218 )219 elseif(arch MATCHES "mips64|mips64le")220 set(TSAN_ASM_SOURCES221 tsan_rtl_mips64.S222 )223 elseif(arch MATCHES "riscv64")224 set(TSAN_ASM_SOURCES225 tsan_rtl_riscv64.S226 )227 elseif(arch MATCHES "s390x")228 set(TSAN_ASM_SOURCES229 tsan_rtl_s390x.S230 )231 # Check for Go runtime.232 set(BUILDGO_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../go/buildgo.sh)233 add_custom_target(GotsanRuntimeCheck234 COMMAND env "CC=${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}"235 EXTRA_CFLAGS=${EXTRA_CFLAGS}236 IN_TMPDIR=1 SILENT=1 ${BUILDGO_SCRIPT}237 DEPENDS clang_rt.tsan-${arch} ${BUILDGO_SCRIPT}238 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../go239 COMMENT "Checking TSan Go runtime..."240 VERBATIM)241 else()242 set(TSAN_ASM_SOURCES)243 endif()244 add_compiler_rt_runtime(clang_rt.tsan245 STATIC246 ARCHS ${arch}247 SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES} ${TSAN_PREINIT_SOURCES}248 $<TARGET_OBJECTS:RTInterception.${arch}>249 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>250 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>251 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>252 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>253 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}>254 $<TARGET_OBJECTS:RTUbsan.${arch}>255 ADDITIONAL_HEADERS ${TSAN_HEADERS}256 CFLAGS ${TSAN_RTL_CFLAGS}257 PARENT_TARGET tsan)258 add_compiler_rt_runtime(clang_rt.tsan_cxx259 STATIC260 ARCHS ${arch}261 SOURCES ${TSAN_CXX_SOURCES}262 ADDITIONAL_HEADERS ${TSAN_HEADERS}263 CFLAGS ${TSAN_RTL_CFLAGS}264 PARENT_TARGET tsan)265 list(APPEND TSAN_RUNTIME_LIBRARIES clang_rt.tsan-${arch}266 clang_rt.tsan_cxx-${arch})267 add_compiler_rt_runtime(clang_rt.tsan268 SHARED269 ARCHS ${arch}270 SOURCES ${TSAN_SOURCES} ${TSAN_ASM_SOURCES}271 $<TARGET_OBJECTS:RTInterception.${arch}>272 $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>273 $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>274 $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>275 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>276 $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}>277 $<TARGET_OBJECTS:RTUbsan.${arch}>278 ADDITIONAL_HEADERS ${TSAN_HEADERS}279 CFLAGS ${TSAN_RTL_DYNAMIC_CFLAGS}280 DEFS SANITIZER_SHARED281 LINK_LIBS ${TSAN_DYNAMIC_LINK_LIBS}282 LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}283 PARENT_TARGET tsan)284 add_sanitizer_rt_symbols(clang_rt.tsan285 ARCHS ${arch}286 EXTRA tsan.syms.extra)287 add_sanitizer_rt_symbols(clang_rt.tsan_cxx288 ARCHS ${arch}289 EXTRA tsan.syms.extra)290 add_dependencies(tsan clang_rt.tsan-${arch}291 clang_rt.tsan_cxx-${arch}292 clang_rt.tsan-${arch}-symbols293 clang_rt.tsan_cxx-${arch}-symbols)294 endforeach()295endif()296 297 298