[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