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