xref: /netbsd-src/external/apache2/llvm/dist/llvm/utils/gn/secondary/compiler-rt/lib/tsan/BUILD.gn (revision 82d56013d7b633d116a93943de88e08335357a7c)
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 = [ "rtl/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, "tsan") {
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    "rtl/tsan_clock.cpp",
50    "rtl/tsan_clock.h",
51    "rtl/tsan_debugging.cpp",
52    "rtl/tsan_defs.h",
53    "rtl/tsan_dense_alloc.h",
54    "rtl/tsan_external.cpp",
55    "rtl/tsan_fd.cpp",
56    "rtl/tsan_fd.h",
57    "rtl/tsan_flags.cpp",
58    "rtl/tsan_flags.h",
59    "rtl/tsan_flags.inc",
60    "rtl/tsan_ignoreset.cpp",
61    "rtl/tsan_ignoreset.h",
62    "rtl/tsan_interceptors.h",
63    "rtl/tsan_interceptors_posix.cpp",
64    "rtl/tsan_interface.cpp",
65    "rtl/tsan_interface.h",
66    "rtl/tsan_interface_ann.cpp",
67    "rtl/tsan_interface_ann.h",
68    "rtl/tsan_interface_atomic.cpp",
69    "rtl/tsan_interface_inl.h",
70    "rtl/tsan_interface_java.cpp",
71    "rtl/tsan_interface_java.h",
72    "rtl/tsan_malloc_mac.cpp",
73    "rtl/tsan_md5.cpp",
74    "rtl/tsan_mman.cpp",
75    "rtl/tsan_mman.h",
76    "rtl/tsan_mutex.cpp",
77    "rtl/tsan_mutex.h",
78    "rtl/tsan_mutexset.cpp",
79    "rtl/tsan_mutexset.h",
80    "rtl/tsan_platform.h",
81    "rtl/tsan_ppc_regs.h",
82    "rtl/tsan_preinit.cpp",
83    "rtl/tsan_report.cpp",
84    "rtl/tsan_report.h",
85    "rtl/tsan_rtl.cpp",
86    "rtl/tsan_rtl.h",
87    "rtl/tsan_rtl_mutex.cpp",
88    "rtl/tsan_rtl_proc.cpp",
89    "rtl/tsan_rtl_report.cpp",
90    "rtl/tsan_rtl_thread.cpp",
91    "rtl/tsan_stack_trace.cpp",
92    "rtl/tsan_stack_trace.h",
93    "rtl/tsan_stat.cpp",
94    "rtl/tsan_stat.h",
95    "rtl/tsan_suppressions.cpp",
96    "rtl/tsan_suppressions.h",
97    "rtl/tsan_symbolize.cpp",
98    "rtl/tsan_symbolize.h",
99    "rtl/tsan_sync.cpp",
100    "rtl/tsan_sync.h",
101    "rtl/tsan_trace.h",
102    "rtl/tsan_update_shadow_word_inl.h",
103  ]
104  if (target_os == "mac") {
105    sources += [
106      "rtl/tsan_interceptors_libdispatch.cpp",
107      "rtl/tsan_interceptors_mac.cpp",
108      "rtl/tsan_interceptors_mach_vm.cpp",
109      "rtl/tsan_platform_mac.cpp",
110      "rtl/tsan_platform_posix.cpp",
111    ]
112    cflags += [ "-fblocks" ]
113  } else {
114    # Assume Linux
115    sources += [
116      "rtl/tsan_platform_linux.cpp",
117      "rtl/tsan_platform_posix.cpp",
118    ]
119  }
120  if (target_cpu == "x64") {
121    sources += [ "rtl/tsan_rtl_amd64.S" ]
122  } else if (target_cpu == "arm64") {
123    sources += [ "rtl/tsan_rtl_aarch64.S" ]
124  } else if (target_cpu == "powerpc64") {
125    sources += [ "rtl/tsan_rtl_ppc64.S" ]
126  } else if (target_cpu == "mips64") {
127    sources += [ "rtl/tsan_rtl_mips64.S" ]
128  }
129
130  # To be able to include sanitizer_common.
131  include_dirs = [ ".." ]
132
133  # FIXME: have SANITIZER_COMMON_CFLAGS thingy? should fno-builtin be in
134  # crt_code?
135  cflags += [ "-fno-builtin" ]
136
137  # FIXME: link rt dl m pthread log
138  # FIXME: dep on libcxx-headers?
139  # FIXME: add_sanitizer_rt_version_list (cf hwasan)
140  # FIXME: need libclang_rt.tsan*.a.syms?
141  # FIXME: tsan_ignorelist.txt
142
143  if (target_os == "mac") {
144    # The -U flags below correspond to the add_weak_symbols() calls in CMake.
145    ldflags = [
146      "-lc++",
147      "-lc++abi",
148      "-lobjc",
149
150      # sanitizer_common
151      "-Wl,-U,___sanitizer_free_hook",
152      "-Wl,-U,___sanitizer_malloc_hook",
153      "-Wl,-U,___sanitizer_report_error_summary",
154      "-Wl,-U,___sanitizer_sandbox_on_notify",
155      "-Wl,-U,___sanitizer_symbolize_code",
156      "-Wl,-U,___sanitizer_symbolize_data",
157      "-Wl,-U,___sanitizer_symbolize_demangle",
158      "-Wl,-U,___sanitizer_symbolize_flush",
159
160      # FIXME: better
161      "-Wl,-install_name,@rpath/libclang_rt.tsan_osx_dynamic.dylib",
162    ]
163    # FIXME: -Wl,-rpath
164    # FIXME: codesign (??)
165  }
166}
167
168if (tsan_target_type == "static_library") {
169  static_library("tsan_cxx") {
170    assert(current_os != "win", "FIXME")
171    output_dir = crt_current_out_dir
172    output_name = "clang_rt.tsan_cxx$crt_current_target_suffix"
173    complete_static_lib = true
174    configs -= [ "//llvm/utils/gn/build:thin_archive" ]
175    deps = [
176      ":cxx_sources",
177      "//compiler-rt/lib/ubsan:cxx_sources",
178    ]
179  }
180}
181# FIXME:
182# Build libcxx instrumented with TSan.
183