<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Nov 9, 2013 at 6:16 AM, David Chisnall <span dir="ltr"><<a href="mailto:csdavec@swan.ac.uk" target="_blank" class="cremed">csdavec@swan.ac.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: theraven<br>
Date: Sat Nov  9 08:16:52 2013<br>
New Revision: 194328<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=194328&view=rev" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project?rev=194328&view=rev</a><br>
Log:<br>
Add support for -fuse-ld=.<br>
<br>
<br>
Added:<br>
    cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/<br>
    cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd<br>
    cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold<br>
    cfe/trunk/test/Driver/fuse_ld.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/include/clang/Driver/ToolChain.h<br>
    cfe/trunk/lib/Driver/ToolChain.cpp<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=194328&r1=194327&r2=194328&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=194328&r1=194327&r2=194328&view=diff</a><br>

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

==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Sat Nov  9 08:16:52 2013<br>
@@ -1434,7 +1434,8 @@ def fprofile_dir : Joined<["-"], "fprofi<br>
<br>
 defm profile_use : BooleanFFlag<"profile-use">, Group<clang_ignored_f_Group>;<br>
 def fprofile_use_EQ : Joined<["-"], "fprofile-use=">, Group<clang_ignored_f_Group>;<br>
-def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group<clang_ignored_f_Group>;<br>
+def fuse_ld_EQ : Joined<["-", "--"], "fuse-ld=">, Group<f_Group>,<br></blockquote><div><br></div><div>Why add a '--' prefix? No other f-group flags use '--'? I don't think this is right.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  HelpText<"The suffix of the linker to use (e.g. bfd for ld.bfd).">;<br>
<br>
 defm align_functions : BooleanFFlag<"align-functions">, Group<clang_ignored_f_Group>;<br>
 def falign_functions_EQ : Joined<["-"], "falign-functions=">, Group<clang_ignored_f_Group>;<br>
<br>
Modified: cfe/trunk/include/clang/Driver/ToolChain.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=194328&r1=194327&r2=194328&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=194328&r1=194327&r2=194328&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Driver/ToolChain.h (original)<br>
+++ cfe/trunk/include/clang/Driver/ToolChain.h Sat Nov  9 08:16:52 2013<br>
@@ -126,6 +126,9 @@ public:<br>
<br>
   path_list &getProgramPaths() { return ProgramPaths; }<br>
   const path_list &getProgramPaths() const { return ProgramPaths; }<br>
+  /// Returns the linker path, respecting the -fuse-ld= argument to determine<br>
+  /// the linker suffix or name.<br>
+  std::string GetLinkerPath() const;<br></blockquote><div><br></div><div>Please put this down next to GetProgramPath. That makes a lot more sense than here.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
   const SanitizerArgs& getSanitizerArgs() const;<br>
<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChain.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=194328&r1=194327&r2=194328&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=194328&r1=194327&r2=194328&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChain.cpp (original)<br>
+++ cfe/trunk/lib/Driver/ToolChain.cpp Sat Nov  9 08:16:52 2013<br>
@@ -146,6 +146,28 @@ std::string ToolChain::GetProgramPath(co<br>
   return D.GetProgramPath(Name, *this);<br>
 }<br>
