diff options
| author | Petr Hosek <phosek@chromium.org> | 2016-12-14 16:46:50 +0000 |
|---|---|---|
| committer | Petr Hosek <phosek@chromium.org> | 2016-12-14 16:46:50 +0000 |
| commit | fe2c2b082ff2cc3c9eb28d13407cc75e32c6cf6d (patch) | |
| tree | 12819cc4d545baa7ace979297867514e5a4df731 | |
| parent | f5bf03c7ef61c7e6f44ce22a5144b5e13be6e797 (diff) | |
| download | bcm5719-llvm-fe2c2b082ff2cc3c9eb28d13407cc75e32c6cf6d.tar.gz bcm5719-llvm-fe2c2b082ff2cc3c9eb28d13407cc75e32c6cf6d.zip | |
[Driver] Allow setting the default linker during build
This change allows setting the default linker used by the Clang
driver when configuring the build.
Differential Revision: https://reviews.llvm.org/D25263
llvm-svn: 289668
| -rw-r--r-- | clang/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | clang/include/clang/Config/config.h.cmake | 3 | ||||
| -rw-r--r-- | clang/include/clang/Driver/ToolChain.h | 6 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 46 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChains.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChains.h | 12 |
6 files changed, 45 insertions, 34 deletions
diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt index 422bedaa987..509c7a428f6 100644 --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -198,6 +198,9 @@ set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld") set(ENABLE_X86_RELAX_RELOCATIONS OFF CACHE BOOL "enable x86 relax relocations by default") +set(CLANG_DEFAULT_LINKER "" CACHE STRING + "Default linker to use (linker name or absolute path, empty for platform default)") + set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default") if (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR diff --git a/clang/include/clang/Config/config.h.cmake b/clang/include/clang/Config/config.h.cmake index 9bf9ea5d8a7..55f0ca94ded 100644 --- a/clang/include/clang/Config/config.h.cmake +++ b/clang/include/clang/Config/config.h.cmake @@ -8,6 +8,9 @@ /* Bug report URL. */ #define BUG_REPORT_URL "${BUG_REPORT_URL}" +/* Default linker to use. */ +#define CLANG_DEFAULT_LINKER "${CLANG_DEFAULT_LINKER}" + /* Default C++ stdlib to use. */ #define CLANG_DEFAULT_CXX_STDLIB "${CLANG_DEFAULT_CXX_STDLIB}" diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 53b8fbcdafd..cca239c4be2 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -105,7 +105,6 @@ private: protected: MultilibSet Multilibs; - const char *DefaultLinker = "ld"; ToolChain(const Driver &D, const llvm::Triple &T, const llvm::opt::ArgList &Args); @@ -272,6 +271,11 @@ public: return 0; } + /// GetDefaultLinker - Get the default linker to use. + virtual const char *getDefaultLinker() const { + return "ld"; + } + /// GetDefaultRuntimeLibType - Get the default runtime library variant to use. virtual RuntimeLibType GetDefaultRuntimeLibType() const { return ToolChain::RLT_Libgcc; diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 90eaff12a53..6adc0386ee7 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -351,33 +351,31 @@ std::string ToolChain::GetProgramPath(const char *Name) const { } std::string ToolChain::GetLinkerPath() const { - if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) { - StringRef UseLinker = A->getValue(); - - if (llvm::sys::path::is_absolute(UseLinker)) { - // If we're passed -fuse-ld= with what looks like an absolute path, - // don't attempt to second-guess that. - if (llvm::sys::fs::exists(UseLinker)) - return UseLinker; - } else { - // If we're passed -fuse-ld= with no argument, or with the argument ld, - // then use whatever the default system linker is. - if (UseLinker.empty() || UseLinker == "ld") - return GetProgramPath("ld"); - - llvm::SmallString<8> LinkerName("ld."); - LinkerName.append(UseLinker); - - std::string LinkerPath(GetProgramPath(LinkerName.c_str())); - if (llvm::sys::fs::exists(LinkerPath)) - return LinkerPath; - } + const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ); + StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER; + + if (llvm::sys::path::is_absolute(UseLinker)) { + // If we're passed what looks like an absolute path, don't attempt to + // second-guess that. + if (llvm::sys::fs::exists(UseLinker)) + return UseLinker; + } else if (UseLinker.empty() || UseLinker == "ld") { + // If we're passed -fuse-ld= with no argument, or with the argument ld, + // then use whatever the default system linker is. + return GetProgramPath(getDefaultLinker()); + } else { + llvm::SmallString<8> LinkerName("ld."); + LinkerName.append(UseLinker); + + std::string LinkerPath(GetProgramPath(LinkerName.c_str())); + if (llvm::sys::fs::exists(LinkerPath)) + return LinkerPath; + } + if (A) getDriver().Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args); - return ""; - } - return GetProgramPath(DefaultLinker); + return GetProgramPath(getDefaultLinker()); } types::ID ToolChain::LookupTypeForExtension(StringRef Ext) const { diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index 1b1e04099cf..46707aa06ba 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -3059,9 +3059,6 @@ MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D, LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple); getFilePaths().clear(); getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix); - - // Use LLD by default. - DefaultLinker = "lld"; } void MipsLLVMToolChain::AddClangSystemIncludeArgs( @@ -4749,9 +4746,6 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, getFilePaths().push_back(D.SysRoot + "/lib"); getFilePaths().push_back(D.ResourceDir + "/lib/fuchsia"); - - // Use LLD by default. - DefaultLinker = "lld"; } Tool *Fuchsia::buildAssembler() const { @@ -5173,9 +5167,6 @@ WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple, assert(Triple.isArch32Bit() != Triple.isArch64Bit()); getFilePaths().push_back( getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64")); - - // Use LLD by default. - DefaultLinker = "lld"; } bool WebAssembly::IsMathErrnoDefault() const { return false; } diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 0515aee808c..7dab08915d4 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -961,6 +961,10 @@ public: : RuntimeLibType::RLT_CompilerRT; } + const char *getDefaultLinker() const override { + return "lld"; + } + private: Multilib SelectedMultilib; std::string LibSuffix; @@ -1090,6 +1094,10 @@ public: void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; + const char *getDefaultLinker() const override { + return "lld"; + } + protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; @@ -1289,6 +1297,10 @@ private: const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + const char *getDefaultLinker() const override { + return "lld"; + } + Tool *buildLinker() const override; }; |

