blob: 820f631207545c7bd71f5cdd964e58ed9a08b431 [file] [log] [blame]
import("//llvm/lib/Target/targets.gni")
import("//llvm/triples.gni")
import("//llvm/utils/gn/build/buildflags.gni")
import("//llvm/utils/gn/build/libs/edit/enable.gni")
import("//llvm/utils/gn/build/libs/pthread/enable.gni")
import("//llvm/utils/gn/build/libs/terminfo/enable.gni")
import("//llvm/utils/gn/build/libs/xar/enable.gni")
import("//llvm/utils/gn/build/libs/xml/enable.gni")
import("//llvm/utils/gn/build/libs/zlib/enable.gni")
import("//llvm/utils/gn/build/write_cmake_config.gni")
import("//llvm/version.gni")
# Contains actions to create config.h, llvm-config.h, abi-breaking.h,
# and the various .def files used by llvm/lib/Target.
# Other than in the cmake build, these are created at build time, not at
# config time. That way, they can run in parallel, and this pattern means that
# e.g. creating the clang config header (which happens in another gn file)
# doesn't block building lld.
# The headers are created by processing the foo.h.cmake files as input,
# to keep the gn build close to the cmake build.
# Other than in the cmake build, header generation doesn't do any feature
# checking. See also "Philosophy" in llvm/utils/gn/README.rst.
##############################################################################
# config.h, llvm-config.h, abi-breaking.h
# FIXME: Several of the config settings go in a global config header but
# are only used in a single translation unit -- so toggling that value
# causes a full rebuild when it really only has to rebuild a single file.
# Instead monolithing config headers, investigate using something like
# https://is.gd/buildflag_header_gni instead (needs to be done in both the
# cmake build and here).
# FIXME: This hardcodes a bunch of settings I never use; some of them should
# become declare_args if anyone wants to set them.
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
}
write_cmake_config("abi-breaking") {
input = "abi-breaking.h.cmake"
output = "$target_gen_dir/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 = "config.h.cmake"
output = "$target_gen_dir/config.h"
values = [
"BUG_REPORT_URL=https://bugs.llvm.org/",
"ENABLE_BACKTRACES=1",
"ENABLE_CRASH_OVERRIDES=1",
"BACKTRACE_HEADER=execinfo.h",
"HAVE_CRASHREPORTERCLIENT_H=",
"HAVE_DECL_FE_ALL_EXCEPT=1",
"HAVE_DECL_FE_INEXACT=1",
"LLVM_ENABLE_DIA_SDK=",
"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_SIGNAL_H=1",
"HAVE_STD_IS_TRIVIALLY_COPYABLE=1",
"HAVE_STRERROR=1",
"HAVE_SYS_STAT_H=1",
"HAVE_SYS_TYPES_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=",
"LLVM_TARGET_TRIPLE_ENV=",
"LLVM_VERSION_INFO=",
"LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1",
"PACKAGE_BUGREPORT=https://bugs.llvm.org/",
"PACKAGE_NAME=LLVM",
"PACKAGE_STRING=LLVM ${llvm_version}svn",
"PACKAGE_VERSION=${llvm_version}svn",
"PACKAGE_VENDOR=",
"RETSIGTYPE=void",
"LLVM_GISEL_COV_ENABLED=",
"LLVM_GISEL_COV_PREFIX=",
"LLVM_WITH_Z3=",
# This is both in llvm-config.h and config.h; llvm-config.h doesn't
# define it if it's not set while config.h defines it to empty in that case.
"LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
]
if (current_os == "linux" || current_os == "android") {
values += [
"HAVE_FUTIMENS=1",
"HAVE_LINK_H=1",
"HAVE_LSEEK64=1",
"HAVE_MALLINFO=1",
"HAVE_POSIX_FALLOCATE=1",
"HAVE_SCHED_GETAFFINITY=1",
"HAVE_CPU_COUNT=1",
"HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1",
]
} else {
values += [
"HAVE_FUTIMENS=",
"HAVE_LINK_H=",
"HAVE_LSEEK64=",
"HAVE_MALLINFO=",
"HAVE_POSIX_FALLOCATE=",
"HAVE_SCHED_GETAFFINITY=",
"HAVE_CPU_COUNT=",
"HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=",
]
}
if (current_os == "mac") {
values += [
"HAVE_CRASHREPORTER_INFO=1",
"HAVE_DECL_ARC4RANDOM=1",
"HAVE_DLADDR=1",
"HAVE_MACH_MACH_H=1",
"HAVE_MALLOC_MALLOC_H=1",
"HAVE_MALLOC_ZONE_STATISTICS=1",
"HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1",
]
} else {
values += [
"HAVE_CRASHREPORTER_INFO=",
"HAVE_DECL_ARC4RANDOM=",
"HAVE_DLADDR=",
"HAVE_MACH_MACH_H=",
"HAVE_MALLOC_MALLOC_H=",
"HAVE_MALLOC_ZONE_STATISTICS=",
"HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=",
]
}
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") {
values += [
"HAVE_DECL_STRERROR_S=1",
"HAVE_DLFCN_H=",
"HAVE_DLOPEN=",
"HAVE_FUTIMES=",
"HAVE_GETPAGESIZE=",
"HAVE_GETRLIMIT=",
"HAVE_GETRUSAGE=",
"HAVE_ISATTY=",
"HAVE_LIBPTHREAD=",
"HAVE_PTHREAD_SETNAME_NP=",
"HAVE_LIBZ=",
"HAVE_PREAD=",
"HAVE_PTHREAD_GETSPECIFIC=",
"HAVE_PTHREAD_H=",
"HAVE_PTHREAD_MUTEX_LOCK=",
"HAVE_PTHREAD_RWLOCK_INIT=",
"HAVE_REALPATH=",
"HAVE_SBRK=",
"HAVE_SETENV=",
"HAVE_SETRLIMIT=",
"HAVE_SIGALTSTACK=",
"HAVE_STRERROR_R=",
"HAVE_SYSCONF=",
"HAVE_SYS_IOCTL_H=",
"HAVE_SYS_MMAN_H=",
"HAVE_SYS_PARAM_H=",
"HAVE_SYS_RESOURCE_H=",
"HAVE_SYS_TIME_H=",
"HAVE_TERMIOS_H=",
"HAVE_UNISTD_H=",
"HAVE_ZLIB_H=",
"HAVE__CHSIZE_S=1",
"HAVE__UNWIND_BACKTRACE=",
"stricmp=_stricmp",
"strdup=_strdup",
]
} else {
# POSIX-y system defaults.
values += [
"HAVE_DECL_STRERROR_S=",
"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_LIBZ=1",
"HAVE_PREAD=1",
"HAVE_PTHREAD_GETSPECIFIC=1",
"HAVE_PTHREAD_H=1",
"HAVE_PTHREAD_MUTEX_LOCK=1",
"HAVE_PTHREAD_RWLOCK_INIT=1",
"HAVE_REALPATH=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_PARAM_H=1",
"HAVE_SYS_RESOURCE_H=1",
"HAVE_SYS_TIME_H=1",
"HAVE_TERMIOS_H=1",
"HAVE_UNISTD_H=1",
"HAVE_ZLIB_H=1",
"HAVE__CHSIZE_S=",
"HAVE__UNWIND_BACKTRACE=1",
"stricmp=",
"strdup=",
]
}
if (current_os == "mac") {
values += [ "LTDL_SHLIB_EXT=.dylib" ]
} else if (current_os == "win") {
values += [ "LTDL_SHLIB_EXT=.dll" ]
} else {
values += [ "LTDL_SHLIB_EXT=.so" ]
}
if (llvm_enable_libedit) {
values += [ "HAVE_LIBEDIT=1" ]
} else {
values += [ "HAVE_LIBEDIT=" ]
}
if (llvm_enable_libxar) {
values += [ "HAVE_LIBXAR=1" ]
} else {
values += [ "HAVE_LIBXAR=" ]
}
if (llvm_enable_terminfo) {
values += [ "HAVE_TERMINFO=1" ]
} else {
values += [ "HAVE_TERMINFO=" ]
}
if (llvm_enable_zlib) {
values += [ "LLVM_ENABLE_ZLIB=1" ]
} else {
values += [ "LLVM_ENABLE_ZLIB=" ]
}
if (llvm_enable_libxml2) {
values += [ "LLVM_LIBXML2_ENABLED=1" ]
} else {
values += [ "LLVM_LIBXML2_ENABLED=" ]
}
}
write_cmake_config("llvm-config") {
input = "llvm-config.h.cmake"
output = "$target_gen_dir/llvm-config.h"
values = [
"LLVM_ENABLE_DUMP=",
"LINK_POLLY_INTO_TOOLS=",
"LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple",
"LLVM_HAS_ATOMICS=1",
"LLVM_HOST_TRIPLE=$llvm_current_triple",
"LLVM_NATIVE_ARCH=$native_target",
"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_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",
"PACKAGE_VERSION=${llvm_version}svn",
"LLVM_FORCE_ENABLE_STATS=",
]
if (current_os == "win") {
values += [ "LLVM_ON_UNIX=" ]
} else {
values += [ "LLVM_ON_UNIX=1" ]
}
if (llvm_enable_threads) {
values += [ "LLVM_ENABLE_THREADS=1" ]
} else {
values += [ "LLVM_ENABLE_THREADS=" ]
}
}
##############################################################################
# .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"
output = "$target_gen_dir/$target_name"
# 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, llvm_targets_to_build) {
value = "$value${invoker.value}($target)\n"
}
values = [ "${invoker.key}=$value" ]
}
}
write_target_def_file("AsmParsers.def") {
key = "LLVM_ENUM_ASM_PARSERS"
value = "LLVM_ASM_PARSER"
}
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"
}
write_target_def_file("Targets.def") {
key = "LLVM_ENUM_TARGETS"
value = "LLVM_TARGET"
}
group("write_target_def_files") {
visibility = [
"//llvm/lib/Support",
"//llvm/lib/Target",
]
deps = [
":AsmParsers.def",
":AsmPrinters.def",
":Disassemblers.def",
":Targets.def",
]
}