163d518f3SNico Weberimport("//compiler-rt/target.gni") 263d518f3SNico Weber 363d518f3SNico Webersource_set("cxx_sources") { 463d518f3SNico Weber configs -= [ "//llvm/utils/gn/build:llvm_code" ] 563d518f3SNico Weber configs += [ "//llvm/utils/gn/build:crt_code" ] 663d518f3SNico Weber sources = [ "tsan_new_delete.cpp" ] 763d518f3SNico Weber} 863d518f3SNico Weber 963d518f3SNico Weberif (current_os == "mac") { 1063d518f3SNico Weber tsan_target_type = "shared_library" 1163d518f3SNico Weber} else { 1263d518f3SNico Weber tsan_target_type = "static_library" 1363d518f3SNico Weber} 1463d518f3SNico Weber 1563d518f3SNico Webertarget(tsan_target_type, "rtl") { 1663d518f3SNico Weber configs -= [ "//llvm/utils/gn/build:llvm_code" ] 1763d518f3SNico Weber configs += [ "//llvm/utils/gn/build:crt_code" ] 1863d518f3SNico Weber 1963d518f3SNico Weber output_dir = crt_current_out_dir 2063d518f3SNico Weber if (current_os == "mac") { 2163d518f3SNico Weber output_name = "clang_rt.tsan_osx_dynamic" 2263d518f3SNico Weber } else { 2363d518f3SNico Weber assert(current_os != "win", "Tsan does not work on Windows") 2463d518f3SNico Weber output_name = "clang_rt.tsan$crt_current_target_suffix" 2563d518f3SNico Weber } 2663d518f3SNico Weber 2763d518f3SNico Weber deps = [ 2863d518f3SNico Weber "//compiler-rt/lib/interception:sources", 2963d518f3SNico Weber "//compiler-rt/lib/sanitizer_common:sources", 3063d518f3SNico Weber "//compiler-rt/lib/ubsan:sources", 3163d518f3SNico Weber ] 3263d518f3SNico Weber 3363d518f3SNico Weber if (tsan_target_type == "static_library") { 3463d518f3SNico Weber complete_static_lib = true 3563d518f3SNico Weber configs -= [ "//llvm/utils/gn/build:thin_archive" ] 3663d518f3SNico Weber deps += [ ":tsan_cxx" ] 3763d518f3SNico Weber } else { 3863d518f3SNico Weber deps += [ 3963d518f3SNico Weber ":cxx_sources", 4063d518f3SNico Weber "//compiler-rt/lib/ubsan:cxx_sources", 4163d518f3SNico Weber ] 4263d518f3SNico Weber } 4363d518f3SNico Weber 4463d518f3SNico Weber # It's performance-critical for TSan runtime to be built with -fPIE to reduce 4563d518f3SNico Weber # the number of register spills. 4663d518f3SNico Weber cflags = [ "-fPIE" ] 4763d518f3SNico Weber 4863d518f3SNico Weber sources = [ 4963d518f3SNico Weber "tsan_debugging.cpp", 5063d518f3SNico Weber "tsan_defs.h", 5163d518f3SNico Weber "tsan_dense_alloc.h", 5263d518f3SNico Weber "tsan_external.cpp", 5363d518f3SNico Weber "tsan_fd.cpp", 5463d518f3SNico Weber "tsan_fd.h", 5563d518f3SNico Weber "tsan_flags.cpp", 5663d518f3SNico Weber "tsan_flags.h", 5763d518f3SNico Weber "tsan_flags.inc", 5863d518f3SNico Weber "tsan_ignoreset.cpp", 5963d518f3SNico Weber "tsan_ignoreset.h", 6063d518f3SNico Weber "tsan_ilist.h", 6163d518f3SNico Weber "tsan_interceptors.h", 62c551c9c3SMarco Elver "tsan_interceptors_memintrinsics.cpp", 6363d518f3SNico Weber "tsan_interceptors_posix.cpp", 6463d518f3SNico Weber "tsan_interface.cpp", 6563d518f3SNico Weber "tsan_interface.h", 6663d518f3SNico Weber "tsan_interface.inc", 6763d518f3SNico Weber "tsan_interface_ann.cpp", 6863d518f3SNico Weber "tsan_interface_ann.h", 6963d518f3SNico Weber "tsan_interface_atomic.cpp", 7063d518f3SNico Weber "tsan_interface_java.cpp", 7163d518f3SNico Weber "tsan_interface_java.h", 7263d518f3SNico Weber "tsan_malloc_mac.cpp", 7363d518f3SNico Weber "tsan_md5.cpp", 7463d518f3SNico Weber "tsan_mman.cpp", 7563d518f3SNico Weber "tsan_mman.h", 7663d518f3SNico Weber "tsan_mutexset.cpp", 7763d518f3SNico Weber "tsan_mutexset.h", 7863d518f3SNico Weber "tsan_platform.h", 7963d518f3SNico Weber "tsan_ppc_regs.h", 8063d518f3SNico Weber "tsan_preinit.cpp", 8163d518f3SNico Weber "tsan_report.cpp", 8263d518f3SNico Weber "tsan_report.h", 8363d518f3SNico Weber "tsan_rtl.cpp", 8463d518f3SNico Weber "tsan_rtl.h", 8563d518f3SNico Weber "tsan_rtl_access.cpp", 8663d518f3SNico Weber "tsan_rtl_mutex.cpp", 8763d518f3SNico Weber "tsan_rtl_proc.cpp", 8863d518f3SNico Weber "tsan_rtl_report.cpp", 8963d518f3SNico Weber "tsan_rtl_thread.cpp", 9063d518f3SNico Weber "tsan_shadow.h", 9163d518f3SNico Weber "tsan_stack_trace.cpp", 9263d518f3SNico Weber "tsan_stack_trace.h", 9363d518f3SNico Weber "tsan_suppressions.cpp", 9463d518f3SNico Weber "tsan_suppressions.h", 9563d518f3SNico Weber "tsan_symbolize.cpp", 9663d518f3SNico Weber "tsan_symbolize.h", 9763d518f3SNico Weber "tsan_sync.cpp", 9863d518f3SNico Weber "tsan_sync.h", 9963d518f3SNico Weber "tsan_trace.h", 10063d518f3SNico Weber "tsan_update_shadow_word.inc", 10163d518f3SNico Weber "tsan_vector_clock.cpp", 10263d518f3SNico Weber "tsan_vector_clock.h", 10363d518f3SNico Weber ] 10463d518f3SNico Weber if (target_os == "mac") { 10563d518f3SNico Weber sources += [ 10663d518f3SNico Weber "tsan_interceptors_libdispatch.cpp", 10763d518f3SNico Weber "tsan_interceptors_mac.cpp", 10863d518f3SNico Weber "tsan_interceptors_mach_vm.cpp", 10963d518f3SNico Weber "tsan_platform_mac.cpp", 11063d518f3SNico Weber "tsan_platform_posix.cpp", 11163d518f3SNico Weber ] 11263d518f3SNico Weber cflags += [ "-fblocks" ] 11363d518f3SNico Weber } else { 11463d518f3SNico Weber # Assume Linux 11563d518f3SNico Weber sources += [ 11663d518f3SNico Weber "tsan_platform_linux.cpp", 11763d518f3SNico Weber "tsan_platform_posix.cpp", 11863d518f3SNico Weber ] 11963d518f3SNico Weber } 12063d518f3SNico Weber if (target_cpu == "x64") { 12163d518f3SNico Weber sources += [ "tsan_rtl_amd64.S" ] 12263d518f3SNico Weber } else if (target_cpu == "arm64") { 12363d518f3SNico Weber sources += [ "tsan_rtl_aarch64.S" ] 1240b151c94SNico Weber } else if (target_cpu == "loongarch64") { 1250b151c94SNico Weber sources += [ "tsan_rtl_loongarch64.S" ] 12663d518f3SNico Weber } else if (target_cpu == "mips64") { 12763d518f3SNico Weber sources += [ "tsan_rtl_mips64.S" ] 128953ad29eSNico Weber } else if (target_cpu == "powerpc64") { 129953ad29eSNico Weber sources += [ "tsan_rtl_ppc64.S" ] 130*3f4bf998SNico Weber } else if (target_cpu == "riscv64") { 131*3f4bf998SNico Weber sources += [ "tsan_rtl_riscv64.S" ] 13263d518f3SNico Weber } else if (target_cpu == "s390x") { 13363d518f3SNico Weber sources += [ "tsan_rtl_s390x.S" ] 13463d518f3SNico Weber } 13563d518f3SNico Weber 13663d518f3SNico Weber # FIXME: link rt dl m pthread log 13763d518f3SNico Weber # FIXME: dep on libcxx-headers? 13863d518f3SNico Weber # FIXME: add_sanitizer_rt_version_list (cf hwasan) 13963d518f3SNico Weber # FIXME: need libclang_rt.tsan*.a.syms? 14063d518f3SNico Weber # FIXME: tsan_ignorelist.txt 14163d518f3SNico Weber 14263d518f3SNico Weber if (target_os == "mac") { 14363d518f3SNico Weber # The -U flags below correspond to the add_weak_symbols() calls in CMake. 14463d518f3SNico Weber ldflags = [ 14563d518f3SNico Weber "-lc++", 14663d518f3SNico Weber "-lc++abi", 14763d518f3SNico Weber "-lobjc", 14863d518f3SNico Weber 14963d518f3SNico Weber # sanitizer_common 15063d518f3SNico Weber "-Wl,-U,___sanitizer_free_hook", 15163d518f3SNico Weber "-Wl,-U,___sanitizer_malloc_hook", 15263d518f3SNico Weber "-Wl,-U,___sanitizer_report_error_summary", 15363d518f3SNico Weber "-Wl,-U,___sanitizer_sandbox_on_notify", 15463d518f3SNico Weber "-Wl,-U,___sanitizer_symbolize_code", 15563d518f3SNico Weber "-Wl,-U,___sanitizer_symbolize_data", 1567d495d67SVitaly Buka "-Wl,-U,___sanitizer_symbolize_frame", 15763d518f3SNico Weber "-Wl,-U,___sanitizer_symbolize_demangle", 15863d518f3SNico Weber "-Wl,-U,___sanitizer_symbolize_flush", 159ee4bbb50SNico Weber "-Wl,-U,___sanitizer_symbolize_set_demangle", 1605fd328c4SNico Weber "-Wl,-U,___sanitizer_symbolize_set_inline_frames", 16163d518f3SNico Weber 16263d518f3SNico Weber # FIXME: better 16363d518f3SNico Weber "-Wl,-install_name,@rpath/libclang_rt.tsan_osx_dynamic.dylib", 16463d518f3SNico Weber ] 16563d518f3SNico Weber # FIXME: -Wl,-rpath 16663d518f3SNico Weber # FIXME: codesign (??) 16763d518f3SNico Weber } 16863d518f3SNico Weber} 16963d518f3SNico Weber 17063d518f3SNico Weberif (tsan_target_type == "static_library") { 17163d518f3SNico Weber static_library("tsan_cxx") { 17263d518f3SNico Weber assert(current_os != "win", "FIXME") 17363d518f3SNico Weber output_dir = crt_current_out_dir 17463d518f3SNico Weber output_name = "clang_rt.tsan_cxx$crt_current_target_suffix" 17563d518f3SNico Weber complete_static_lib = true 17663d518f3SNico Weber configs -= [ "//llvm/utils/gn/build:thin_archive" ] 17763d518f3SNico Weber deps = [ 17863d518f3SNico Weber ":cxx_sources", 17963d518f3SNico Weber "//compiler-rt/lib/ubsan:cxx_sources", 18063d518f3SNico Weber ] 18163d518f3SNico Weber } 18263d518f3SNico Weber} 18363d518f3SNico Weber# FIXME: 18463d518f3SNico Weber# Build libcxx instrumented with TSan. 185