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