[pkg-d-commits] [ldc] 66/74: Add experimental -link-internally switch to enable LLD opt-in

Matthias Klumpp mak at moszumanska.debian.org
Thu Jul 13 20:54:19 UTC 2017


This is an automated email from the git hooks/post-receive script.

mak pushed a commit to annotated tag v1.3.0-beta2
in repository ldc.

commit 9fd7fa2d903b602492b0b85b5a8e049e7df37775
Author: Martin <noone at nowhere.com>
Date:   Sun May 28 17:04:27 2017 +0200

    Add experimental -link-internally 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         | 28 +++++++++++++++++++++-------
 driver/linker-gcc.cpp  |  2 +-
 driver/linker-msvc.cpp |  3 +--
 driver/linker.cpp      | 23 +++++++++++++----------
 4 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e2d2c3..336bbdb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,6 +5,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules")
 
 include(FindDCompiler)
 include(CheckIncludeFile)
+include(CheckIncludeFileCXX)
 include(CheckLibraryExists)
 include(CheckCXXCompilerFlag)
 include(CheckDSourceCompiles)
@@ -84,8 +85,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 +447,31 @@ 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)
+    # check for LLD header
+    unset(LDC_WITH_LLD)
+    if(NOT MSVC)
+        set(CMAKE_REQUIRED_FLAGS -std=c++11)
+    endif()
+    set(CMAKE_REQUIRED_INCLUDES ${LLVM_INCLUDE_DIRS})
+    CHECK_INCLUDE_FILE_CXX(lld/Driver/Driver.h LDC_WITH_LLD)
+    unset(CMAKE_REQUIRED_FLAGS)
+    unset(CMAKE_REQUIRED_INCLUDES)
+    if(LDC_WITH_LLD)
+        message(STATUS "Building LDC with LLD support")
+        append("-DLDC_WITH_LLD" LDC_CXXFLAGS)
+    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 f465740..c12f602 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 b80c1be..3624b36 100644
--- a/driver/linker-msvc.cpp
+++ b/driver/linker-msvc.cpp
@@ -51,7 +51,7 @@ void addMscrtLibs(std::vector<std::string> &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 2004a11..4a5caa8 100644
--- a/driver/linker.cpp
+++ b/driver/linker.cpp
@@ -20,19 +20,27 @@
 
 //////////////////////////////////////////////////////////////////////////////
 
-static llvm::cl::opt<bool>
+static llvm::cl::opt<llvm::cl::boolOrDefault>
     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<bool>
+    useInternalLinker("link-internally", 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);
 }
 
 //////////////////////////////////////////////////////////////////////////////

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-d/ldc.git



More information about the pkg-d-commits mailing list