[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