xref: /llvm-project/llvm/utils/gn/secondary/compiler-rt/lib/tsan/rtl/BUILD.gn (revision 3f4bf998e897274758006f8423f2bdcd68cb2d55)
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_dir
20  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 = true
35    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 reduce
45  # 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 Linux
115    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 log
137  # 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.txt
141
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_common
150      "-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: better
163      "-Wl,-install_name,@rpath/libclang_rt.tsan_osx_dynamic.dylib",
164    ]
165    # FIXME: -Wl,-rpath
166    # 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_dir
174    output_name = "clang_rt.tsan_cxx$crt_current_target_suffix"
175    complete_static_lib = true
176    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