xref: /llvm-project/llvm/utils/gn/secondary/compiler-rt/lib/asan/BUILD.gn (revision bea2f2511b69521dc73766b8e3503f11e378113b)
1import("//compiler-rt/target.gni")
2
3if (current_toolchain == host_toolchain) {
4  copy("ignorelist") {
5    sources = [ "asan_ignorelist.txt" ]
6    outputs = [ "$clang_resource_dir/share/{{source_target_relative}}" ]
7  }
8} else {
9  asan_sources = [
10    "asan_activation.cpp",
11    "asan_activation.h",
12    "asan_activation_flags.inc",
13    "asan_allocator.cpp",
14    "asan_allocator.h",
15    "asan_debugging.cpp",
16    "asan_descriptions.cpp",
17    "asan_descriptions.h",
18    "asan_errors.cpp",
19    "asan_errors.h",
20    "asan_fake_stack.cpp",
21    "asan_fake_stack.h",
22    "asan_flags.cpp",
23    "asan_flags.h",
24    "asan_flags.inc",
25    "asan_fuchsia.cpp",
26    "asan_globals.cpp",
27    "asan_globals_win.cpp",
28    "asan_init_version.h",
29    "asan_interceptors.cpp",
30    "asan_interceptors.h",
31    "asan_interceptors_memintrinsics.cpp",
32    "asan_interceptors_memintrinsics.h",
33    "asan_interface.inc",
34    "asan_interface_internal.h",
35    "asan_internal.h",
36    "asan_linux.cpp",
37    "asan_mac.cpp",
38    "asan_malloc_linux.cpp",
39    "asan_malloc_mac.cpp",
40    "asan_malloc_win.cpp",
41    "asan_mapping.h",
42    "asan_memory_profile.cpp",
43    "asan_poisoning.cpp",
44    "asan_poisoning.h",
45    "asan_posix.cpp",
46    "asan_premap_shadow.cpp",
47    "asan_premap_shadow.h",
48    "asan_report.cpp",
49    "asan_report.h",
50    "asan_rtl.cpp",
51    "asan_scariness_score.h",
52    "asan_shadow_setup.cpp",
53    "asan_stack.cpp",
54    "asan_stack.h",
55    "asan_stats.cpp",
56    "asan_stats.h",
57    "asan_suppressions.cpp",
58    "asan_suppressions.h",
59    "asan_thread.cpp",
60    "asan_thread.h",
61    "asan_win.cpp",
62  ]
63  if (current_os != "mac" && current_os != "win") {
64    asan_sources += [ "asan_interceptors_vfork.S" ]
65  }
66  config("asan_config") {
67    cflags = []
68    if (current_os != "win") {
69      cflags += [ "-ftls-model=initial-exec" ]
70    } else {
71      ldflags = [ "/OPT:NOICF" ]
72    }
73
74    # FIXME: link rt dl m pthread log
75    # FIXME: dep on libcxx-headers?
76    # FIXME: add_sanitizer_rt_version_list (cf hwasan)
77    # FIXME: need libclang_rt.asan*.a.syms?
78
79    if (current_os == "android") {
80      ldflags = [ "-Wl,-z,global" ]
81    }
82
83    if (current_os == "mac") {
84      # The -U flags below correspond to the add_weak_symbols() calls in CMake.
85      ldflags = [
86        "-lc++",
87        "-lc++abi",
88
89        # asan
90        "-Wl,-U,___asan_default_options",
91        "-Wl,-U,___asan_default_suppressions",
92        "-Wl,-U,___asan_on_error",
93        "-Wl,-U,___asan_set_shadow_00",
94        "-Wl,-U,___asan_set_shadow_f1",
95        "-Wl,-U,___asan_set_shadow_f2",
96        "-Wl,-U,___asan_set_shadow_f3",
97        "-Wl,-U,___asan_set_shadow_f4",
98        "-Wl,-U,___asan_set_shadow_f5",
99        "-Wl,-U,___asan_set_shadow_f6",
100        "-Wl,-U,___asan_set_shadow_f7",
101        "-Wl,-U,___asan_set_shadow_f8",
102
103        # lsan
104        "-Wl,-U,___lsan_default_options",
105        "-Wl,-U,___lsan_default_suppressions",
106        "-Wl,-U,___lsan_is_turned_off",
107
108        # ubsan
109        "-Wl,-U,___ubsan_default_options",
110
111        # sanitizer_common
112        "-Wl,-U,___sanitizer_free_hook",
113        "-Wl,-U,___sanitizer_malloc_hook",
114        "-Wl,-U,___sanitizer_report_error_summary",
115        "-Wl,-U,___sanitizer_sandbox_on_notify",
116        "-Wl,-U,___sanitizer_symbolize_code",
117        "-Wl,-U,___sanitizer_symbolize_data",
118        "-Wl,-U,___sanitizer_symbolize_frame",
119        "-Wl,-U,___sanitizer_symbolize_demangle",
120        "-Wl,-U,___sanitizer_symbolize_flush",
121        "-Wl,-U,___sanitizer_symbolize_set_demangle",
122        "-Wl,-U,___sanitizer_symbolize_set_inline_frames",
123
124        # xray
125        "-Wl,-U,___start_xray_fn_idx",
126        "-Wl,-U,___start_xray_instr_map",
127        "-Wl,-U,___stop_xray_fn_idx",
128        "-Wl,-U,___stop_xray_instr_map",
129
130        # FIXME: better
131        "-Wl,-install_name,@rpath/libclang_rt.asan_osx_dynamic.dylib",
132      ]
133      # FIXME: -Wl,-rpath
134      # FIXME: codesign (??)
135    }
136  }
137
138  source_set("cxx_sources") {
139    configs -= [ "//llvm/utils/gn/build:llvm_code" ]
140    configs += [ "//llvm/utils/gn/build:crt_code" ]
141    sources = [ "asan_new_delete.cpp" ]
142  }
143
144  source_set("static_sources") {
145    configs -= [ "//llvm/utils/gn/build:llvm_code" ]
146    configs += [ "//llvm/utils/gn/build:crt_code" ]
147    sources = [ "asan_rtl_static.cpp" ]
148    if (current_os != "mac" && current_os != "win") {
149      sources += [ "asan_rtl_x86_64.S" ]
150    }
151  }
152
153  source_set("preinit_sources") {
154    configs -= [ "//llvm/utils/gn/build:llvm_code" ]
155    configs += [ "//llvm/utils/gn/build:crt_code" ]
156    sources = [ "asan_preinit.cpp" ]
157  }
158
159  shared_library("asan_shared_library") {
160    output_dir = crt_current_out_dir
161    if (current_os == "mac") {
162      output_name = "clang_rt.asan_osx_dynamic"
163    } else if (current_os == "win") {
164      output_name = "clang_rt.asan_dynamic$crt_current_target_suffix"
165    } else {
166      output_name = "clang_rt.asan$crt_current_target_suffix"
167    }
168    configs -= [ "//llvm/utils/gn/build:llvm_code" ]
169    configs += [ "//llvm/utils/gn/build:crt_code" ]
170    configs += [ ":asan_config" ]
171    sources = asan_sources
172    deps = [
173      ":cxx_sources",
174      "//compiler-rt/lib/interception:sources",
175      "//compiler-rt/lib/lsan:common_sources",
176      "//compiler-rt/lib/sanitizer_common:sources",
177      "//compiler-rt/lib/ubsan:cxx_sources",
178      "//compiler-rt/lib/ubsan:sources",
179    ]
180    defines = [ "ASAN_DYNAMIC" ]
181    if (current_os == "win") {
182      defines += [ "INTERCEPTION_DYNAMIC_CRT" ]
183    }
184  }
185
186  if (current_os != "mac" && current_os != "win") {
187    static_library("asan_static_library") {
188      output_dir = crt_current_out_dir
189      output_name = "clang_rt.asan$crt_current_target_suffix"
190      complete_static_lib = true
191      configs -= [ "//llvm/utils/gn/build:llvm_code" ]
192      configs += [ "//llvm/utils/gn/build:crt_code" ]
193      configs += [ ":asan_config" ]
194      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
195      sources = asan_sources
196      deps = [
197        ":preinit_sources",
198        "//compiler-rt/lib/interception:sources",
199        "//compiler-rt/lib/lsan:common_sources",
200        "//compiler-rt/lib/sanitizer_common:sources",
201        "//compiler-rt/lib/ubsan:sources",
202      ]
203    }
204
205    static_library("asan_cxx") {
206      output_dir = crt_current_out_dir
207      output_name = "clang_rt.asan_cxx$crt_current_target_suffix"
208      complete_static_lib = true
209      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
210      deps = [
211        ":cxx_sources",
212        "//compiler-rt/lib/ubsan:cxx_sources",
213      ]
214    }
215
216    static_library("asan_static") {
217      output_dir = crt_current_out_dir
218      output_name = "clang_rt.asan_static$crt_current_target_suffix"
219      complete_static_lib = true
220      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
221      deps = [ ":static_sources" ]
222    }
223
224    static_library("asan_preinit") {
225      output_dir = crt_current_out_dir
226      output_name = "clang_rt.asan-preinit$crt_current_target_suffix"
227      complete_static_lib = true
228      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
229      deps = [ ":preinit_sources" ]
230    }
231  }
232  if (current_os == "win") {
233    static_library("asan_static_runtime_thunk") {
234      output_dir = crt_current_out_dir
235      output_name =
236          "clang_rt.asan_static_runtime_thunk$crt_current_target_suffix"
237      configs -= [ "//llvm/utils/gn/build:llvm_code" ]
238      configs += [ "//llvm/utils/gn/build:crt_code" ]
239      complete_static_lib = true
240      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
241      sources = [
242        "asan_globals_win.cpp",
243        "asan_malloc_win_thunk.cpp",
244        "asan_win_common_runtime_thunk.cpp",
245        "asan_win_static_runtime_thunk.cpp",
246      ]
247      defines = [ "SANITIZER_STATIC_RUNTIME_THUNK" ]
248      deps = [
249        "//compiler-rt/lib/interception:sources",
250        "//compiler-rt/lib/sanitizer_common:runtime_thunk",
251        "//compiler-rt/lib/sanitizer_common:sancov_runtime_thunk",
252        "//compiler-rt/lib/ubsan:runtime_thunk",
253      ]
254    }
255    static_library("asan_dynamic_runtime_thunk") {
256      output_dir = crt_current_out_dir
257      output_name =
258          "clang_rt.asan_dynamic_runtime_thunk$crt_current_target_suffix"
259      configs -= [ "//llvm/utils/gn/build:llvm_code" ]
260      configs += [ "//llvm/utils/gn/build:crt_code" ]
261      complete_static_lib = true
262      configs -= [ "//llvm/utils/gn/build:thin_archive" ]
263      sources = [
264        "asan_globals_win.cpp",
265        "asan_win_common_runtime_thunk.cpp",
266        "asan_win_dynamic_runtime_thunk.cpp",
267      ]
268      defines = [ "SANITIZER_DYNAMIC_RUNTIME_THUNK" ]
269      deps = [
270        "//compiler-rt/lib/sanitizer_common:runtime_thunk",
271        "//compiler-rt/lib/sanitizer_common:sancov_runtime_thunk",
272        "//compiler-rt/lib/ubsan:runtime_thunk",
273      ]
274      cflags = [ "-Zl" ]
275    }
276  }
277  group("asan") {
278    deps = [ ":asan_shared_library" ]
279    if (current_os == "win") {
280      deps += [
281        ":asan_dynamic_runtime_thunk",
282        ":asan_static_runtime_thunk",
283      ]
284    }
285    if (current_os != "mac" && current_os != "win") {
286      deps += [
287        ":asan_cxx",
288        ":asan_preinit",
289        ":asan_static",
290        ":asan_static_library",
291      ]
292    }
293  }
294}
295