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 /clang/lib/Driver/ToolChain.cpp | |
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
Diffstat (limited to 'clang/lib/Driver/ToolChain.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 46 |
1 files changed, 22 insertions, 24 deletions
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 { |