xref: /aosp_15_r20/external/angle/third_party/clspv/gn/llvm/config/BUILD.gn (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1# This setups the actions for generated header file headers used by the LLVM
2# libs. The below are heavily influenced by LLVM.
3import("//build_overrides/clspv.gni")
4
5# This sets up the generation of the cmake config files used for LLVM.
6# Based on the LLVM version
7
8import("../../triples.gni")
9import("../write_cmake_config.gni")
10
11import(
12    "//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/lib/DebugInfo/PDB/enable_dia.gni")
13
14import("//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/version.gni")
15
16# TODO check for deps
17import("../target/targets.gni")
18import("../target/targets_with_asm_parsers.gni")
19import("../target/targets_with_disassemblers.gni")
20import("../target/targets_with_exegesis.gni")
21import("../target/targets_with_mcas.gni")
22
23# Actions to create config.h, llvm-config.h, abi-breaking.h and various .def
24# files used by llvm/lib/Target. Based on
25# `llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.GN`
26
27declare_args() {
28  # Enable additional checks that alter the LLVM C++ ABI.
29  llvm_enable_abi_breaking_checks = llvm_enable_assertions
30
31  # Iterate unordered llvm containers in reverse.
32  llvm_enable_reverse_iteration = false
33
34  # Force enable statistics.
35  llvm_force_enable_stats = false
36
37  # glibc is at least 2.33 which has mallinfo2.
38  # TODO: remove this once nobody using the gn build is building against an old glibc.
39  llvm_have_mallinfo2 = false
40}
41
42write_cmake_config("abi-breaking") {
43  input = "//$clspv_llvm_dir/llvm/include/llvm/Config/abi-breaking.h.cmake"
44  output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/abi-breaking.h"
45  values = []
46
47  if (llvm_enable_abi_breaking_checks) {
48    values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ]
49  } else {
50    values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ]
51  }
52
53  if (llvm_enable_reverse_iteration) {
54    values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ]
55  } else {
56    values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ]
57  }
58}
59
60write_cmake_config("config") {
61  public_deps = [ ":llvm-config" ]
62
63  input = "//$clspv_llvm_dir/llvm/include/llvm/Config/config.h.cmake"
64  output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/config.h"
65  values = [
66    "BUG_REPORT_URL=https://github.com/llvm/llvm-project/issues/",
67    "ENABLE_BACKTRACES=1",
68    "ENABLE_CRASH_OVERRIDES=1",
69    "BACKTRACE_HEADER=execinfo.h",
70    "HAVE_BUILTIN_THREAD_POINTER=",
71    "HAVE_CRASHREPORTERCLIENT_H=",
72    "HAVE_DECL_FE_ALL_EXCEPT=1",
73    "HAVE_DECL_FE_INEXACT=1",
74    "LLVM_ENABLE_CRASH_DUMPS=",
75    "HAVE_ERRNO_H=1",
76    "HAVE_FCNTL_H=1",
77    "HAVE_FENV_H=1",
78    "HAVE_FFI_CALL=",
79    "HAVE_FFI_FFI_H=",
80    "HAVE_FFI_H=",
81    "HAVE_LIBPFM=",
82    "HAVE_LIBPSAPI=",
83    "HAVE_MALLCTL=",
84    "HAVE_SIGNAL_H=1",
85    "HAVE_SYS_STAT_H=1",
86    "HAVE_SYS_TYPES_H=1",
87    "HAVE_VALGRIND_VALGRIND_H=",
88    "HAVE__ALLOCA=",
89    "HAVE___ALLOCA=",
90    "HAVE___ASHLDI3=",
91    "HAVE___ASHRDI3=",
92    "HAVE___CHKSTK=",
93    "HAVE___CHKSTK_MS=",
94    "HAVE___CMPDI2=",
95    "HAVE___DIVDI3=",
96    "HAVE___FIXDFDI=",
97    "HAVE___FIXSFDI=",
98    "HAVE___FLOATDIDF=",
99    "HAVE___LSHRDI3=",
100    "HAVE___MAIN=",
101    "HAVE___MODDI3=",
102    "HAVE___UDIVDI3=",
103    "HAVE___UMODDI3=",
104    "HAVE____CHKSTK=",
105    "HAVE____CHKSTK_MS=",
106    "HOST_LINK_VERSION=",
107    "LIBPFM_HAS_FIELD_CYCLES=",
108    "LLVM_TARGET_TRIPLE_ENV=",
109    "LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1",
110    "LLVM_WINDOWS_PREFER_FORWARD_SLASH=",
111    "PACKAGE_BUGREPORT=https://github.com/llvm/llvm-project/issues/",
112    "PACKAGE_NAME=LLVM",
113    "PACKAGE_STRING=LLVM ${llvm_version}git",
114    "PACKAGE_VERSION=${llvm_version}git",
115    "PACKAGE_VENDOR=",
116    "LLVM_GISEL_COV_ENABLED=",
117    "LLVM_GISEL_COV_PREFIX=",
118
119    # FIXME: Set to 1 on mac once the 10.14 SDK is in common use.
120    "LLVM_SUPPORT_XCODE_SIGNPOSTS=",
121  ]
122
123  if (current_os == "linux" || current_os == "android") {
124    values += [
125      "HAVE_FUTIMENS=1",
126      "HAVE_LINK_H=1",
127      "HAVE_MALLINFO=1",
128      "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1",
129    ]
130  } else {
131    values += [
132      "HAVE_FUTIMENS=",
133      "HAVE_LINK_H=",
134      "HAVE_MALLINFO=",
135      "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=",
136    ]
137  }
138
139  if (current_os == "mac") {
140    values += [
141      "HAVE_CRASHREPORTER_INFO=1",
142      "HAVE_DECL_ARC4RANDOM=1",
143      "HAVE_DLADDR=1",
144      "HAVE_MACH_MACH_H=1",
145      "HAVE_MALLOC_MALLOC_H=1",
146      "HAVE_MALLOC_ZONE_STATISTICS=1",
147      "HAVE_PROC_PID_RUSAGE=1",
148      "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1",
149      "HAVE_UNW_ADD_DYNAMIC_FDE=1",
150    ]
151  } else {
152    values += [
153      "HAVE_CRASHREPORTER_INFO=",
154      "HAVE_DECL_ARC4RANDOM=",
155      "HAVE_DLADDR=",
156      "HAVE_MACH_MACH_H=",
157      "HAVE_MALLOC_MALLOC_H=",
158      "HAVE_MALLOC_ZONE_STATISTICS=",
159      "HAVE_PROC_PID_RUSAGE=",
160      "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=",
161      "HAVE_UNW_ADD_DYNAMIC_FDE=",
162    ]
163  }
164
165  if (current_os == "linux" || current_os == "mac") {
166    values += [
167      "HAVE_BACKTRACE=1",
168      "HAVE_POSIX_SPAWN=1",
169      "HAVE_PTHREAD_GETNAME_NP=1",
170    ]
171  } else {
172    values += [
173      "HAVE_BACKTRACE=",
174      "HAVE_POSIX_SPAWN=",
175      "HAVE_PTHREAD_GETNAME_NP=",
176    ]
177  }
178
179  if (current_os == "win" || current_cpu == "arm") {
180    values += [
181      "HAVE_DEREGISTER_FRAME=",
182      "HAVE_REGISTER_FRAME=",
183    ]
184  } else {
185    values += [
186      "HAVE_DEREGISTER_FRAME=1",
187      "HAVE_REGISTER_FRAME=1",
188    ]
189  }
190
191  if (current_os == "win") {
192    values += [
193      "HAVE_DECL_STRERROR_S=1",
194      "HAVE_DLFCN_H=",
195      "HAVE_DLOPEN=",
196      "HAVE_FUTIMES=",
197      "HAVE_GETPAGESIZE=",
198      "HAVE_GETRLIMIT=",
199      "HAVE_GETRUSAGE=",
200      "HAVE_ISATTY=",
201      "HAVE_LIBPTHREAD=",
202      "HAVE_PTHREAD_SETNAME_NP=",
203      "HAVE_PREAD=",
204      "HAVE_PTHREAD_H=",
205      "HAVE_PTHREAD_MUTEX_LOCK=",
206      "HAVE_PTHREAD_RWLOCK_INIT=",
207      "HAVE_SBRK=",
208      "HAVE_SETENV=",
209      "HAVE_SETRLIMIT=",
210      "HAVE_SIGALTSTACK=",
211      "HAVE_STRERROR_R=",
212      "HAVE_SYSCONF=",
213      "HAVE_SYS_IOCTL_H=",
214      "HAVE_SYS_MMAN_H=",
215      "HAVE_SYS_PARAM_H=",
216      "HAVE_SYS_RESOURCE_H=",
217      "HAVE_SYS_TIME_H=",
218      "HAVE_TERMIOS_H=",
219      "HAVE_UNISTD_H=",
220      "HAVE__CHSIZE_S=1",
221      "HAVE__UNWIND_BACKTRACE=",
222      "stricmp=_stricmp",
223      "strdup=_strdup",
224    ]
225  } else {
226    # POSIX-y system defaults.
227    values += [
228      "HAVE_DECL_STRERROR_S=",
229      "HAVE_DLFCN_H=1",
230      "HAVE_DLOPEN=1",
231      "HAVE_FUTIMES=1",
232      "HAVE_GETPAGESIZE=1",
233      "HAVE_GETRLIMIT=1",
234      "HAVE_GETRUSAGE=1",
235      "HAVE_ISATTY=1",
236      "HAVE_LIBPTHREAD=1",
237      "HAVE_PTHREAD_SETNAME_NP=1",
238      "HAVE_PREAD=1",
239      "HAVE_PTHREAD_H=1",
240      "HAVE_PTHREAD_MUTEX_LOCK=1",
241      "HAVE_PTHREAD_RWLOCK_INIT=1",
242      "HAVE_SBRK=1",
243      "HAVE_SETENV=1",
244      "HAVE_SETRLIMIT=1",
245      "HAVE_SIGALTSTACK=1",
246      "HAVE_STRERROR_R=1",
247      "HAVE_SYSCONF=1",
248      "HAVE_SYS_IOCTL_H=1",
249      "HAVE_SYS_MMAN_H=1",
250      "HAVE_SYS_PARAM_H=1",
251      "HAVE_SYS_RESOURCE_H=1",
252      "HAVE_SYS_TIME_H=1",
253      "HAVE_TERMIOS_H=1",
254      "HAVE_UNISTD_H=1",
255      "HAVE__CHSIZE_S=",
256      "HAVE__UNWIND_BACKTRACE=1",
257      "stricmp=",
258      "strdup=",
259    ]
260  }
261
262  if (current_os == "mac") {
263    shlib_ext = ".dylib"
264  } else if (current_os == "win") {
265    shlib_ext = ".dll"
266  } else {
267    shlib_ext = ".so"
268  }
269  values += [
270    "LLVM_PLUGIN_EXT=$shlib_ext",
271    "LTDL_SHLIB_EXT=$shlib_ext",
272  ]
273
274  if (llvm_enable_libedit) {
275    values += [ "HAVE_LIBEDIT=1" ]
276  } else {
277    values += [ "HAVE_LIBEDIT=" ]
278  }
279
280  if (llvm_enable_terminfo) {
281    values += [ "LLVM_ENABLE_TERMINFO=1" ]
282  } else {
283    values += [ "LLVM_ENABLE_TERMINFO=" ]
284  }
285
286  if (llvm_enable_libxml2) {
287    values += [ "LLVM_ENABLE_LIBXML2=1" ]
288  } else {
289    values += [ "LLVM_ENABLE_LIBXML2=" ]
290  }
291
292  if (llvm_have_mallinfo2) {
293    values += [ "HAVE_MALLINFO2=1" ]
294  } else {
295    values += [ "HAVE_MALLINFO2=" ]
296  }
297}
298
299write_cmake_config("llvm-config") {
300  input = "//$clspv_llvm_dir/llvm/include/llvm/Config/llvm-config.h.cmake"
301  output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/llvm-config.h"
302  values = [
303    "LLVM_BUILD_LLVM_DYLIB=",
304    "LLVM_BUILD_SHARED_LIBS=",
305    "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
306    "LLVM_ENABLE_DUMP=",
307    "LLVM_ENABLE_HTTPLIB=",
308    "LLVM_ENABLE_ZSTD=",
309    "LLVM_FORCE_USE_OLD_TOOLCHAIN=",
310    "LLVM_HAS_ATOMICS=1",
311    "LLVM_HAVE_TFLITE=",
312    "LLVM_HOST_TRIPLE=$llvm_current_triple",
313    "LLVM_NATIVE_ARCH=$native_target",
314    "LLVM_UNREACHABLE_OPTIMIZE=1",
315    "LLVM_USE_INTEL_JITEVENTS=",
316    "LLVM_USE_OPROFILE=",
317    "LLVM_USE_PERF=",
318    "LLVM_VERSION_MAJOR=$llvm_version_major",
319    "LLVM_VERSION_MINOR=$llvm_version_minor",
320    "LLVM_VERSION_PATCH=$llvm_version_patch",
321    "LLVM_WITH_Z3=",
322    "PACKAGE_VERSION=${llvm_version}git",
323  ]
324
325  if (llvm_build_native) {
326    values += [
327      "LLVM_NATIVE_ASMPARSER=1",
328      "LLVM_NATIVE_ASMPRINTER=1",
329      "LLVM_NATIVE_DISASSEMBLER=1",
330      "LLVM_NATIVE_TARGET=1",
331      "LLVM_NATIVE_TARGETINFO=1",
332      "LLVM_NATIVE_TARGETMC=1",
333      "LLVM_NATIVE_TARGETMCA=1",
334    ]
335  } else {
336    values += [
337      "LLVM_NATIVE_ASMPARSER=",
338      "LLVM_NATIVE_ASMPRINTER=",
339      "LLVM_NATIVE_DISASSEMBLER=",
340      "LLVM_NATIVE_TARGET=",
341      "LLVM_NATIVE_TARGETINFO=",
342      "LLVM_NATIVE_TARGETMC=",
343      "LLVM_NATIVE_TARGETMCA=",
344    ]
345  }
346
347  if (current_os == "win") {
348    values += [
349      "HAVE_SYSEXITS_H=",
350      "LLVM_ENABLE_PLUGINS=",
351      "LLVM_ON_UNIX=",
352    ]
353  } else {
354    values += [
355      "HAVE_SYSEXITS_H=1",
356      "LLVM_ENABLE_PLUGINS=1",
357      "LLVM_ON_UNIX=1",
358    ]
359  }
360
361  if (llvm_enable_dia_sdk) {
362    values += [ "LLVM_ENABLE_DIA_SDK=1" ]
363  } else {
364    values += [ "LLVM_ENABLE_DIA_SDK=" ]
365  }
366
367  if (llvm_enable_threads) {
368    values += [ "LLVM_ENABLE_THREADS=1" ]
369  } else {
370    values += [ "LLVM_ENABLE_THREADS=" ]
371  }
372
373  if (llvm_enable_zlib) {
374    values += [ "LLVM_ENABLE_ZLIB=1" ]
375  } else {
376    values += [ "LLVM_ENABLE_ZLIB=" ]
377  }
378
379  if (llvm_enable_libcurl) {
380    values += [ "LLVM_ENABLE_CURL=1" ]
381  } else {
382    values += [ "LLVM_ENABLE_CURL=" ]
383  }
384
385  if (llvm_force_enable_stats) {
386    values += [ "LLVM_FORCE_ENABLE_STATS=1" ]
387  } else {
388    values += [ "LLVM_FORCE_ENABLE_STATS=" ]
389  }
390
391  if (llvm_build_AArch64) {
392    values += [ "LLVM_HAS_AARCH64_TARGET=1" ]
393  } else {
394    values += [ "LLVM_HAS_AARCH64_TARGET=" ]
395  }
396
397  if (llvm_build_AMDGPU) {
398    values += [ "LLVM_HAS_AMDGPU_TARGET=1" ]
399  } else {
400    values += [ "LLVM_HAS_AMDGPU_TARGET=" ]
401  }
402
403  values += [ "LLVM_HAS_ARC_TARGET=" ]
404
405  if (llvm_build_ARM) {
406    values += [ "LLVM_HAS_ARM_TARGET=1" ]
407  } else {
408    values += [ "LLVM_HAS_ARM_TARGET=" ]
409  }
410
411  values += [ "LLVM_HAS_AVR_TARGET=" ]
412
413  if (llvm_build_BPF) {
414    values += [ "LLVM_HAS_BPF_TARGET=1" ]
415  } else {
416    values += [ "LLVM_HAS_BPF_TARGET=" ]
417  }
418
419  values += [ "LLVM_HAS_CSKY_TARGET=" ]
420  values += [ "LLVM_HAS_DIRECTX_TARGET=" ]
421  values += [ "LLVM_HAS_HEXAGON_TARGET=" ]
422  values += [ "LLVM_HAS_LANAI_TARGET=" ]
423
424  if (llvm_build_LoongArch) {
425    values += [ "LLVM_HAS_LOONGARCH_TARGET=1" ]
426  } else {
427    values += [ "LLVM_HAS_LOONGARCH_TARGET=" ]
428  }
429
430  values += [ "LLVM_HAS_M68K_TARGET=" ]
431
432  if (llvm_build_Mips) {
433    values += [ "LLVM_HAS_MIPS_TARGET=1" ]
434  } else {
435    values += [ "LLVM_HAS_MIPS_TARGET=" ]
436  }
437
438  values += [ "LLVM_HAS_MSP430_TARGET=" ]
439  values += [ "LLVM_HAS_NVPTX_TARGET=" ]
440
441  if (llvm_build_PowerPC) {
442    values += [ "LLVM_HAS_POWERPC_TARGET=1" ]
443  } else {
444    values += [ "LLVM_HAS_POWERPC_TARGET=" ]
445  }
446
447  if (llvm_build_RISCV) {
448    values += [ "LLVM_HAS_RISCV_TARGET=1" ]
449  } else {
450    values += [ "LLVM_HAS_RISCV_TARGET=" ]
451  }
452
453  values += [ "LLVM_HAS_SPARC_TARGET=" ]
454  values += [ "LLVM_HAS_SPIRV_TARGET=" ]
455
456  if (llvm_build_SystemZ) {
457    values += [ "LLVM_HAS_SYSTEMZ_TARGET=1" ]
458  } else {
459    values += [ "LLVM_HAS_SYSTEMZ_TARGET=" ]
460  }
461
462  values += [ "LLVM_HAS_VE_TARGET=" ]
463
464  if (llvm_build_WebAssembly) {
465    values += [ "LLVM_HAS_WEBASSEMBLY_TARGET=1" ]
466  } else {
467    values += [ "LLVM_HAS_WEBASSEMBLY_TARGET=" ]
468  }
469
470  if (llvm_build_X86) {
471    values += [ "LLVM_HAS_X86_TARGET=1" ]
472  } else {
473    values += [ "LLVM_HAS_X86_TARGET=" ]
474  }
475
476  values += [ "LLVM_HAS_XCORE_TARGET=" ]
477  values += [ "LLVM_HAS_XTENSA_TARGET=" ]
478}
479
480##############################################################################
481# .def files used by llvm/lib/Target
482
483template("write_target_def_file") {
484  assert(defined(invoker.key), "must set 'key' in $target_name")
485  assert(defined(invoker.value), "must set 'value' in $target_name")
486
487  write_cmake_config(target_name) {
488    visibility = [ ":write_target_def_files" ]
489
490    #input = "$target_name.in"
491    input = "//$clspv_llvm_dir/llvm/include/llvm/Config/$target_name.in"
492    output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/$target_name"
493
494    if (defined(invoker.all_targets)) {
495      all_targets = invoker.all_targets
496    } else {
497      all_targets = llvm_targets_to_build
498    }
499
500    # Build something like
501    # `LLVM_ENUM_ASM_PARSERS=LLVM_ASM_PARSER(ARM)\nLLVM_ASM_PARSER(X86)\n`. Note
502    # that \n is a literal '\' followed by a literal 'n', not a newline
503    # character.  (write_cmake_config.py replaces that with a real newline).
504    value = ""
505    foreach(target, all_targets) {
506      value = "$value${invoker.value}($target)\n"
507    }
508    if (all_targets == []) {
509      not_needed(invoker, [ "value" ])
510    }
511    values = [ "${invoker.key}=$value" ]
512  }
513}
514
515write_target_def_file("AsmParsers.def") {
516  key = "LLVM_ENUM_ASM_PARSERS"
517  value = "LLVM_ASM_PARSER"
518  all_targets = targets_with_asm_parsers
519}
520
521write_target_def_file("AsmPrinters.def") {
522  key = "LLVM_ENUM_ASM_PRINTERS"
523  value = "LLVM_ASM_PRINTER"
524}
525
526write_target_def_file("Disassemblers.def") {
527  key = "LLVM_ENUM_DISASSEMBLERS"
528  value = "LLVM_DISASSEMBLER"
529  all_targets = targets_with_disassemblers
530}
531
532write_target_def_file("Targets.def") {
533  key = "LLVM_ENUM_TARGETS"
534  value = "LLVM_TARGET"
535}
536
537write_target_def_file("TargetMCAs.def") {
538  key = "LLVM_ENUM_TARGETMCAS"
539  value = "LLVM_TARGETMCA"
540  all_targets = targets_with_mcas
541}
542
543write_target_def_file("TargetExegesis.def") {
544  key = "LLVM_ENUM_EXEGESIS"
545  value = "LLVM_EXEGESIS"
546  all_targets = targets_with_exegesis
547}
548
549group("write_target_def_files") {
550  #visibility = [
551  #  "//$clspv_llvm_dir/llvm/lib/Support",
552  #  "//$clspv_llvm_dir/llvm/lib/Target",
553  #]
554  deps = [
555    ":AsmParsers.def",
556    ":AsmPrinters.def",
557    ":Disassemblers.def",
558    ":TargetExegesis.def",
559    ":TargetMCAs.def",
560    ":Targets.def",
561  ]
562}
563
564# Corresponds to process_llvm_pass_plugins() in the CMake build.
565# For now, just turn everything off.
566# If we ever add real support for this, the GN way for this is probably
567# to have a declare_args() list with plugin names that people can override
568# in their args.gn and with empty defaults (similar to llvm_targets_to_build).
569action("write_extension_def") {
570  script = "//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/include/llvm/Support/write_extension_def.py"
571  outputs = [ "$root_gen_dir/$clspv_llvm_dir/llvm/Support/Extension.def" ]
572
573  # If any extensions should be enabled, they'd be passed as additional
574  # arguments, e.g. `args += [ "Bye", "Polly" ]`.
575  args = [
576    "-o",
577    rebase_path(outputs[0], root_build_dir),
578  ]
579}
580