<br>
+std::string ToolChain::GetLinkerPath() const {<br>
+  if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {<br>
+    StringRef Value = A->getValue();<br>
+    // If we're passed -fuse-ld= with no argument, or with the argument ld,<br>
+    // then use whatever the default system linker is.<br>
+    if (Value.empty() || Value == "ld")<br>
+      return GetProgramPath("ld");<br>
+    std::string LinkerName = Value.str();<br>
+    std::string LD("ld.");<br>
+    LD += LinkerName;<br>
+    std::string LinkerPath = GetProgramPath(LD.c_str());<br></blockquote><div><br></div><div>This is kinda horrible string hacking.</div><div><br></div><div>Why don't you make GetProgramPath use a Twine argument? Then most of this vanishes.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    bool Exists;<br>
+    if (!llvm::sys::fs::exists(LinkerPath, Exists) && Exists)<br>
+      return LinkerPath;<br>
+    getDriver().Diag(diag::err_drv_invalid_linker_name)<br>
+      << A->getAsString(Args);<br>
+    return "";<br></blockquote><div><br></div><div>Why do we need to diagnose this? Surely either GetProgramPath will, or if not, the caller why might have gotten something bogus and undiagnosed from GetProgramPath will? While yes, you print out the argument if it fails, you don't test that it would have succeeded without the argument, and so this is just as likely to diagnose the wrong thing as it stands.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  }<br>
+  return GetProgramPath("ld");<br>
+}<br>
+<br>
+<br>
 types::ID ToolChain::LookupTypeForExtension(const char *Ext) const {<br>
   return types::lookupTypeForExtension(Ext);<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=194328&r1=194327&r2=194328&view=diff" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=194328&r1=194327&r2=194328&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Sat Nov  9 08:16:52 2013<br>
@@ -5184,7 +5184,7 @@ void solaris::Link::ConstructJob(Compila<br>
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());<br>
<br>
   const char *Exec =<br>
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+      Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -5296,7 +5296,7 @@ void auroraux::Link::ConstructJob(Compil<br>
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());<br>
<br>
   const char *Exec =<br>
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+    Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -5447,7 +5447,7 @@ void openbsd::Link::ConstructJob(Compila<br>
   }<br>
<br>
   const char *Exec =<br>
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+    Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -5587,7 +5587,7 @@ void bitrig::Link::ConstructJob(Compilat<br>
   }<br>
<br>
   const char *Exec =<br>
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+    Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -5838,7 +5838,7 @@ void freebsd::Link::ConstructJob(Compila<br>
   addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());<br>
<br>
   const char *Exec =<br>
-    Args.MakeArgString(ToolChain.GetProgramPath("ld"));<br>
+    Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -5992,7 +5992,7 @@ void netbsd::Link::ConstructJob(Compilat<br>
<br>
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());<br>
<br>
-  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+  const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -6503,7 +6503,7 @@ void minix::Link::ConstructJob(Compilati<br>
          Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));<br>
   }<br>
<br>
-  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+  const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
@@ -6687,7 +6687,7 @@ void dragonfly::Link::ConstructJob(Compi<br>
   addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());<br>
<br>
   const char *Exec =<br>
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));<br>
+    Args.MakeArgString(getToolChain().GetLinkerPath());<br>
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));<br>
 }<br>
<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd?rev=194328&view=auto" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.bfd?rev=194328&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold?rev=194328&view=auto" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/basic_freebsd_tree/usr/bin/ld.gold?rev=194328&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/fuse_ld.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fuse_ld.c?rev=194328&view=auto" target="_blank" class="cremed">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fuse_ld.c?rev=194328&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/Driver/fuse_ld.c (added)<br>
+++ cfe/trunk/test/Driver/fuse_ld.c Sat Nov  9 08:16:52 2013<br>
@@ -0,0 +1,14 @@<br>
+// RUN: %clang %s -### 2>&1 | FileCheck %s<br>
+// CHECK: ld<br>
+// RUN: %clang -fuse-ld=bfd --sysroot=%S/Inputs/basic_freebsd_tree \<br>
+// RUN:   -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \<br>
+// RUN:    FileCheck -check-prefix=CHECK-BFD %s<br>
+// CHECK-BFD: ld.bfd<br>
+// RUN: %clang -fuse-ld=gold --sysroot=%S/Inputs/basic_freebsd_tree \<br>
+// RUN:   -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \<br>
+// RUN:    FileCheck -check-prefix=CHECK-GOLD %s<br>
+// CHECK-GOLD: ld.gold<br>
+// RUN: %clang -fuse-ld=plib --sysroot=%S/Inputs/basic_freebsd_tree \<br>
+// RUN:   -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \<br>
+// RUN:    FileCheck -check-prefix=CHECK-PLIB %s<br>
+// CHECK-PLIB: error: invalid linker name<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" class="cremed">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank" class="cremed">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>