diff --git a/llvm/utils/gn/README.rst b/llvm/utils/gn/README.rst index 97ce5e7e72bd..852cffaed37f 100644 --- a/llvm/utils/gn/README.rst +++ b/llvm/utils/gn/README.rst @@ -78,9 +78,9 @@ for the `gen` command. The full GN reference is also `available online GN has an autoformatter: `git ls-files '*.gn' '*.gni' | xargs -n 1 gn format` after making GN build changes is your friend. -To not put `BUILD.gn` into the main tree, they are all below `utils/gn/tree`. -For example, the build file for `llvm/lib/Support` is in -`utils/gn/tree/llvm/lib/Support`. +To not put `BUILD.gn` into the main tree, they are all below +`utils/gn/secondary`. For example, the build file for `llvm/lib/Support` is in +`utils/gn/secondary/llvm/lib/Support`. .. _Philosophy: diff --git a/llvm/utils/gn/build/BUILD.gn b/llvm/utils/gn/build/BUILD.gn index 0d407dd28ac2..0f369ec73951 100644 --- a/llvm/utils/gn/build/BUILD.gn +++ b/llvm/utils/gn/build/BUILD.gn @@ -1,7 +1,6 @@ import("//llvm/utils/gn/build/buildflags.gni") import("//llvm/utils/gn/build/mac_sdk.gni") import("//llvm/utils/gn/build/toolchain/compiler.gni") -import("//llvm/utils/gn/build/enable_threads.gni") config("compiler_defaults") { # FIXME: Don't define this globally here. @@ -140,14 +139,3 @@ config("warn_covered_switch_default") { cflags = [ "-Wcovered-switch-default" ] } } - -config("pthread_config") { - visibility = [ ":pthread" ] - libs = [ "pthread" ] -} - -group("pthread") { - if (llvm_enable_threads && host_os != "win") { - public_configs = [ ":pthread_config" ] - } -} diff --git a/llvm/utils/gn/build/libs/pthread/BUILD.gn b/llvm/utils/gn/build/libs/pthread/BUILD.gn new file mode 100644 index 000000000000..51e7f1f31fa8 --- /dev/null +++ b/llvm/utils/gn/build/libs/pthread/BUILD.gn @@ -0,0 +1,12 @@ +import("//llvm/utils/gn/build/libs/pthread/enable.gni") + +config("pthread_config") { + visibility = [ ":pthread" ] + libs = [ "pthread" ] +} + +group("pthread") { + if (llvm_enable_threads && host_os != "win") { + public_configs = [ ":pthread_config" ] + } +} diff --git a/llvm/utils/gn/build/libs/terminfo/BUILD.gn b/llvm/utils/gn/build/libs/terminfo/BUILD.gn new file mode 100644 index 000000000000..10003d61c4df --- /dev/null +++ b/llvm/utils/gn/build/libs/terminfo/BUILD.gn @@ -0,0 +1,12 @@ +import("//llvm/utils/gn/build/libs/terminfo/enable.gni") + +config("terminfo_config") { + visibility = [ ":terminfo" ] + libs = [ "ncurses" ] +} + +group("terminfo") { + if (llvm_enable_terminfo) { + public_configs = [ ":terminfo_config" ] + } +} diff --git a/llvm/utils/gn/build/libs/terminfo/enable.gni b/llvm/utils/gn/build/libs/terminfo/enable.gni new file mode 100644 index 000000000000..79ea2b601857 --- /dev/null +++ b/llvm/utils/gn/build/libs/terminfo/enable.gni @@ -0,0 +1,4 @@ +declare_args() { + # Whether to link against terminfo. + llvm_enable_terminfo = false +} diff --git a/llvm/utils/gn/build/libs/xml/BUILD.gn b/llvm/utils/gn/build/libs/xml/BUILD.gn new file mode 100644 index 000000000000..eb60982384cf --- /dev/null +++ b/llvm/utils/gn/build/libs/xml/BUILD.gn @@ -0,0 +1,19 @@ +import("//llvm/utils/gn/build/libs/xml/enable.gni") +import("//llvm/utils/gn/build/mac_sdk.gni") + +config("xml_config") { + visibility = [ ":xml" ] + defines = [ "LLVM_LIBXML2_ENABLED" ] + libs = [ "xml2" ] + if (host_os == "mac") { + include_dirs = [ "$mac_sdk/usr/include/libxml2" ] + } else { + include_dirs = [ "/usr/include/libxml2" ] + } +} + +group("xml") { + if (llvm_enable_libxml2) { + public_configs = [ ":xml_config" ] + } +} diff --git a/llvm/utils/gn/build/libs/xml/enable.gni b/llvm/utils/gn/build/libs/xml/enable.gni new file mode 100644 index 000000000000..3ef357b4fd2f --- /dev/null +++ b/llvm/utils/gn/build/libs/xml/enable.gni @@ -0,0 +1,4 @@ +declare_args() { + # Whether to include code that links against libxml2. + llvm_enable_libxml2 = host_os != "win" +} diff --git a/llvm/utils/gn/build/libs/zlib/BUILD.gn b/llvm/utils/gn/build/libs/zlib/BUILD.gn new file mode 100644 index 000000000000..5085578e760e --- /dev/null +++ b/llvm/utils/gn/build/libs/zlib/BUILD.gn @@ -0,0 +1,12 @@ +import("//llvm/utils/gn/build/libs/zlib/enable.gni") + +config("zlib_config") { + visibility = [ ":zlib" ] + libs = [ "z" ] +} + +group("zlib") { + if (llvm_enable_zlib) { + public_configs = [ ":zlib_config" ] + } +} diff --git a/llvm/utils/gn/build/libs/zlib/enable.gni b/llvm/utils/gn/build/libs/zlib/enable.gni new file mode 100644 index 000000000000..9626301378bd --- /dev/null +++ b/llvm/utils/gn/build/libs/zlib/enable.gni @@ -0,0 +1,4 @@ +declare_args() { + # Whether to include code that links against zlib. + llvm_enable_zlib = host_os != "win" +} diff --git a/llvm/utils/gn/build/toolchain/BUILD.gn b/llvm/utils/gn/build/toolchain/BUILD.gn index f9b31e4dfb4e..927a53d9d631 100644 --- a/llvm/utils/gn/build/toolchain/BUILD.gn +++ b/llvm/utils/gn/build/toolchain/BUILD.gn @@ -50,7 +50,8 @@ toolchain("unix") { } else { # Remove the output file first so that ar doesn't try to modify the # existing file. - command = "rm -f {{output}} && ar rcsDT {{arflags}} -o {{output}} {{inputs}}" + command = + "rm -f {{output}} && ar rcsDT {{arflags}} -o {{output}} {{inputs}}" } description = "AR {{output}}" outputs = [ diff --git a/llvm/utils/gn/build/write_cmake_config.py b/llvm/utils/gn/build/write_cmake_config.py new file mode 100644 index 000000000000..408ffcdbfc08 --- /dev/null +++ b/llvm/utils/gn/build/write_cmake_config.py @@ -0,0 +1,109 @@ +"""Processes a foo.h.cmake file and writes foo.h. + +Takes a list of KEY=VALUE pairs (where VALUE can be empty). + +Handles these types of lines (note that FOO= sets the value of FOO to the empty +string, which is falsy, but FOO=0 sets it to '0' which is truthy): + +1.) #cmakedefine01 FOO + Checks if key FOO is set to a truthy value, and depending on that prints + one of the following two lines: + + #define FOO 1 + #define FOO 0 + +2.) #cmakedefine FOO + Checks if key FOO is set to a truthy in value, and depending on that prints + one of the following two lines: + + #define FOO + /* #undef FOO */ + +3.) #cmakedefine FOO asdf${BAR}jkl + Checks if key FOO is set to a truthy values, and if so replaces all + variable references in `asdf${BAR}jkl` with their value and prints that + (else it prints the same undef line as the previous form): + + #define FOO asdfBAR_VALjkl + /* #undef FOO */ + +4.) #define FOO asdf{BAR}jkl + Always gets its variable values filled in, independent of FOO's value being + set: + + #define FOO asdfBAR_VALjkl + +Fails if any of the KEY=VALUE arguments aren't needed for processing the +.h.cmake file, or if the .h.cmake file has unreplaces ${VAR} references after +processing all values. +""" + +import argparse +import os +import re +import sys + + +def main(): + parser = argparse.ArgumentParser( + epilog=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('input', help='input file') + parser.add_argument('values', nargs='*', help='several KEY=VALUE pairs') + parser.add_argument('-o', '--output', required=True, + help='output file') + args = parser.parse_args() + + values = {} + for value in args.values: + key, val = value.split('=', 1) + values[key] = val + unused_values = set(values.keys()) + + # Matches e.g. '${CLANG_FOO}' and captures CLANG_FOO in group 1. + var_re = re.compile(r'\$\{([^}]*)\}') + + in_lines = open(args.input).readlines() + out_lines = [] + for in_line in in_lines: + def repl(m): + unused_values.discard(m.group(1)) + return values[m.group(1)] + if in_line.startswith('#cmakedefine01 '): + _, var = in_line.split() + out_lines.append('#define %s %d\n' % (var, 1 if values[var] else 0)) + unused_values.discard(var) + elif in_line.startswith('#cmakedefine '): + _, var = in_line.split(None, 1) + try: + var, val = var.split(None, 1) + except: + var, val = var.rstrip(), '\n' + if values[var]: + out_lines.append('#define %s %s' % (var, + var_re.sub(repl, val))) + else: + out_lines.append('/* #undef %s */\n' % var) + unused_values.discard(var) + else: + # In particular, handles `#define FOO ${FOO}` lines. + out_lines.append(var_re.sub(repl, in_line)) + + if unused_values: + print >>sys.stderr, 'Unused --values args:' + print >>sys.stderr, ' ', '\n '.join(unused_values) + return 1 + + output = ''.join(out_lines) + + leftovers = var_re.findall(output) + if leftovers: + print >>sys.stderr, 'unprocessed values:\n', '\n'.join(leftovers) + return 1 + + if not os.path.exists(args.output) or open(args.output).read() != output: + open(args.output, 'w').write(output) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/llvm/utils/gn/secondary/BUILD.gn b/llvm/utils/gn/secondary/BUILD.gn index 35547d9d5b6f..4b6e17ff722a 100644 --- a/llvm/utils/gn/secondary/BUILD.gn +++ b/llvm/utils/gn/secondary/BUILD.gn @@ -1,6 +1,6 @@ group("default") { deps = [ - "//llvm/lib/Demangle", + "//llvm/tools/llvm-undname", ] } diff --git a/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn b/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn new file mode 100644 index 000000000000..1aa41e90f8d2 --- /dev/null +++ b/llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn @@ -0,0 +1,354 @@ +import("//llvm/lib/Target/targets.gni") +import("//llvm/triples.gni") +import("//llvm/utils/gn/build/buildflags.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/xml/enable.gni") +import("//llvm/utils/gn/build/libs/zlib/enable.gni") +import("//llvm/version.gni") + +# Contains actions to create config.h, llvm-config.h and abi-breaking.h. +# 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. + +# 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 +} + +action("abi-breaking") { + script = "//llvm/utils/gn/build/write_cmake_config.py" + + sources = [ + "abi-breaking.h.cmake", + ] + outputs = [ + "$target_gen_dir/abi-breaking.h", + ] + args = [ + "-o", + rebase_path(outputs[0], root_out_dir), + + rebase_path(sources[0], root_out_dir), + ] + + if (llvm_enable_abi_breaking_checks) { + args += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ] + } else { + args += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ] + } + + if (llvm_enable_reverse_iteration) { + args += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ] + } else { + args += [ "LLVM_ENABLE_REVERSE_ITERATION=" ] + } +} + +action("config") { + script = "//llvm/utils/gn/build/write_cmake_config.py" + + public_deps = [ + ":llvm-config", + ] + + sources = [ + "config.h.cmake", + ] + outputs = [ + "$target_gen_dir/config.h", + ] + args = [ + "-o", + rebase_path(outputs[0], root_out_dir), + rebase_path(sources[0], root_out_dir), + + "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_STRERROR=1", + "HAVE_SYS_STAT_H=1", + "HAVE_SYS_TYPES_H=1", + "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=", + + # 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 (host_os == "linux") { + args += [ + "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_VALGRIND_VALGRIND_H=1", + ] + } else { + args += [ + "HAVE_FUTIMENS=", + "HAVE_LINK_H=", + "HAVE_LSEEK64=", + "HAVE_MALLINFO=", + "HAVE_POSIX_FALLOCATE=", + "HAVE_SCHED_GETAFFINITY=", + "HAVE_CPU_COUNT=", + "HAVE_VALGRIND_VALGRIND_H=", + ] + } + + if (host_os == "mac") { + args += [ + "HAVE_CRASHREPORTER_INFO=1", + "HAVE_DECL_ARC4RANDOM=1", + "HAVE_DLADDR=1", + "HAVE_LIBEDIT=1", + "HAVE_MALLOC_H=", + "HAVE_MACH_MACH_H=1", + "HAVE_MALLOC_MALLOC_H=1", + "HAVE_MALLOC_ZONE_STATISTICS=1", + "HAVE_LIBXAR=1", + ] + } else { + args += [ + "HAVE_CRASHREPORTER_INFO=", + "HAVE_DECL_ARC4RANDOM=", + "HAVE_DLADDR=", + "HAVE_LIBEDIT=", + "HAVE_MACH_MACH_H=", + "HAVE_MALLOC_H=1", + "HAVE_MALLOC_MALLOC_H=", + "HAVE_MALLOC_ZONE_STATISTICS=", + "HAVE_LIBXAR=", + ] + } + + if (host_os == "win") { + args += [ + "HAVE_BACKTRACE=", + "HAVE_DECL_STRERROR_S=1", + "HAVE_DLFCN_H=", + "HAVE_DLOPEN=", + "HAVE_FUTIMES=", + "HAVE_GETPAGESIZE=", + "HAVE_GETRLIMIT=", + "HAVE_GETRUSAGE=", + "HAVE_ISATTY=", + "HAVE_LIBPTHREAD=", + "HAVE_PTHREAD_GETNAME_NP=", + "HAVE_PTHREAD_SETNAME_NP=", + "HAVE_LIBZ=", + "HAVE_POSIX_SPAWN=", + "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. + args += [ + "HAVE_BACKTRACE=1", + "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_GETNAME_NP=1", + "HAVE_PTHREAD_SETNAME_NP=1", + "HAVE_LIBZ=1", + "HAVE_POSIX_SPAWN=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 (host_os == "linux") { + args += [ "LTDL_SHLIB_EXT=.so" ] + } else if (host_os == "mac") { + args += [ "LTDL_SHLIB_EXT=.dylib" ] + } else if (host_os == "win") { + args += [ "LTDL_SHLIB_EXT=.dll" ] + } + + if (llvm_enable_terminfo) { + args += [ "HAVE_TERMINFO=1" ] + } else { + args += [ "HAVE_TERMINFO=" ] + } + + if (llvm_enable_zlib) { + args += [ "LLVM_ENABLE_ZLIB=1" ] + } else { + args += [ "LLVM_ENABLE_ZLIB=" ] + } + + if (llvm_enable_libxml2) { + args += [ "LLVM_LIBXML2_ENABLED=1" ] + } else { + args += [ "LLVM_LIBXML2_ENABLED=" ] + } +} + +action("llvm-config") { + script = "//llvm/utils/gn/build/write_cmake_config.py" + + sources = [ + "llvm-config.h.cmake", + ] + outputs = [ + "$target_gen_dir/llvm-config.h", + ] + args = [ + "-o", + rebase_path(outputs[0], root_out_dir), + rebase_path(sources[0], root_out_dir), + + "LLVM_ENABLE_DUMP=", + "LINK_POLLY_INTO_TOOLS=", + "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple", + "LLVM_HAS_ATOMICS=1", + "LLVM_HOST_TRIPLE=$llvm_host_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 (host_os == "win") { + args += [ "LLVM_ON_UNIX=" ] + } else { + args += [ "LLVM_ON_UNIX=1" ] + } + + if (llvm_enable_threads) { + args += [ "LLVM_ENABLE_THREADS=1" ] + } else { + args += [ "LLVM_ENABLE_THREADS=" ] + } +} diff --git a/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn new file mode 100644 index 000000000000..c51b824859d4 --- /dev/null +++ b/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn @@ -0,0 +1,155 @@ +static_library("Support") { + output_name = "LLVMSupport" + deps = [ + "//llvm/include/llvm/Config:config", + "//llvm/lib/Demangle", + "//llvm/utils/gn/build/libs/pthread", + "//llvm/utils/gn/build/libs/terminfo", + "//llvm/utils/gn/build/libs/zlib", + ] + + # public_deps are used for depending on targets that generate headers + # which are included in public headers of this target. public_deps means + # that targets depending on Support will implicitly be built only after + # abi-breaking and llvm-config have been built. + public_deps = [ + # abi-breaking.h is also include by public headers in ADT, but ADT has + # no target in the gn build. Since everything depends on Support, this + # public_dep does double duty of abi-breaking.h uses in public headers of + # both Support and ADT. + "//llvm/include/llvm/Config:abi-breaking", + "//llvm/include/llvm/Config:llvm-config", + ] + include_dirs = [ + "Unix", + "Windows", + ] + sources = [ + "AMDGPUMetadata.cpp", + "APFloat.cpp", + "APInt.cpp", + "APSInt.cpp", + "ARMAttributeParser.cpp", + "ARMBuildAttrs.cpp", + "ARMWinEH.cpp", + "Allocator.cpp", + "BinaryStreamError.cpp", + "BinaryStreamReader.cpp", + "BinaryStreamRef.cpp", + "BinaryStreamWriter.cpp", + "BlockFrequency.cpp", + "BranchProbability.cpp", + "COM.cpp", + "CachePruning.cpp", + "Chrono.cpp", + "CodeGenCoverage.cpp", + "CommandLine.cpp", + "Compression.cpp", + "ConvertUTF.cpp", + "ConvertUTFWrapper.cpp", + "CrashRecoveryContext.cpp", + "DAGDeltaAlgorithm.cpp", + "DJB.cpp", + "DataExtractor.cpp", + "Debug.cpp", + "DebugCounter.cpp", + "DeltaAlgorithm.cpp", + "Error.cpp", + "ErrorHandling.cpp", + "FileCheck.cpp", + "FileOutputBuffer.cpp", + "FileUtilities.cpp", + "FoldingSet.cpp", + "FormatVariadic.cpp", + "FormattedStream.cpp", + "GlobPattern.cpp", + "GraphWriter.cpp", + "Hashing.cpp", + "InitLLVM.cpp", + "IntEqClasses.cpp", + "IntervalMap.cpp", + "ItaniumManglingCanonicalizer.cpp", + "JSON.cpp", + "JamCRC.cpp", + "KnownBits.cpp", + "LEB128.cpp", + "LineIterator.cpp", + "Locale.cpp", + "LockFileManager.cpp", + "LowLevelType.cpp", + "MD5.cpp", + "ManagedStatic.cpp", + "MathExtras.cpp", + "MemoryBuffer.cpp", + "NativeFormatting.cpp", + "Options.cpp", + "Parallel.cpp", + "PluginLoader.cpp", + "PrettyStackTrace.cpp", + "RandomNumberGenerator.cpp", + "Regex.cpp", + "SHA1.cpp", + "ScaledNumber.cpp", + "ScopedPrinter.cpp", + "SmallPtrSet.cpp", + "SmallVector.cpp", + "SourceMgr.cpp", + "SpecialCaseList.cpp", + "Statistic.cpp", + "StringExtras.cpp", + "StringMap.cpp", + "StringPool.cpp", + "StringRef.cpp", + "StringSaver.cpp", + "SymbolRemappingReader.cpp", + "SystemUtils.cpp", + "TarWriter.cpp", + "TargetParser.cpp", + "ThreadPool.cpp", + "Timer.cpp", + "ToolOutputFile.cpp", + "TrigramIndex.cpp", + "Triple.cpp", + "Twine.cpp", + "Unicode.cpp", + "UnicodeCaseFold.cpp", + "VersionTuple.cpp", + "WithColor.cpp", + "YAMLParser.cpp", + "YAMLTraits.cpp", + "circular_raw_ostream.cpp", + "raw_os_ostream.cpp", + "raw_ostream.cpp", + "regcomp.c", + "regerror.c", + "regexec.c", + "regfree.c", + "regstrlcpy.c", + "xxhash.cpp", + + # System + "Atomic.cpp", + "DynamicLibrary.cpp", + "Errno.cpp", + "Host.cpp", + "Memory.cpp", + "Mutex.cpp", + "Path.cpp", + "Process.cpp", + "Program.cpp", + "RWMutex.cpp", + "Signals.cpp", + "TargetRegistry.cpp", + "ThreadLocal.cpp", + "Threading.cpp", + "Valgrind.cpp", + "VirtualFileSystem.cpp", + "Watchdog.cpp", + ] + + libs = [] + + if (host_os == "linux") { + libs += [ "dl" ] + } +} diff --git a/llvm/utils/gn/secondary/llvm/lib/Target/targets.gni b/llvm/utils/gn/secondary/llvm/lib/Target/targets.gni new file mode 100644 index 000000000000..8d8efeb6bc6a --- /dev/null +++ b/llvm/utils/gn/secondary/llvm/lib/Target/targets.gni @@ -0,0 +1,54 @@ +declare_args() { + # The target archs LLVM should support. Defaults to the host arch. + # Set to a list, e.g. `llvm_targets_to_build = [ "X86", "ARM" ]`, + # or to the string "all" to get all known targets. + llvm_targets_to_build = "host" +} + +if (llvm_targets_to_build == "host") { + if (host_cpu == "x86" || host_cpu == "x64") { + llvm_targets_to_build = [ "X86" ] + } else if (host_cpu == "arm") { + llvm_targets_to_build = [ "ARM" ] + } else if (host_cpu == "arm64") { + llvm_targets_to_build = [ "AArch64" ] + } else { + assert(false, "add your host_cpu above") + } +} else if (llvm_targets_to_build == "all") { + # FIXME: Port the remaining targets. + llvm_targets_to_build = [ + "AArch64", + "ARM", + "X86", + ] +} + +# Validate that llvm_targets_to_build is set to a list of valid targets, +# and remember which targets are built. +llvm_build_AArch64 = false +llvm_build_ARM = false +llvm_build_X86 = false +foreach(target, llvm_targets_to_build) { + if (target == "AArch64") { + llvm_build_AArch64 = true + } else if (target == "ARM") { + llvm_build_ARM = true + } else if (target == "X86") { + llvm_build_X86 = true + } else { + #FIXME : Port the remaining targets. + assert(false, "Unknown target '$target'.") + } +} + +# FIXME: This should be based off target_cpu once cross compiles work. +if (host_cpu == "x86" || host_cpu == "x64") { + native_target = "X86" +} else if (host_cpu == "arm") { + native_target = "ARM" +} else if (host_cpu == "arm64") { + native_target = "AArch64" +} else { + assert(false, "Unsuppored host_cpu '$host_cpu'.") +} diff --git a/llvm/utils/gn/secondary/llvm/tools/llvm-undname/BUILD.gn b/llvm/utils/gn/secondary/llvm/tools/llvm-undname/BUILD.gn new file mode 100644 index 000000000000..56f1ed11bc49 --- /dev/null +++ b/llvm/utils/gn/secondary/llvm/tools/llvm-undname/BUILD.gn @@ -0,0 +1,9 @@ +executable("llvm-undname") { + deps = [ + "//llvm/lib/Demangle", + "//llvm/lib/Support", + ] + sources = [ + "llvm-undname.cpp", + ] +} diff --git a/llvm/utils/gn/secondary/llvm/triples.gni b/llvm/utils/gn/secondary/llvm/triples.gni new file mode 100644 index 000000000000..b5ff76237218 --- /dev/null +++ b/llvm/utils/gn/secondary/llvm/triples.gni @@ -0,0 +1,12 @@ +if (host_os == "linux") { + llvm_host_triple = "x86_64-unknown-linux-gnu" +} else if (host_os == "mac") { + llvm_host_triple = "x86_64-apple-darwin" +} else if (host_os == "win") { + llvm_host_triple = "x86_64-pc-windows" +} + +declare_args() { + # The default target triple. + llvm_target_triple = llvm_host_triple +} diff --git a/llvm/utils/gn/secondary/llvm/version.gni b/llvm/utils/gn/secondary/llvm/version.gni new file mode 100644 index 000000000000..b64e3f9bdec0 --- /dev/null +++ b/llvm/utils/gn/secondary/llvm/version.gni @@ -0,0 +1,4 @@ +llvm_version_major = 8 +llvm_version_minor = 0 +llvm_version_patch = 0 +llvm_version = "$llvm_version_major.$llvm_version_minor.$llvm_version_patch"