From 14445814958ec683e9f877713a45ced2fc115664 Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 28 May 2017 17:04:27 +0200 Subject: [PATCH] Add experimental -internal-linker switch to enable LLD opt-in And infer CMake LDC_WITH_LLD automatically based on availability of LLVM 3.9+ with LLD headers & libs. --- CMakeLists.txt | 19 ++++++++++++------- driver/linker-gcc.cpp | 2 +- driver/linker-msvc.cpp | 3 +-- driver/linker.cpp | 23 +++++++++++++---------- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e2d2c33bf0..2e4cd98bc63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,8 +84,6 @@ set(LIB_SUFFIX "" CACHE STRING "Appended to the library installation directory. option(GENERATE_OFFTI "generate complete ClassInfo.offTi arrays") mark_as_advanced(GENERATE_OFFTI) -option(LDC_WITH_LLD "Integrate LLD, the LLVM cross-linker") - if(D_VERSION EQUAL 1) message(FATAL_ERROR "D version 1 is no longer supported. Please consider using D version 2 or checkout the 'd1' git branch for the last version supporting D version 1.") @@ -448,16 +446,23 @@ if(GENERATE_OFFTI) append("-DGENERATE_OFFTI" LDC_CXXFLAGS) endif() -if(LDC_WITH_LLD) - append("-DLDC_WITH_LLD" LDC_CXXFLAGS) +# +# LLD integration (requires LLVM >= 3.9 with LLD headers & libs) +# +set(LDC_WITH_LLD OFF) +if(LDC_LLVM_VER GREATER 308) + if(EXISTS "${LLVM_INCLUDE_DIRS}/lld/Driver/Driver.h") + message(STATUS "Building LDC with LLD support") + append("-DLDC_WITH_LLD" LDC_CXXFLAGS) + set(LDC_WITH_LLD ON) + endif() endif() -option(RISCV_LLVM_DEV, "full RISC-V support with riscv-llvm") -mark_as_advanced(RISCV_LLVM_DEV) - # # Enable building with riscv-llvm, for full RISC-V support. # +option(RISCV_LLVM_DEV, "full RISC-V support with riscv-llvm") +mark_as_advanced(RISCV_LLVM_DEV) if(RISCV_LLVM_DEV) append("-DRISCV_LLVM_DEV" LDC_CXXFLAGS) endif() diff --git a/driver/linker-gcc.cpp b/driver/linker-gcc.cpp index f4657403e46..c12f602526a 100644 --- a/driver/linker-gcc.cpp +++ b/driver/linker-gcc.cpp @@ -420,7 +420,7 @@ class LdArgsBuilder : public ArgsBuilder { ////////////////////////////////////////////////////////////////////////////// -int linkObjToBinaryGcc(llvm::StringRef outputPath, +int linkObjToBinaryGcc(llvm::StringRef outputPath, bool useInternalLinker, llvm::cl::boolOrDefault fullyStaticFlag) { // find gcc for linking const std::string tool = getGcc(); diff --git a/driver/linker-msvc.cpp b/driver/linker-msvc.cpp index b80c1be22dd..3624b3646a6 100644 --- a/driver/linker-msvc.cpp +++ b/driver/linker-msvc.cpp @@ -51,7 +51,7 @@ void addMscrtLibs(std::vector &args, ////////////////////////////////////////////////////////////////////////////// -int linkObjToBinaryMSVC(llvm::StringRef outputPath, +int linkObjToBinaryMSVC(llvm::StringRef outputPath, bool useInternalLinker, llvm::cl::boolOrDefault fullyStaticFlag) { if (!opts::ccSwitches.empty()) { error(Loc(), "-Xcc is not supported for MSVC"); @@ -165,7 +165,6 @@ int linkObjToBinaryMSVC(llvm::StringRef outputPath, logstr << "\n"; // FIXME where's flush ? #if LDC_WITH_LLD - const bool useInternalLinker = true; // TODO if (useInternalLinker) { const auto fullArgs = getFullArgs("lld-link.exe", args, global.params.verbose); diff --git a/driver/linker.cpp b/driver/linker.cpp index 2004a11b9d9..3ee2ccc9e4b 100644 --- a/driver/linker.cpp +++ b/driver/linker.cpp @@ -20,19 +20,27 @@ ////////////////////////////////////////////////////////////////////////////// -static llvm::cl::opt +static llvm::cl::opt staticFlag("static", llvm::cl::ZeroOrMore, llvm::cl::desc("Create a statically linked binary, including " "all system dependencies")); +#if LDC_WITH_LLD +static llvm::cl::opt + useInternalLinker("internal-linker", llvm::cl::ZeroOrMore, llvm::cl::Hidden, + llvm::cl::desc("Use internal LLD for linking")); +#else +constexpr bool useInternalLinker = false; +#endif + ////////////////////////////////////////////////////////////////////////////// // linker-gcc.cpp -int linkObjToBinaryGcc(llvm::StringRef outputPath, +int linkObjToBinaryGcc(llvm::StringRef outputPath, bool useInternalLinker, llvm::cl::boolOrDefault fullyStaticFlag); // linker-msvc.cpp -int linkObjToBinaryMSVC(llvm::StringRef outputPath, +int linkObjToBinaryMSVC(llvm::StringRef outputPath, bool useInternalLinker, llvm::cl::boolOrDefault fullyStaticFlag); ////////////////////////////////////////////////////////////////////////////// @@ -135,16 +143,11 @@ int linkObjToBinary() { createDirectoryForFileOrFail(gExePath); - llvm::cl::boolOrDefault fullyStaticFlag = llvm::cl::BOU_UNSET; - if (staticFlag.getNumOccurrences() != 0) { - fullyStaticFlag = staticFlag ? llvm::cl::BOU_TRUE : llvm::cl::BOU_FALSE; - } - if (global.params.targetTriple->isWindowsMSVCEnvironment()) { - return linkObjToBinaryMSVC(gExePath, fullyStaticFlag); + return linkObjToBinaryMSVC(gExePath, useInternalLinker, staticFlag); } - return linkObjToBinaryGcc(gExePath, fullyStaticFlag); + return linkObjToBinaryGcc(gExePath, useInternalLinker, staticFlag); } //////////////////////////////////////////////////////////////////////////////