185 lines · plain
1import("//compiler-rt/target.gni")2 3source_set("cxx_sources") {4 configs -= [ "//llvm/utils/gn/build:llvm_code" ]5 configs += [ "//llvm/utils/gn/build:crt_code" ]6 sources = [ "tsan_new_delete.cpp" ]7}8 9if (current_os == "mac") {10 tsan_target_type = "shared_library"11} else {12 tsan_target_type = "static_library"13}14 15target(tsan_target_type, "rtl") {16 configs -= [ "//llvm/utils/gn/build:llvm_code" ]17 configs += [ "//llvm/utils/gn/build:crt_code" ]18 19 output_dir = crt_current_out_dir20 if (current_os == "mac") {21 output_name = "clang_rt.tsan_osx_dynamic"22 } else {23 assert(current_os != "win", "Tsan does not work on Windows")24 output_name = "clang_rt.tsan$crt_current_target_suffix"25 }26 27 deps = [28 "//compiler-rt/lib/interception:sources",29 "//compiler-rt/lib/sanitizer_common:sources",30 "//compiler-rt/lib/ubsan:sources",31 ]32 33 if (tsan_target_type == "static_library") {34 complete_static_lib = true35 configs -= [ "//llvm/utils/gn/build:thin_archive" ]36 deps += [ ":tsan_cxx" ]37 } else {38 deps += [39 ":cxx_sources",40 "//compiler-rt/lib/ubsan:cxx_sources",41 ]42 }43 44 # It's performance-critical for TSan runtime to be built with -fPIE to reduce45 # the number of register spills.46 cflags = [ "-fPIE" ]47 48 sources = [49 "tsan_debugging.cpp",50 "tsan_defs.h",51 "tsan_dense_alloc.h",52 "tsan_external.cpp",53 "tsan_fd.cpp",54 "tsan_fd.h",55 "tsan_flags.cpp",56 "tsan_flags.h",57 "tsan_flags.inc",58 "tsan_ignoreset.cpp",59 "tsan_ignoreset.h",60 "tsan_ilist.h",61 "tsan_interceptors.h",62 "tsan_interceptors_memintrinsics.cpp",63 "tsan_interceptors_posix.cpp",64 "tsan_interface.cpp",65 "tsan_interface.h",66 "tsan_interface.inc",67 "tsan_interface_ann.cpp",68 "tsan_interface_ann.h",69 "tsan_interface_atomic.cpp",70 "tsan_interface_java.cpp",71 "tsan_interface_java.h",72 "tsan_malloc_mac.cpp",73 "tsan_md5.cpp",74 "tsan_mman.cpp",75 "tsan_mman.h",76 "tsan_mutexset.cpp",77 "tsan_mutexset.h",78 "tsan_platform.h",79 "tsan_ppc_regs.h",80 "tsan_preinit.cpp",81 "tsan_report.cpp",82 "tsan_report.h",83 "tsan_rtl.cpp",84 "tsan_rtl.h",85 "tsan_rtl_access.cpp",86 "tsan_rtl_mutex.cpp",87 "tsan_rtl_proc.cpp",88 "tsan_rtl_report.cpp",89 "tsan_rtl_thread.cpp",90 "tsan_shadow.h",91 "tsan_stack_trace.cpp",92 "tsan_stack_trace.h",93 "tsan_suppressions.cpp",94 "tsan_suppressions.h",95 "tsan_symbolize.cpp",96 "tsan_symbolize.h",97 "tsan_sync.cpp",98 "tsan_sync.h",99 "tsan_trace.h",100 "tsan_update_shadow_word.inc",101 "tsan_vector_clock.cpp",102 "tsan_vector_clock.h",103 ]104 if (target_os == "mac") {105 sources += [106 "tsan_interceptors_libdispatch.cpp",107 "tsan_interceptors_mac.cpp",108 "tsan_interceptors_mach_vm.cpp",109 "tsan_platform_mac.cpp",110 "tsan_platform_posix.cpp",111 ]112 cflags += [ "-fblocks" ]113 } else {114 # Assume Linux115 sources += [116 "tsan_platform_linux.cpp",117 "tsan_platform_posix.cpp",118 ]119 }120 if (target_cpu == "x64") {121 sources += [ "tsan_rtl_amd64.S" ]122 } else if (target_cpu == "arm64") {123 sources += [ "tsan_rtl_aarch64.S" ]124 } else if (target_cpu == "loongarch64") {125 sources += [ "tsan_rtl_loongarch64.S" ]126 } else if (target_cpu == "mips64") {127 sources += [ "tsan_rtl_mips64.S" ]128 } else if (target_cpu == "powerpc64") {129 sources += [ "tsan_rtl_ppc64.S" ]130 } else if (target_cpu == "riscv64") {131 sources += [ "tsan_rtl_riscv64.S" ]132 } else if (target_cpu == "s390x") {133 sources += [ "tsan_rtl_s390x.S" ]134 }135 136 # FIXME: link rt dl m pthread log137 # FIXME: dep on libcxx-headers?138 # FIXME: add_sanitizer_rt_version_list (cf hwasan)139 # FIXME: need libclang_rt.tsan*.a.syms?140 # FIXME: tsan_ignorelist.txt141 142 if (target_os == "mac") {143 # The -U flags below correspond to the add_weak_symbols() calls in CMake.144 ldflags = [145 "-lc++",146 "-lc++abi",147 "-lobjc",148 149 # sanitizer_common150 "-Wl,-U,___sanitizer_free_hook",151 "-Wl,-U,___sanitizer_malloc_hook",152 "-Wl,-U,___sanitizer_report_error_summary",153 "-Wl,-U,___sanitizer_sandbox_on_notify",154 "-Wl,-U,___sanitizer_symbolize_code",155 "-Wl,-U,___sanitizer_symbolize_data",156 "-Wl,-U,___sanitizer_symbolize_frame",157 "-Wl,-U,___sanitizer_symbolize_demangle",158 "-Wl,-U,___sanitizer_symbolize_flush",159 "-Wl,-U,___sanitizer_symbolize_set_demangle",160 "-Wl,-U,___sanitizer_symbolize_set_inline_frames",161 162 # FIXME: better163 "-Wl,-install_name,@rpath/libclang_rt.tsan_osx_dynamic.dylib",164 ]165 # FIXME: -Wl,-rpath166 # FIXME: codesign (??)167 }168}169 170if (tsan_target_type == "static_library") {171 static_library("tsan_cxx") {172 assert(current_os != "win", "FIXME")173 output_dir = crt_current_out_dir174 output_name = "clang_rt.tsan_cxx$crt_current_target_suffix"175 complete_static_lib = true176 configs -= [ "//llvm/utils/gn/build:thin_archive" ]177 deps = [178 ":cxx_sources",179 "//compiler-rt/lib/ubsan:cxx_sources",180 ]181 }182}183# FIXME:184# Build libcxx instrumented with TSan.185