r194328 - Add support for -fuse-ld=.

David Chisnall csdavec at swan.ac.uk
Sat Nov 9 06:16:53 PST 2013


Author: theraven
Date: Sat Nov  9 08:16:52 2013
New Revision: 194328

URL: http://llvm.org/viewvc/llvm-project?rev=194328&view=rev
Log:
Add support for -fuse-ld=.


Added:
    cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/
    cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd
    cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold
    cfe/trunk/test/Driver/fuse_ld.c
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
    cfe/trunk/include/clang/Driver/Options.td
    cfe/trunk/include/clang/Driver/ToolChain.h
    cfe/trunk/lib/Driver/ToolChain.cpp
    cfe/trunk/lib/Driver/Tools.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=194328&r1=194327&r2=194328&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Sat Nov  9 08:16:52 2013
@@ -20,6 +20,8 @@ def err_drv_unknown_stdin_type : Error<
 def err_drv_unknown_language : Error<"language not recognized: '%0'">;
 def err_drv_invalid_arch_name : Error<
   "invalid arch name '%0'">;
+def err_drv_invalid_linker_name : Error<
+  "invalid linker name in argument '%0'">;
 def err_drv_invalid_rtlib_name : Error<
   "invalid runtime library name in argument '%0'">;
 def err_drv_unsupported_rtlib_for_platform : Error<

Modified: cfe/trunk/include/clang/Driver/Options.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=194328&r1=194327&r2=194328&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Options.td (original)
+++ cfe/trunk/include/clang/Driver/Options.td Sat Nov  9 08:16:52 2013
@@ -1434,7 +1434,8 @@ def fprofile_dir : Joined<["-"], "fprofi
 
 defm profile_use : BooleanFFlag<"profile-use">, Group<clang_ignored_f_Group>;
 def fprofile_use_EQ : Joined<["-"], "fprofile-use=">, Group<clang_ignored_f_Group>;
-def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group<clang_ignored_f_Group>;
+def fuse_ld_EQ : Joined<["-", "--"], "fuse-ld=">, Group<f_Group>,
+  HelpText<"The suffix of the linker to use (e.g. bfd for ld.bfd).">;
 
 defm align_functions : BooleanFFlag<"align-functions">, Group<clang_ignored_f_Group>;
 def falign_functions_EQ : Joined<["-"], "falign-functions=">, Group<clang_ignored_f_Group>;

Modified: cfe/trunk/include/clang/Driver/ToolChain.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=194328&r1=194327&r2=194328&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/ToolChain.h (original)
+++ cfe/trunk/include/clang/Driver/ToolChain.h Sat Nov  9 08:16:52 2013
@@ -126,6 +126,9 @@ public:
 
   path_list &getProgramPaths() { return ProgramPaths; }
   const path_list &getProgramPaths() const { return ProgramPaths; }
+  /// Returns the linker path, respecting the -fuse-ld= argument to determine
+  /// the linker suffix or name.
+  std::string GetLinkerPath() const;
 
   const SanitizerArgs& getSanitizerArgs() const;
 

Modified: cfe/trunk/lib/Driver/ToolChain.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=194328&r1=194327&r2=194328&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/ToolChain.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChain.cpp Sat Nov  9 08:16:52 2013
@@ -146,6 +146,28 @@ std::string ToolChain::GetProgramPath(co
   return D.GetProgramPath(Name, *this);
 }
 
+std::string ToolChain::GetLinkerPath() const {
+  if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
+    StringRef Value = A->getValue();
+    // If we're passed -fuse-ld= with no argument, or with the argument ld,
+    // then use whatever the default system linker is.
+    if (Value.empty() || Value == "ld")
+      return GetProgramPath("ld");
+    std::string LinkerName = Value.str();
+    std::string LD("ld.");
+    LD += LinkerName;
+    std::string LinkerPath = GetProgramPath(LD.c_str());
+    bool Exists;
+    if (!llvm::sys::fs::exists(LinkerPath, Exists) && Exists)
+      return LinkerPath;
+    getDriver().Diag(diag::err_drv_invalid_linker_name)
+      << A->getAsString(Args);
+    return "";
+  }
+  return GetProgramPath("ld");
+}
+
+
 types::ID ToolChain::LookupTypeForExtension(const char *Ext) const {
   return types::lookupTypeForExtension(Ext);
 }

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=194328&r1=194327&r2=194328&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Sat Nov  9 08:16:52 2013
@@ -5184,7 +5184,7 @@ void solaris::Link::ConstructJob(Compila
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
 
   const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+      Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -5296,7 +5296,7 @@ void auroraux::Link::ConstructJob(Compil
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
 
   const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+    Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -5447,7 +5447,7 @@ void openbsd::Link::ConstructJob(Compila
   }
 
   const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+    Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -5587,7 +5587,7 @@ void bitrig::Link::ConstructJob(Compilat
   }
 
   const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+    Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -5838,7 +5838,7 @@ void freebsd::Link::ConstructJob(Compila
   addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
 
   const char *Exec =
-    Args.MakeArgString(ToolChain.GetProgramPath("ld"));
+    Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -5992,7 +5992,7 @@ void netbsd::Link::ConstructJob(Compilat
 
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
 
-  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+  const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -6503,7 +6503,7 @@ void minix::Link::ConstructJob(Compilati
          Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
   }
 
-  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+  const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -6687,7 +6687,7 @@ void dragonfly::Link::ConstructJob(Compi
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
 
   const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+    Args.MakeArgString(getToolChain().GetLinkerPath());
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 

Added: cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd?rev=194328&view=auto
==============================================================================
    (empty)

Added: cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold?rev=194328&view=auto
==============================================================================
    (empty)

Added: cfe/trunk/test/Driver/fuse_ld.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fuse_ld.c?rev=194328&view=auto
==============================================================================
--- cfe/trunk/test/Driver/fuse_ld.c (added)
+++ cfe/trunk/test/Driver/fuse_ld.c Sat Nov  9 08:16:52 2013
@@ -0,0 +1,14 @@
+// RUN: %clang %s -### 2>&1 | FileCheck %s
+// CHECK: ld
+// RUN: %clang -fuse-ld=bfd --sysroot=%S/Inputs/basic_freebsd_tree \
+// RUN:   -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \
+// RUN:    FileCheck -check-prefix=CHECK-BFD %s
+// CHECK-BFD: ld.bfd
+// RUN: %clang -fuse-ld=gold --sysroot=%S/Inputs/basic_freebsd_tree \
+// RUN:   -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \
+// RUN:    FileCheck -check-prefix=CHECK-GOLD %s
+// CHECK-GOLD: ld.gold
+// RUN: %clang -fuse-ld=plib --sysroot=%S/Inputs/basic_freebsd_tree \
+// RUN:   -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \
+// RUN:    FileCheck -check-prefix=CHECK-PLIB %s
+// CHECK-PLIB: error: invalid linker name





More information about the cfe-commits mailing list