[PATCH] D53250: [ToolChain] Use default linker if the toolchain uses a custom one

Petr Hosek via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 13 18:25:23 PDT 2018


phosek created this revision.
phosek added reviewers: rsmith, Hahnfeld.
Herald added a subscriber: cfe-commits.

When the toolchain overrides default linker, use it rather than the
default Clang one which is unlikely to be useable for that toolchain
anyway. This avoids the need to explicitly specify -fuse-ld in tests
for all targets that use custom linkers.


Repository:
  rC Clang

https://reviews.llvm.org/D53250

Files:
  clang/include/clang/Driver/ToolChain.h
  clang/lib/Driver/ToolChain.cpp


Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ clang/lib/Driver/ToolChain.cpp
@@ -424,44 +424,46 @@
   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())
       LinkerName.append("ld64.");
     else
       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;
   }
 
   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 {
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.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53250.169584.patch
Type: text/x-patch
Size: 2703 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181014/74cdb7a4/attachment.bin>


More information about the cfe-commits mailing list