xref: /llvm-project/llvm/utils/gn/secondary/compiler-rt/lib/tsan/rtl/BUILD.gn (revision 3f4bf998e897274758006f8423f2bdcd68cb2d55)
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