| # This setups the actions for generated header file headers used by the LLVM |
| # libs. The below are heavily influenced by LLVM. |
| import("//build_overrides/clspv.gni") |
| |
| # This sets up the generation of the cmake config files used for LLVM. |
| # Based on the LLVM version |
| |
| import("../../triples.gni") |
| import("../write_cmake_config.gni") |
| |
| import( |
| "//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/lib/DebugInfo/PDB/enable_dia.gni") |
| |
| import("//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/version.gni") |
| |
| # TODO check for deps |
| import("../target/targets.gni") |
| import("../target/targets_with_asm_parsers.gni") |
| import("../target/targets_with_disassemblers.gni") |
| import("../target/targets_with_exegesis.gni") |
| import("../target/targets_with_mcas.gni") |
| |
| # Actions to create config.h, llvm-config.h, abi-breaking.h and various .def |
| # files used by llvm/lib/Target. Based on |
| # `llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.GN` |
| |
| declare_args() { |
| # Enable additional checks that alter the LLVM C++ ABI. |
| llvm_enable_abi_breaking_checks = llvm_enable_assertions |
| |
| # Iterate unordered llvm containers in reverse. |
| llvm_enable_reverse_iteration = false |
| |
| # Force enable statistics. |
| llvm_force_enable_stats = false |
| |
| # glibc is at least 2.33 which has mallinfo2. |
| # TODO: remove this once nobody using the gn build is building against an old glibc. |
| llvm_have_mallinfo2 = false |
| } |
| |
| write_cmake_config("abi-breaking") { |
| input = "//$clspv_llvm_dir/llvm/include/llvm/Config/abi-breaking.h.cmake" |
| output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/abi-breaking.h" |
| values = [] |
| |
| if (llvm_enable_abi_breaking_checks) { |
| values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ] |
| } |
| |
| if (llvm_enable_reverse_iteration) { |
| values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ] |
| } |
| } |
| |
| write_cmake_config("config") { |
| public_deps = [ ":llvm-config" ] |
| |
| input = "//$clspv_llvm_dir/llvm/include/llvm/Config/config.h.cmake" |
| output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/config.h" |
| values = [ |
| "BUG_REPORT_URL=https://github.com/llvm/llvm-project/issues/", |
| "ENABLE_BACKTRACES=1", |
| "ENABLE_DEBUGLOC_COVERAGE_TRACKING=", |
| "ENABLE_CRASH_OVERRIDES=1", |
| "BACKTRACE_HEADER=execinfo.h", |
| "HAVE_BUILTIN_THREAD_POINTER=", |
| "HAVE_CRASHREPORTERCLIENT_H=", |
| "HAVE_DECL_FE_ALL_EXCEPT=1", |
| "HAVE_DECL_FE_INEXACT=1", |
| "LLVM_ENABLE_CRASH_DUMPS=", |
| "HAVE_ERRNO_H=1", |
| "HAVE_FCNTL_H=1", |
| "HAVE_FENV_H=1", |
| "HAVE_FFI_CALL=", |
| "HAVE_FFI_FFI_H=", |
| "HAVE_FFI_H=", |
| "HAVE_LIBPFM=", |
| "HAVE_LIBPSAPI=", |
| "HAVE_MALLCTL=", |
| "HAVE_PTHREAD_GET_NAME_NP=", |
| "HAVE_PTHREAD_SET_NAME_NP=", |
| "HAVE_SIGNAL_H=1", |
| "HAVE_SYS_STAT_H=1", |
| "HAVE_VALGRIND_VALGRIND_H=", |
| "HAVE__ALLOCA=", |
| "HAVE___ALLOCA=", |
| "HAVE___ASHLDI3=", |
| "HAVE___ASHRDI3=", |
| "HAVE___CHKSTK=", |
| "HAVE___CHKSTK_MS=", |
| "HAVE___CMPDI2=", |
| "HAVE___DIVDI3=", |
| "HAVE___FIXDFDI=", |
| "HAVE___FIXSFDI=", |
| "HAVE___FLOATDIDF=", |
| "HAVE___LSHRDI3=", |
| "HAVE___MAIN=", |
| "HAVE___MODDI3=", |
| "HAVE___UDIVDI3=", |
| "HAVE___UMODDI3=", |
| "HAVE____CHKSTK=", |
| "HAVE____CHKSTK_MS=", |
| "HOST_LINK_VERSION=", |
| "LIBPFM_HAS_FIELD_CYCLES=", |
| "LLVM_TARGET_TRIPLE_ENV=", |
| "LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG=1", |
| "LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1", |
| "LLVM_WINDOWS_PREFER_FORWARD_SLASH=", |
| "PACKAGE_BUGREPORT=https://github.com/llvm/llvm-project/issues/", |
| "PACKAGE_NAME=LLVM", |
| "PACKAGE_STRING=LLVM ${llvm_version}git", |
| "PACKAGE_VERSION=${llvm_version}git", |
| "PACKAGE_VENDOR=", |
| "LLVM_GISEL_COV_ENABLED=", |
| "LLVM_GISEL_COV_PREFIX=", |
| |
| # FIXME: Set to 1 on mac once the 10.14 SDK is in common use. |
| "LLVM_SUPPORT_XCODE_SIGNPOSTS=", |
| ] |
| |
| if (current_os == "linux" || current_os == "android") { |
| values += [ |
| "HAVE_FUTIMENS=1", |
| "HAVE_MALLINFO=1", |
| "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1", |
| ] |
| } else { |
| values += [ |
| "HAVE_FUTIMENS=", |
| "HAVE_MALLINFO=", |
| "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=", |
| ] |
| } |
| |
| if (current_os == "mac") { |
| values += [ |
| "HAVE_CRASHREPORTER_INFO=1", |
| "HAVE_DECL_ARC4RANDOM=1", |
| "HAVE_MACH_MACH_H=1", |
| "HAVE_MALLOC_MALLOC_H=1", |
| "HAVE_MALLOC_ZONE_STATISTICS=1", |
| "HAVE_PROC_PID_RUSAGE=1", |
| "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1", |
| "HAVE_UNW_ADD_DYNAMIC_FDE=1", |
| ] |
| } else { |
| values += [ |
| "HAVE_CRASHREPORTER_INFO=", |
| "HAVE_DECL_ARC4RANDOM=", |
| "HAVE_MACH_MACH_H=", |
| "HAVE_MALLOC_MALLOC_H=", |
| "HAVE_MALLOC_ZONE_STATISTICS=", |
| "HAVE_PROC_PID_RUSAGE=", |
| "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=", |
| "HAVE_UNW_ADD_DYNAMIC_FDE=", |
| ] |
| } |
| |
| if (current_os == "linux" || current_os == "mac") { |
| values += [ |
| "HAVE_BACKTRACE=1", |
| "HAVE_POSIX_SPAWN=1", |
| "HAVE_PTHREAD_GETNAME_NP=1", |
| ] |
| } else { |
| values += [ |
| "HAVE_BACKTRACE=", |
| "HAVE_POSIX_SPAWN=", |
| "HAVE_PTHREAD_GETNAME_NP=", |
| ] |
| } |
| |
| if (current_os == "win" || current_cpu == "arm") { |
| values += [ |
| "HAVE_DEREGISTER_FRAME=", |
| "HAVE_REGISTER_FRAME=", |
| ] |
| } else { |
| values += [ |
| "HAVE_DEREGISTER_FRAME=1", |
| "HAVE_REGISTER_FRAME=1", |
| ] |
| } |
| |
| if (current_os == "win") { |
| values += [ |
| "HAVE_DECL_STRERROR_S=1", |
| "HAVE_DLADDR=", |
| "HAVE_DLFCN_H=", |
| "HAVE_DLOPEN=", |
| "HAVE_FUTIMES=", |
| "HAVE_GETPAGESIZE=", |
| "HAVE_GETRLIMIT=", |
| "HAVE_GETRUSAGE=", |
| "HAVE_ISATTY=", |
| "HAVE_LIBPTHREAD=", |
| "HAVE_PTHREAD_SETNAME_NP=", |
| "HAVE_PREAD=", |
| "HAVE_PTHREAD_H=", |
| "HAVE_PTHREAD_MUTEX_LOCK=", |
| "HAVE_PTHREAD_RWLOCK_INIT=", |
| "HAVE_SBRK=", |
| "HAVE_SETENV=", |
| "HAVE_SETRLIMIT=", |
| "HAVE_SIGALTSTACK=", |
| "HAVE_STRERROR_R=", |
| "HAVE_SYSCONF=", |
| "HAVE_SYS_IOCTL_H=", |
| "HAVE_SYS_MMAN_H=", |
| "HAVE_SYS_RESOURCE_H=", |
| "HAVE_SYS_TIME_H=", |
| "HAVE_TERMIOS_H=", |
| "HAVE_UNISTD_H=", |
| "HAVE__CHSIZE_S=1", |
| "HAVE__UNWIND_BACKTRACE=", |
| "stricmp=_stricmp", |
| "strdup=_strdup", |
| ] |
| } else { |
| # POSIX-y system defaults. |
| values += [ |
| "HAVE_DECL_STRERROR_S=", |
| "HAVE_DLADDR=1", |
| "HAVE_DLFCN_H=1", |
| "HAVE_DLOPEN=1", |
| "HAVE_FUTIMES=1", |
| "HAVE_GETPAGESIZE=1", |
| "HAVE_GETRLIMIT=1", |
| "HAVE_GETRUSAGE=1", |
| "HAVE_ISATTY=1", |
| "HAVE_LIBPTHREAD=1", |
| "HAVE_PTHREAD_SETNAME_NP=1", |
| "HAVE_PREAD=1", |
| "HAVE_PTHREAD_H=1", |
| "HAVE_PTHREAD_MUTEX_LOCK=1", |
| "HAVE_PTHREAD_RWLOCK_INIT=1", |
| "HAVE_SBRK=1", |
| "HAVE_SETENV=1", |
| "HAVE_SETRLIMIT=1", |
| "HAVE_SIGALTSTACK=1", |
| "HAVE_STRERROR_R=1", |
| "HAVE_SYSCONF=1", |
| "HAVE_SYS_IOCTL_H=1", |
| "HAVE_SYS_MMAN_H=1", |
| "HAVE_SYS_RESOURCE_H=1", |
| "HAVE_SYS_TIME_H=1", |
| "HAVE_TERMIOS_H=1", |
| "HAVE_UNISTD_H=1", |
| "HAVE__CHSIZE_S=", |
| "HAVE__UNWIND_BACKTRACE=1", |
| "stricmp=", |
| "strdup=", |
| ] |
| } |
| |
| if (current_os == "mac") { |
| shlib_ext = ".dylib" |
| } else if (current_os == "win") { |
| shlib_ext = ".dll" |
| } else { |
| shlib_ext = ".so" |
| } |
| values += [ |
| "LLVM_PLUGIN_EXT=$shlib_ext", |
| "LTDL_SHLIB_EXT=$shlib_ext", |
| ] |
| |
| if (llvm_enable_libedit) { |
| values += [ "HAVE_LIBEDIT=1" ] |
| } else { |
| values += [ "HAVE_LIBEDIT=" ] |
| } |
| |
| if (llvm_enable_libxml2) { |
| values += [ "LLVM_ENABLE_LIBXML2=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_LIBXML2=" ] |
| } |
| |
| if (llvm_have_mallinfo2) { |
| values += [ "HAVE_MALLINFO2=1" ] |
| } else { |
| values += [ "HAVE_MALLINFO2=" ] |
| } |
| } |
| |
| write_cmake_config("llvm-config") { |
| input = "//$clspv_llvm_dir/llvm/include/llvm/Config/llvm-config.h.cmake" |
| output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/llvm-config.h" |
| values = [ |
| "LLVM_BUILD_LLVM_DYLIB=", |
| "LLVM_BUILD_SHARED_LIBS=", |
| "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple", |
| "LLVM_ENABLE_DUMP=", |
| "LLVM_ENABLE_HTTPLIB=", |
| "LLVM_ENABLE_ZSTD=", |
| "LLVM_FORCE_USE_OLD_TOOLCHAIN=", |
| "LLVM_HAS_ATOMICS=1", |
| "LLVM_HAS_LOGF128=0", |
| "LLVM_HAVE_TFLITE=", |
| "LLVM_HOST_TRIPLE=$llvm_current_triple", |
| "LLVM_NATIVE_ARCH=$native_target", |
| "LLVM_UNREACHABLE_OPTIMIZE=1", |
| "LLVM_USE_INTEL_JITEVENTS=", |
| "LLVM_USE_OPROFILE=", |
| "LLVM_USE_PERF=", |
| "LLVM_VERSION_MAJOR=$llvm_version_major", |
| "LLVM_VERSION_MINOR=$llvm_version_minor", |
| "LLVM_VERSION_PATCH=$llvm_version_patch", |
| "LLVM_WITH_Z3=", |
| "PACKAGE_VERSION=${llvm_version}git", |
| ] |
| |
| if (llvm_build_native) { |
| values += [ |
| "LLVM_NATIVE_ASMPARSER=1", |
| "LLVM_NATIVE_ASMPRINTER=1", |
| "LLVM_NATIVE_DISASSEMBLER=1", |
| "LLVM_NATIVE_TARGET=1", |
| "LLVM_NATIVE_TARGETINFO=1", |
| "LLVM_NATIVE_TARGETMC=1", |
| "LLVM_NATIVE_TARGETMCA=1", |
| ] |
| } else { |
| values += [ |
| "LLVM_NATIVE_ASMPARSER=", |
| "LLVM_NATIVE_ASMPRINTER=", |
| "LLVM_NATIVE_DISASSEMBLER=", |
| "LLVM_NATIVE_TARGET=", |
| "LLVM_NATIVE_TARGETINFO=", |
| "LLVM_NATIVE_TARGETMC=", |
| "LLVM_NATIVE_TARGETMCA=", |
| ] |
| } |
| |
| if (current_os == "win") { |
| values += [ |
| "HAVE_SYSEXITS_H=", |
| "LLVM_ENABLE_PLUGINS=", |
| "LLVM_ON_UNIX=", |
| ] |
| } else { |
| values += [ |
| "HAVE_SYSEXITS_H=1", |
| "LLVM_ENABLE_PLUGINS=1", |
| "LLVM_ON_UNIX=1", |
| ] |
| } |
| |
| if (llvm_enable_dia_sdk) { |
| values += [ "LLVM_ENABLE_DIA_SDK=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_DIA_SDK=" ] |
| } |
| |
| if (llvm_enable_threads) { |
| values += [ "LLVM_ENABLE_THREADS=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_THREADS=" ] |
| } |
| |
| if (llvm_enable_zlib) { |
| values += [ "LLVM_ENABLE_ZLIB=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_ZLIB=" ] |
| } |
| |
| if (llvm_enable_libcurl) { |
| values += [ "LLVM_ENABLE_CURL=1" ] |
| } else { |
| values += [ "LLVM_ENABLE_CURL=" ] |
| } |
| |
| if (llvm_force_enable_stats) { |
| values += [ "LLVM_FORCE_ENABLE_STATS=1" ] |
| } else { |
| values += [ "LLVM_FORCE_ENABLE_STATS=" ] |
| } |
| |
| if (llvm_build_AArch64) { |
| values += [ "LLVM_HAS_AARCH64_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_AARCH64_TARGET=" ] |
| } |
| |
| if (llvm_build_AMDGPU) { |
| values += [ "LLVM_HAS_AMDGPU_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_AMDGPU_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_ARC_TARGET=" ] |
| |
| if (llvm_build_ARM) { |
| values += [ "LLVM_HAS_ARM_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_ARM_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_AVR_TARGET=" ] |
| |
| if (llvm_build_BPF) { |
| values += [ "LLVM_HAS_BPF_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_BPF_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_CSKY_TARGET=" ] |
| values += [ "LLVM_HAS_DIRECTX_TARGET=" ] |
| values += [ "LLVM_HAS_HEXAGON_TARGET=" ] |
| values += [ "LLVM_HAS_LANAI_TARGET=" ] |
| |
| if (llvm_build_LoongArch) { |
| values += [ "LLVM_HAS_LOONGARCH_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_LOONGARCH_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_M68K_TARGET=" ] |
| |
| if (llvm_build_Mips) { |
| values += [ "LLVM_HAS_MIPS_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_MIPS_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_MSP430_TARGET=" ] |
| values += [ "LLVM_HAS_NVPTX_TARGET=" ] |
| |
| if (llvm_build_PowerPC) { |
| values += [ "LLVM_HAS_POWERPC_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_POWERPC_TARGET=" ] |
| } |
| |
| if (llvm_build_RISCV) { |
| values += [ "LLVM_HAS_RISCV_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_RISCV_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_SPARC_TARGET=" ] |
| values += [ "LLVM_HAS_SPIRV_TARGET=" ] |
| |
| if (llvm_build_SystemZ) { |
| values += [ "LLVM_HAS_SYSTEMZ_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_SYSTEMZ_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_VE_TARGET=" ] |
| |
| if (llvm_build_WebAssembly) { |
| values += [ "LLVM_HAS_WEBASSEMBLY_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_WEBASSEMBLY_TARGET=" ] |
| } |
| |
| if (llvm_build_X86) { |
| values += [ "LLVM_HAS_X86_TARGET=1" ] |
| } else { |
| values += [ "LLVM_HAS_X86_TARGET=" ] |
| } |
| |
| values += [ "LLVM_HAS_XCORE_TARGET=" ] |
| values += [ "LLVM_HAS_XTENSA_TARGET=" ] |
| } |
| |
| ############################################################################## |
| # .def files used by llvm/lib/Target |
| |
| template("write_target_def_file") { |
| assert(defined(invoker.key), "must set 'key' in $target_name") |
| assert(defined(invoker.value), "must set 'value' in $target_name") |
| |
| write_cmake_config(target_name) { |
| visibility = [ ":write_target_def_files" ] |
| |
| #input = "$target_name.in" |
| input = "//$clspv_llvm_dir/llvm/include/llvm/Config/$target_name.in" |
| output = "$root_gen_dir/$clspv_llvm_dir/llvm/Config/$target_name" |
| |
| if (defined(invoker.all_targets)) { |
| all_targets = invoker.all_targets |
| } else { |
| all_targets = llvm_targets_to_build |
| } |
| |
| # Build something like |
| # `LLVM_ENUM_ASM_PARSERS=LLVM_ASM_PARSER(ARM)\nLLVM_ASM_PARSER(X86)\n`. Note |
| # that \n is a literal '\' followed by a literal 'n', not a newline |
| # character. (write_cmake_config.py replaces that with a real newline). |
| value = "" |
| foreach(target, all_targets) { |
| value = "$value${invoker.value}($target)\n" |
| } |
| if (all_targets == []) { |
| not_needed(invoker, [ "value" ]) |
| } |
| values = [ "${invoker.key}=$value" ] |
| } |
| } |
| |
| write_target_def_file("AsmParsers.def") { |
| key = "LLVM_ENUM_ASM_PARSERS" |
| value = "LLVM_ASM_PARSER" |
| all_targets = targets_with_asm_parsers |
| } |
| |
| write_target_def_file("AsmPrinters.def") { |
| key = "LLVM_ENUM_ASM_PRINTERS" |
| value = "LLVM_ASM_PRINTER" |
| } |
| |
| write_target_def_file("Disassemblers.def") { |
| key = "LLVM_ENUM_DISASSEMBLERS" |
| value = "LLVM_DISASSEMBLER" |
| all_targets = targets_with_disassemblers |
| } |
| |
| write_target_def_file("Targets.def") { |
| key = "LLVM_ENUM_TARGETS" |
| value = "LLVM_TARGET" |
| } |
| |
| write_target_def_file("TargetMCAs.def") { |
| key = "LLVM_ENUM_TARGETMCAS" |
| value = "LLVM_TARGETMCA" |
| all_targets = targets_with_mcas |
| } |
| |
| write_target_def_file("TargetExegesis.def") { |
| key = "LLVM_ENUM_EXEGESIS" |
| value = "LLVM_EXEGESIS" |
| all_targets = targets_with_exegesis |
| } |
| |
| group("write_target_def_files") { |
| #visibility = [ |
| # "//$clspv_llvm_dir/llvm/lib/Support", |
| # "//$clspv_llvm_dir/llvm/lib/Target", |
| #] |
| deps = [ |
| ":AsmParsers.def", |
| ":AsmPrinters.def", |
| ":Disassemblers.def", |
| ":TargetExegesis.def", |
| ":TargetMCAs.def", |
| ":Targets.def", |
| ] |
| } |
| |
| # Corresponds to process_llvm_pass_plugins() in the CMake build. |
| # For now, just turn everything off. |
| # If we ever add real support for this, the GN way for this is probably |
| # to have a declare_args() list with plugin names that people can override |
| # in their args.gn and with empty defaults (similar to llvm_targets_to_build). |
| action("write_extension_def") { |
| script = "//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/include/llvm/Support/write_extension_def.py" |
| outputs = [ "$root_gen_dir/$clspv_llvm_dir/llvm/Support/Extension.def" ] |
| |
| # If any extensions should be enabled, they'd be passed as additional |
| # arguments, e.g. `args += [ "Bye", "Polly" ]`. |
| args = [ |
| "-o", |
| rebase_path(outputs[0], root_build_dir), |
| ] |
| } |