1import("//llvm/lib/DebugInfo/PDB/enable_dia.gni")
2import("//llvm/lib/Target/targets.gni")
3import("//llvm/lib/Target/targets_with_asm_parsers.gni")
4import("//llvm/lib/Target/targets_with_disassemblers.gni")
5import("//llvm/triples.gni")
6import("//llvm/utils/gn/build/buildflags.gni")
7import("//llvm/utils/gn/build/libs/edit/enable.gni")
8import("//llvm/utils/gn/build/libs/pthread/enable.gni")
9import("//llvm/utils/gn/build/libs/terminfo/enable.gni")
10import("//llvm/utils/gn/build/libs/xar/enable.gni")
11import("//llvm/utils/gn/build/libs/xml/enable.gni")
12import("//llvm/utils/gn/build/libs/zlib/enable.gni")
13import("//llvm/utils/gn/build/write_cmake_config.gni")
14import("//llvm/version.gni")
15
16# Contains actions to create config.h, llvm-config.h, abi-breaking.h,
17# and the various .def files used by llvm/lib/Target.
18# Other than in the cmake build, these are created at build time, not at
19# config time. That way, they can run in parallel, and this pattern means that
20# e.g. creating the clang config header (which happens in another gn file)
21# doesn't block building lld.
22
23# The headers are created by processing the foo.h.cmake files as input,
24# to keep the gn build close to the cmake build.
25
26# Other than in the cmake build, header generation doesn't do any feature
27# checking. See also "Philosophy" in llvm/utils/gn/README.rst.
28
29##############################################################################
30# config.h, llvm-config.h, abi-breaking.h
31
32# FIXME: Several of the config settings go in a global config header but
33# are only used in a single translation unit -- so toggling that value
34# causes a full rebuild when it really only has to rebuild a single file.
35# Instead monolithing config headers, investigate using something like
36# https://is.gd/buildflag_header_gni instead (needs to be done in both the
37# cmake build and here).
38
39# FIXME: This hardcodes a bunch of settings I never use; some of them should
40# become declare_args if anyone wants to set them.
41
42declare_args() {
43  # Enable additional checks that alter the LLVM C++ ABI.
44  llvm_enable_abi_breaking_checks = llvm_enable_assertions
45
46  # Iterate unordered llvm containers in reverse.
47  llvm_enable_reverse_iteration = false
48}
49
50write_cmake_config("abi-breaking") {
51  input = "abi-breaking.h.cmake"
52  output = "$target_gen_dir/abi-breaking.h"
53  values = []
54
55  if (llvm_enable_abi_breaking_checks) {
56    values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ]
57  } else {
58    values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ]
59  }
60
61  if (llvm_enable_reverse_iteration) {
62    values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ]
63  } else {
64    values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ]
65  }
66}
67
68write_cmake_config("config") {
69  public_deps = [ ":llvm-config" ]
70
71  input = "config.h.cmake"
72  output = "$target_gen_dir/config.h"
73  values = [
74    "BUG_REPORT_URL=https://bugs.llvm.org/",
75    "ENABLE_BACKTRACES=1",
76    "ENABLE_CRASH_OVERRIDES=1",
77    "BACKTRACE_HEADER=execinfo.h",
78    "HAVE_CRASHREPORTERCLIENT_H=",
79    "HAVE_DECL_FE_ALL_EXCEPT=1",
80    "HAVE_DECL_FE_INEXACT=1",
81    "LLVM_ENABLE_CRASH_DUMPS=",
82    "HAVE_ERRNO_H=1",
83    "HAVE_FCNTL_H=1",
84    "HAVE_FENV_H=1",
85    "HAVE_FFI_CALL=",
86    "HAVE_FFI_FFI_H=",
87    "HAVE_FFI_H=",
88    "HAVE_LIBPFM=",
89    "HAVE_LIBPSAPI=",
90    "HAVE_MALLCTL=",
91    "HAVE_SIGNAL_H=1",
92    "HAVE_STD_IS_TRIVIALLY_COPYABLE=1",
93    "HAVE_STRERROR=1",
94    "HAVE_SYS_STAT_H=1",
95    "HAVE_SYS_TYPES_H=1",
96    "HAVE_VALGRIND_VALGRIND_H=",
97    "HAVE__ALLOCA=",
98    "HAVE___ALLOCA=",
99    "HAVE___ASHLDI3=",
100    "HAVE___ASHRDI3=",
101    "HAVE___CHKSTK=",
102    "HAVE___CHKSTK_MS=",
103    "HAVE___CMPDI2=",
104    "HAVE___DIVDI3=",
105    "HAVE___FIXDFDI=",
106    "HAVE___FIXSFDI=",
107    "HAVE___FLOATDIDF=",
108    "HAVE___LSHRDI3=",
109    "HAVE___MAIN=",
110    "HAVE___MODDI3=",
111    "HAVE___UDIVDI3=",
112    "HAVE___UMODDI3=",
113    "HAVE____CHKSTK=",
114    "HAVE____CHKSTK_MS=",
115    "HOST_LINK_VERSION=",
116    "LLVM_TARGET_TRIPLE_ENV=",
117    "LLVM_VERSION_INFO=",
118    "LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1",
119    "PACKAGE_BUGREPORT=https://bugs.llvm.org/",
120    "PACKAGE_NAME=LLVM",
121    "PACKAGE_STRING=LLVM ${llvm_version}git",
122    "PACKAGE_VERSION=${llvm_version}git",
123    "PACKAGE_VENDOR=",
124    "RETSIGTYPE=void",
125    "LLVM_GISEL_COV_ENABLED=",
126    "LLVM_GISEL_COV_PREFIX=",
127    "LLVM_WITH_Z3=",
128
129    # FIXME: Set to 1 on mac once the 10.14 SDK is in common use.
130    "LLVM_SUPPORT_XCODE_SIGNPOSTS=",
131
132    # This is both in llvm-config.h and config.h; llvm-config.h doesn't
133    # define it if it's not set while config.h defines it to empty in that case.
134    "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
135  ]
136
137  if (current_os == "linux" || current_os == "android") {
138    values += [
139      "HAVE_FUTIMENS=1",
140      "HAVE_LINK_H=1",
141      "HAVE_LSEEK64=1",
142      "HAVE_MALLINFO=1",
143      "HAVE_POSIX_FALLOCATE=1",
144      "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1",
145    ]
146  } else {
147    values += [
148      "HAVE_FUTIMENS=",
149      "HAVE_LINK_H=",
150      "HAVE_LSEEK64=",
151      "HAVE_MALLINFO=",
152      "HAVE_POSIX_FALLOCATE=",
153      "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=",
154    ]
155  }
156
157  if (current_os == "mac") {
158    values += [
159      "HAVE_CRASHREPORTER_INFO=1",
160      "HAVE_DECL_ARC4RANDOM=1",
161      "HAVE_DLADDR=1",
162      "HAVE_MACH_MACH_H=1",
163      "HAVE_MALLOC_MALLOC_H=1",
164      "HAVE_MALLOC_ZONE_STATISTICS=1",
165      "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1",
166    ]
167  } else {
168    values += [
169      "HAVE_CRASHREPORTER_INFO=",
170      "HAVE_DECL_ARC4RANDOM=",
171      "HAVE_DLADDR=",
172      "HAVE_MACH_MACH_H=",
173      "HAVE_MALLOC_MALLOC_H=",
174      "HAVE_MALLOC_ZONE_STATISTICS=",
175      "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=",
176    ]
177  }
178
179  if (current_os == "linux" || current_os == "mac") {
180    values += [
181      "HAVE_BACKTRACE=1",
182      "HAVE_POSIX_SPAWN=1",
183      "HAVE_PTHREAD_GETNAME_NP=1",
184    ]
185  } else {
186    values += [
187      "HAVE_BACKTRACE=",
188      "HAVE_POSIX_SPAWN=",
189      "HAVE_PTHREAD_GETNAME_NP=",
190    ]
191  }
192
193  if (current_os == "win") {
194    values += [
195      "HAVE_DECL_STRERROR_S=1",
196      "HAVE_DLFCN_H=",
197      "HAVE_DLOPEN=",
198      "HAVE_FUTIMES=",
199      "HAVE_GETPAGESIZE=",
200      "HAVE_GETRLIMIT=",
201      "HAVE_GETRUSAGE=",
202      "HAVE_ISATTY=",
203      "HAVE_LIBPTHREAD=",
204      "HAVE_PTHREAD_SETNAME_NP=",
205      "HAVE_PREAD=",
206      "HAVE_PTHREAD_GETSPECIFIC=",
207      "HAVE_PTHREAD_H=",
208      "HAVE_PTHREAD_MUTEX_LOCK=",
209      "HAVE_PTHREAD_RWLOCK_INIT=",
210      "HAVE_SBRK=",
211      "HAVE_SETENV=",
212      "HAVE_SETRLIMIT=",
213      "HAVE_SIGALTSTACK=",
214      "HAVE_STRERROR_R=",
215      "HAVE_SYSCONF=",
216      "HAVE_SYS_IOCTL_H=",
217      "HAVE_SYS_MMAN_H=",
218      "HAVE_SYS_PARAM_H=",
219      "HAVE_SYS_RESOURCE_H=",
220      "HAVE_SYS_TIME_H=",
221      "HAVE_TERMIOS_H=",
222      "HAVE_UNISTD_H=",
223      "HAVE__CHSIZE_S=1",
224      "HAVE__UNWIND_BACKTRACE=",
225      "stricmp=_stricmp",
226      "strdup=_strdup",
227    ]
228  } else {
229    # POSIX-y system defaults.
230    values += [
231      "HAVE_DECL_STRERROR_S=",
232      "HAVE_DLFCN_H=1",
233      "HAVE_DLOPEN=1",
234      "HAVE_FUTIMES=1",
235      "HAVE_GETPAGESIZE=1",
236      "HAVE_GETRLIMIT=1",
237      "HAVE_GETRUSAGE=1",
238      "HAVE_ISATTY=1",
239      "HAVE_LIBPTHREAD=1",
240      "HAVE_PTHREAD_SETNAME_NP=1",
241      "HAVE_PREAD=1",
242      "HAVE_PTHREAD_GETSPECIFIC=1",
243      "HAVE_PTHREAD_H=1",
244      "HAVE_PTHREAD_MUTEX_LOCK=1",
245      "HAVE_PTHREAD_RWLOCK_INIT=1",
246      "HAVE_SBRK=1",
247      "HAVE_SETENV=1",
248      "HAVE_SETRLIMIT=1",
249      "HAVE_SIGALTSTACK=1",
250      "HAVE_STRERROR_R=1",
251      "HAVE_SYSCONF=1",
252      "HAVE_SYS_IOCTL_H=1",
253      "HAVE_SYS_MMAN_H=1",
254      "HAVE_SYS_PARAM_H=1",
255      "HAVE_SYS_RESOURCE_H=1",
256      "HAVE_SYS_TIME_H=1",
257      "HAVE_TERMIOS_H=1",
258      "HAVE_UNISTD_H=1",
259      "HAVE__CHSIZE_S=",
260      "HAVE__UNWIND_BACKTRACE=1",
261      "stricmp=",
262      "strdup=",
263    ]
264  }
265
266  if (current_os == "mac") {
267    values += [ "LTDL_SHLIB_EXT=.dylib" ]
268  } else if (current_os == "win") {
269    values += [ "LTDL_SHLIB_EXT=.dll" ]
270  } else {
271    values += [ "LTDL_SHLIB_EXT=.so" ]
272  }
273
274  if (llvm_enable_libedit) {
275    values += [ "HAVE_LIBEDIT=1" ]
276  } else {
277    values += [ "HAVE_LIBEDIT=" ]
278  }
279
280  if (llvm_enable_libxar) {
281    values += [ "HAVE_LIBXAR=1" ]
282  } else {
283    values += [ "HAVE_LIBXAR=" ]
284  }
285
286  if (llvm_enable_terminfo) {
287    values += [ "HAVE_TERMINFO=1" ]
288  } else {
289    values += [ "HAVE_TERMINFO=" ]
290  }
291
292  if (llvm_enable_dia_sdk) {
293    values += [ "LLVM_ENABLE_DIA_SDK=1" ]
294  } else {
295    values += [ "LLVM_ENABLE_DIA_SDK=" ]
296  }
297
298  # FIXME: Once https://reviews.llvm.org/D79219 is in, remove the two
299  # redundant HAVE_ variables.
300  if (llvm_enable_zlib) {
301    values += [
302      "HAVE_LIBZ=1",
303      "HAVE_ZLIB_H=1",
304      "LLVM_ENABLE_ZLIB=1",
305    ]
306  } else {
307    values += [
308      "HAVE_LIBZ=",
309      "HAVE_ZLIB_H=",
310      "LLVM_ENABLE_ZLIB=",
311    ]
312  }
313
314  if (llvm_enable_libxml2) {
315    values += [ "LLVM_LIBXML2_ENABLED=1" ]
316  } else {
317    values += [ "LLVM_LIBXML2_ENABLED=" ]
318  }
319}
320
321write_cmake_config("llvm-config") {
322  input = "llvm-config.h.cmake"
323  output = "$target_gen_dir/llvm-config.h"
324  values = [
325    "LLVM_ENABLE_DUMP=",
326    "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
327    "LLVM_HAS_ATOMICS=1",
328    "LLVM_HAVE_TF_API=",
329    "LLVM_HOST_TRIPLE=$llvm_current_triple",
330    "LLVM_NATIVE_ARCH=$native_target",
331    "LLVM_NATIVE_ASMPARSER=1",
332    "LLVM_NATIVE_ASMPRINTER=1",
333    "LLVM_NATIVE_DISASSEMBLER=1",
334    "LLVM_NATIVE_TARGET=1",
335    "LLVM_NATIVE_TARGETINFO=1",
336    "LLVM_NATIVE_TARGETMC=1",
337    "LLVM_USE_INTEL_JITEVENTS=",
338    "LLVM_USE_OPROFILE=",
339    "LLVM_USE_PERF=",
340    "LLVM_VERSION_MAJOR=$llvm_version_major",
341    "LLVM_VERSION_MINOR=$llvm_version_minor",
342    "LLVM_VERSION_PATCH=$llvm_version_patch",
343    "PACKAGE_VERSION=${llvm_version}git",
344    "LLVM_FORCE_ENABLE_STATS=",
345  ]
346
347  if (current_os == "win") {
348    values += [ "LLVM_ON_UNIX=" ]
349  } else {
350    values += [ "LLVM_ON_UNIX=1" ]
351  }
352
353  if (llvm_enable_threads) {
354    values += [ "LLVM_ENABLE_THREADS=1" ]
355  } else {
356    values += [ "LLVM_ENABLE_THREADS=" ]
357  }
358}
359
360##############################################################################
361# .def files used by llvm/lib/Target
362
363template("write_target_def_file") {
364  assert(defined(invoker.key), "must set 'key' in $target_name")
365  assert(defined(invoker.value), "must set 'value' in $target_name")
366
367  write_cmake_config(target_name) {
368    visibility = [ ":write_target_def_files" ]
369    input = "$target_name.in"
370    output = "$target_gen_dir/$target_name"
371
372    if (defined(invoker.all_targets)) {
373      all_targets = invoker.all_targets
374    } else {
375      all_targets = llvm_targets_to_build
376    }
377
378    # Build something like
379    # `LLVM_ENUM_ASM_PARSERS=LLVM_ASM_PARSER(ARM)\nLLVM_ASM_PARSER(X86)\n`. Note
380    # that \n is a literal '\' followed by a literal 'n', not a newline
381    # character.  (write_cmake_config.py replaces that with a real newline).
382    value = ""
383    foreach(target, all_targets) {
384      value = "$value${invoker.value}($target)\n"
385    }
386    if (all_targets == []) {
387      not_needed(invoker, [ "value" ])
388    }
389    values = [ "${invoker.key}=$value" ]
390  }
391}
392
393write_target_def_file("AsmParsers.def") {
394  key = "LLVM_ENUM_ASM_PARSERS"
395  value = "LLVM_ASM_PARSER"
396  all_targets = targets_with_asm_parsers
397}
398
399write_target_def_file("AsmPrinters.def") {
400  key = "LLVM_ENUM_ASM_PRINTERS"
401  value = "LLVM_ASM_PRINTER"
402}
403
404write_target_def_file("Disassemblers.def") {
405  key = "LLVM_ENUM_DISASSEMBLERS"
406  value = "LLVM_DISASSEMBLER"
407  all_targets = targets_with_disassemblers
408}
409
410write_target_def_file("Targets.def") {
411  key = "LLVM_ENUM_TARGETS"
412  value = "LLVM_TARGET"
413}
414
415group("write_target_def_files") {
416  visibility = [
417    "//llvm/lib/Support",
418    "//llvm/lib/Target",
419  ]
420  deps = [
421    ":AsmParsers.def",
422    ":AsmPrinters.def",
423    ":Disassemblers.def",
424    ":Targets.def",
425  ]
426}
427