[cfe-commits] Support for cross-assembler and cross-linker on FreeBSD and Darwin

Damjan Marion damjan.marion at gmail.com
Mon Jun 20 17:22:37 PDT 2011


On Jun 20, 2011, at 11:38 PM, Joerg Sonnenberger wrote:

> On Mon, Jun 20, 2011 at 05:56:40PM +0200, Damjan Marion wrote:
>> This patch adds same functionality for FreeBSD and Darwin and it is tested on both platforms.
> 
> It's slightly outdated though. FindTargetProgramPath now takes the
> triple as explicit argument to allow proper dealing with -m32 / -m64 and
> the like.

Yes, i realized few hours ago that you made some changes in meantime. Here is new patch,
based on your changes:


diff --git a/lib/Driver/HostInfo.cpp b/lib/Driver/HostInfo.cpp
index 3b1c2c7..5b021e6 100644
--- a/lib/Driver/HostInfo.cpp
+++ b/lib/Driver/HostInfo.cpp
@@ -356,14 +356,20 @@ ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
     }
   }
 
-  ToolChain *&TC = ToolChains[ArchName];
-  if (!TC) {
-    llvm::Triple TCTriple(getTriple());
-    TCTriple.setArchName(ArchName);
+  llvm::Triple TargetTriple(getTriple());
+  TargetTriple.setArchName(ArchName);
+
+  ToolChain *TC;
 
-    TC = new toolchains::FreeBSD(*this, TCTriple);
+  // XXX Cache toolchain even if -m32 is used
+  if (Arch == ArchName) {
+    TC = ToolChains[ArchName];
+    if (TC)
+      return TC;
   }
 
+  TC = new toolchains::NetBSD(*this, TargetTriple, getTriple());
+
   return TC;
 }
 
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 53ef722..2c9cbb0 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -1092,8 +1092,9 @@ Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
 
 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
 
-FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
-  : Generic_ELF(Host, Triple) {
+FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple,
+                 const llvm::Triple& ToolTriple)
+  : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) {
 
   // Determine if we are compiling 32-bit code on an x86_64 platform.
   bool Lib32 = false;
@@ -1133,10 +1134,11 @@ Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
       if (UseIntegratedAs)
         T = new tools::ClangAs(*this);
       else
-        T = new tools::freebsd::Assemble(*this);
+        T = new tools::freebsd::Assemble(*this, ToolTriple);
       break;
     case Action::LinkJobClass:
-      T = new tools::freebsd::Link(*this); break;
+      T = new tools::freebsd::Link(*this, ToolTriple);
+      break;
     default:
       T = &Generic_GCC::SelectTool(C, JA, Inputs);
     }
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
index 7325874..ca0da29 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -318,8 +318,11 @@ public:
 };
 
 class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
+  const llvm::Triple ToolTriple;
+
 public:
-  FreeBSD(const HostInfo &Host, const llvm::Triple& Triple);
+  FreeBSD(const HostInfo &Host, const llvm::Triple& Triple,
+          const llvm::Triple& ToolTriple);
 
   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
                            const ActionList &Inputs) const;
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 804094b..fe95914 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -3541,8 +3541,9 @@ void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
     CmdArgs.push_back(II.getFilename());
   }
 
-  const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("as"));
+  const char *Exec = Args.MakeArgString(FindTargetProgramPath(getToolChain(),
+                                                      ToolTriple.getTriple(),
+                                                      "as"));
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
@@ -3693,8 +3694,9 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
 
   addProfileRT(getToolChain(), Args, CmdArgs);
 
-  const char *Exec =
-    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
+  const char *Exec = Args.MakeArgString(FindTargetProgramPath(getToolChain(),
+                                                      ToolTriple.getTriple(),
+                                                      "ld"));
   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
 }
 
diff --git a/lib/Driver/Tools.h b/lib/Driver/Tools.h
index 4a5a7e4..23e7772 100644
--- a/lib/Driver/Tools.h
+++ b/lib/Driver/Tools.h
@@ -310,9 +310,12 @@ namespace openbsd {
   /// freebsd -- Directly call GNU Binutils assembler and linker
 namespace freebsd {
   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
+  private:
+    const llvm::Triple ToolTriple;
+
   public:
-    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
-                                         TC) {}
+    Assemble(const ToolChain &TC, const llvm::Triple &ToolTriple)
+      : Tool("freebsd::Assemble", "assembler", TC), ToolTriple(ToolTriple) {}
 
     virtual bool hasIntegratedCPP() const { return false; }
 
@@ -323,8 +326,12 @@ namespace freebsd {
                               const char *LinkingOutput) const;
   };
   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
+  private:
+    const llvm::Triple ToolTriple;
+
   public:
-    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
+    Link(const ToolChain &TC, const llvm::Triple &ToolTriple)
+      : Tool("freebsd::Link", "linker", TC), ToolTriple(ToolTriple) {}
 
     virtual bool hasIntegratedCPP() const { return false; }
 





More information about the cfe-commits mailing list