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