Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ clang/include/clang/Driver/ToolChain.h @@ -286,8 +286,8 @@ // Helper methods - std::string GetFilePath(const char *Name) const; - std::string GetProgramPath(const char *Name) const; + std::string GetFilePath(StringRef Name) const; + std::string GetProgramPath(StringRef Name) const; /// Returns the linker path, respecting the -fuse-ld= argument to determine /// the linker suffix or name. Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -424,27 +424,29 @@ return getTool(AC); } -std::string ToolChain::GetFilePath(const char *Name) const { +std::string ToolChain::GetFilePath(StringRef Name) const { return D.GetFilePath(Name, *this); } -std::string ToolChain::GetProgramPath(const char *Name) const { +std::string ToolChain::GetProgramPath(StringRef Name) const { return D.GetProgramPath(Name, *this); } std::string ToolChain::GetLinkerPath() const { const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ); StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER; + StringRef DefaultLinker = getDefaultLinker(); 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::can_execute(UseLinker)) return UseLinker; - } else if (UseLinker.empty() || UseLinker == "ld") { + } else if (UseLinker.empty() || UseLinker == "ld" || DefaultLinker != "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()); + // or if the toolchain overrides default linker, then use whatever the + // default linker is. + return GetProgramPath(DefaultLinker); } else { llvm::SmallString<8> LinkerName; if (Triple.isOSDarwin()) @@ -453,7 +455,7 @@ LinkerName.append("ld."); LinkerName.append(UseLinker); - std::string LinkerPath(GetProgramPath(LinkerName.c_str())); + std::string LinkerPath(GetProgramPath(LinkerName)); if (llvm::sys::fs::can_execute(LinkerPath)) return LinkerPath; } @@ -461,7 +463,7 @@ if (A) getDriver().Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args); - return GetProgramPath(getDefaultLinker()); + return GetProgramPath(DefaultLinker); } types::ID ToolChain::LookupTypeForExtension(StringRef Ext) const {