aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Driver/ToolChain.h8
-rw-r--r--lib/Driver/Driver.cpp46
-rw-r--r--lib/Driver/ToolChain.cpp5
-rw-r--r--lib/Driver/ToolChains.cpp60
-rw-r--r--lib/Driver/ToolChains.h49
-rw-r--r--lib/Driver/WindowsToolChain.cpp5
-rw-r--r--test/Driver/prefixed-tools.c14
-rwxr-xr-xtest/Driver/prefixed-tools.c-helper/x86_64--linux-as2
-rwxr-xr-xtest/Driver/prefixed-tools.c-helper/x86_64--linux-ld2
9 files changed, 123 insertions, 68 deletions
diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h
index 4f3a3be681..7f033563c9 100644
--- a/include/clang/Driver/ToolChain.h
+++ b/include/clang/Driver/ToolChain.h
@@ -46,6 +46,9 @@ public:
private:
const Driver &D;
const llvm::Triple Triple;
+ /// The target triple originally requested by the user
+ /// before modifications due to -m32 and without normalization.
+ const std::string UserTriple;
/// The list of toolchain specific path prefixes to search for
/// files.
@@ -56,7 +59,7 @@ private:
path_list ProgramPaths;
protected:
- ToolChain(const Driver &D, const llvm::Triple &T);
+ ToolChain(const Driver &D, const llvm::Triple &T, const std::string &UT);
/// \name Utilities for implementing subclasses.
///@{
@@ -87,6 +90,9 @@ public:
std::string getTripleString() const {
return Triple.getTriple();
}
+ const std::string &getUserTriple() const {
+ return UserTriple;
+ }
path_list &getFilePaths() { return FilePaths; }
const path_list &getFilePaths() const { return FilePaths; }
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index 7c26a0ef15..10e2fd970b 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -1507,7 +1507,7 @@ static bool isPathExecutable(llvm::sys::Path &P, bool WantFile) {
std::string Driver::GetProgramPath(const char *Name, const ToolChain &TC,
bool WantFile) const {
- std::string TargetSpecificExecutable(DefaultTargetTriple + "-" + Name);
+ std::string TargetSpecificExecutable(TC.getUserTriple() + "-" + Name);
// Respect a limited subset of the '-Bprefix' functionality in GCC by
// attempting to use this prefix when lokup up program paths.
for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
@@ -1574,13 +1574,10 @@ std::string Driver::GetTemporaryPath(StringRef Prefix, const char *Suffix)
///
/// This routine provides the logic to compute a target triple from various
/// args passed to the driver and the default triple string.
-static llvm::Triple computeTargetTriple(StringRef DefaultTargetTriple,
+static llvm::Triple computeTargetTriple(StringRef TargetTriple,
const ArgList &Args,
StringRef DarwinArchName) {
- if (const Arg *A = Args.getLastArg(options::OPT_target))
- DefaultTargetTriple = A->getValue(Args);
-
- llvm::Triple Target(llvm::Triple::normalize(DefaultTargetTriple));
+ llvm::Triple Target(llvm::Triple::normalize(TargetTriple));
// Handle Darwin-specific options available here.
if (Target.isOSDarwin()) {
@@ -1627,14 +1624,19 @@ static llvm::Triple computeTargetTriple(StringRef DefaultTargetTriple,
const ToolChain &Driver::getToolChain(const ArgList &Args,
StringRef DarwinArchName) const {
- llvm::Triple Target = computeTargetTriple(DefaultTargetTriple, Args,
- DarwinArchName);
+ std::string TargetTriple(DefaultTargetTriple);
+ if (const Arg *A = Args.getLastArg(options::OPT_target))
+ TargetTriple = A->getValue(Args);
+
+ llvm::Triple Target = computeTargetTriple(TargetTriple, Args, DarwinArchName);
+
+ std::string TargetIndex = TargetTriple + "::" + Target.str();
- ToolChain *&TC = ToolChains[Target.str()];
+ ToolChain *&TC = ToolChains[TargetIndex];
if (!TC) {
switch (Target.getOS()) {
case llvm::Triple::AuroraUX:
- TC = new toolchains::AuroraUX(*this, Target);
+ TC = new toolchains::AuroraUX(*this, Target, TargetTriple);
break;
case llvm::Triple::Darwin:
case llvm::Triple::MacOSX:
@@ -1643,44 +1645,44 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
Target.getArch() == llvm::Triple::x86_64 ||
Target.getArch() == llvm::Triple::arm ||
Target.getArch() == llvm::Triple::thumb)
- TC = new toolchains::DarwinClang(*this, Target);
+ TC = new toolchains::DarwinClang(*this, Target, TargetTriple);
else
- TC = new toolchains::Darwin_Generic_GCC(*this, Target);
+ TC = new toolchains::Darwin_Generic_GCC(*this, Target, TargetTriple);
break;
case llvm::Triple::DragonFly:
- TC = new toolchains::DragonFly(*this, Target);
+ TC = new toolchains::DragonFly(*this, Target, TargetTriple);
break;
case llvm::Triple::OpenBSD:
- TC = new toolchains::OpenBSD(*this, Target);
+ TC = new toolchains::OpenBSD(*this, Target, TargetTriple);
break;
case llvm::Triple::NetBSD:
- TC = new toolchains::NetBSD(*this, Target);
+ TC = new toolchains::NetBSD(*this, Target, TargetTriple);
break;
case llvm::Triple::FreeBSD:
- TC = new toolchains::FreeBSD(*this, Target);
+ TC = new toolchains::FreeBSD(*this, Target, TargetTriple);
break;
case llvm::Triple::Minix:
- TC = new toolchains::Minix(*this, Target);
+ TC = new toolchains::Minix(*this, Target, TargetTriple);
break;
case llvm::Triple::Linux:
if (Target.getArch() == llvm::Triple::hexagon)
- TC = new toolchains::Hexagon_TC(*this, Target);
+ TC = new toolchains::Hexagon_TC(*this, Target, TargetTriple);
else
- TC = new toolchains::Linux(*this, Target);
+ TC = new toolchains::Linux(*this, Target, TargetTriple);
break;
case llvm::Triple::Win32:
- TC = new toolchains::Windows(*this, Target);
+ TC = new toolchains::Windows(*this, Target, TargetTriple);
break;
case llvm::Triple::MinGW32:
// FIXME: We need a MinGW toolchain. Fallthrough for now.
default:
// TCE is an OSless target
if (Target.getArchName() == "tce") {
- TC = new toolchains::TCEToolChain(*this, Target);
+ TC = new toolchains::TCEToolChain(*this, Target, TargetTriple);
break;
}
- TC = new toolchains::Generic_GCC(*this, Target);
+ TC = new toolchains::Generic_GCC(*this, Target, TargetTriple);
break;
}
}
diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp
index c0c9c504b6..52038d2327 100644
--- a/lib/Driver/ToolChain.cpp
+++ b/lib/Driver/ToolChain.cpp
@@ -20,8 +20,9 @@
using namespace clang::driver;
using namespace clang;
-ToolChain::ToolChain(const Driver &D, const llvm::Triple &T)
- : D(D), Triple(T) {
+ToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
+ const std::string &UserTriple)
+ : D(D), Triple(T), UserTriple(UserTriple) {
}
ToolChain::~ToolChain() {
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index ad1c362b5f..4e34dc5e18 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -45,8 +45,9 @@ using namespace clang;
/// Darwin - Darwin tool chain for i386 and x86_64.
-Darwin::Darwin(const Driver &D, const llvm::Triple& Triple)
- : ToolChain(D, Triple), TargetInitialized(false),
+Darwin::Darwin(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : ToolChain(D, Triple, UserTriple), TargetInitialized(false),
ARCRuntimeForSimulator(ARCSimulator_None),
LibCXXForSimulator(LibCXXSimulator_None)
{
@@ -250,8 +251,9 @@ Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
}
-DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple)
- : Darwin(D, Triple)
+DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Darwin(D, Triple, UserTriple)
{
getProgramPaths().push_back(getDriver().getInstalledDir());
if (getDriver().getInstalledDir() != getDriver().Dir)
@@ -1387,8 +1389,9 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
}
}
-Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple)
- : ToolChain(D, Triple), GCCInstallation(getDriver(), Triple) {
+Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : ToolChain(D, Triple, UserTriple), GCCInstallation(getDriver(), Triple) {
getProgramPaths().push_back(getDriver().getInstalledDir());
if (getDriver().getInstalledDir() != getDriver().Dir)
getProgramPaths().push_back(getDriver().Dir);
@@ -1458,8 +1461,9 @@ const char *Generic_GCC::GetForcedPicModel() const {
}
/// Hexagon Toolchain
-Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple& Triple)
- : ToolChain(D, Triple) {
+Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : ToolChain(D, Triple, UserTriple) {
getProgramPaths().push_back(getDriver().getInstalledDir());
if (getDriver().getInstalledDir() != getDriver().Dir.c_str())
getProgramPaths().push_back(getDriver().Dir);
@@ -1528,8 +1532,9 @@ const char *Hexagon_TC::GetForcedPicModel() const {
/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
/// Currently does not support anything else but compilation.
-TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple)
- : ToolChain(D, Triple) {
+TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : ToolChain(D, Triple, UserTriple) {
// Path mangling to find libexec
std::string Path(getDriver().Dir);
@@ -1581,8 +1586,9 @@ Tool &TCEToolChain::SelectTool(const Compilation &C,
/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
-OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple)
- : Generic_ELF(D, Triple) {
+OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_ELF(D, Triple, UserTriple) {
getFilePaths().push_back(getDriver().Dir + "/../lib");
getFilePaths().push_back("/usr/lib");
}
@@ -1621,8 +1627,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 Driver &D, const llvm::Triple& Triple)
- : Generic_ELF(D, Triple) {
+FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_ELF(D, Triple, UserTriple) {
// When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
// back to '/usr/lib' if it doesn't exist.
@@ -1667,8 +1674,9 @@ Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
-NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple)
- : Generic_ELF(D, Triple) {
+NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_ELF(D, Triple, UserTriple) {
if (getDriver().UseStdLib) {
// When targeting a 32-bit platform, try the special directory used on
@@ -1718,8 +1726,9 @@ Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
-Minix::Minix(const Driver &D, const llvm::Triple& Triple)
- : Generic_ELF(D, Triple) {
+Minix::Minix(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_ELF(D, Triple, UserTriple) {
getFilePaths().push_back(getDriver().Dir + "/../lib");
getFilePaths().push_back("/usr/lib");
}
@@ -1749,8 +1758,9 @@ Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
-AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple)
- : Generic_GCC(D, Triple) {
+AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_GCC(D, Triple, UserTriple) {
getProgramPaths().push_back(getDriver().getInstalledDir());
if (getDriver().getInstalledDir() != getDriver().Dir)
@@ -1965,8 +1975,9 @@ static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
}
-Linux::Linux(const Driver &D, const llvm::Triple &Triple)
- : Generic_ELF(D, Triple) {
+Linux::Linux(const Driver &D, const llvm::Triple &Triple,
+ const std::string &UserTriple)
+ : Generic_ELF(D, Triple, UserTriple) {
llvm::Triple::ArchType Arch = Triple.getArch();
const std::string &SysRoot = getDriver().SysRoot;
@@ -2274,8 +2285,9 @@ void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
-DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple)
- : Generic_ELF(D, Triple) {
+DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_ELF(D, Triple, UserTriple) {
// Path mangling to find libexec
getProgramPaths().push_back(getDriver().getInstalledDir());
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
index 071a36774d..7a39f9ae42 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -119,7 +119,8 @@ protected:
mutable llvm::DenseMap<unsigned, Tool*> Tools;
public:
- Generic_GCC(const Driver &D, const llvm::Triple& Triple);
+ Generic_GCC(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
~Generic_GCC();
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
@@ -150,7 +151,8 @@ protected:
mutable llvm::DenseMap<unsigned, Tool*> Tools;
public:
- Hexagon_TC(const Driver &D, const llvm::Triple& Triple);
+ Hexagon_TC(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
~Hexagon_TC();
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
@@ -212,7 +214,8 @@ private:
void AddDeploymentTarget(DerivedArgList &Args) const;
public:
- Darwin(const Driver &D, const llvm::Triple& Triple);
+ Darwin(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
~Darwin();
std::string ComputeEffectiveClangTriple(const ArgList &Args,
@@ -395,7 +398,8 @@ private:
void AddGCCLibexecPath(unsigned darwinVersion);
public:
- DarwinClang(const Driver &D, const llvm::Triple& Triple);
+ DarwinClang(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
/// @name Darwin ToolChain Implementation
/// {
@@ -422,8 +426,9 @@ public:
/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc.
class LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC {
public:
- Darwin_Generic_GCC(const Driver &D, const llvm::Triple& Triple)
- : Generic_GCC(D, Triple) {}
+ Darwin_Generic_GCC(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_GCC(D, Triple, UserTriple) {}
std::string ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const;
@@ -434,8 +439,9 @@ public:
class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
virtual void anchor();
public:
- Generic_ELF(const Driver &D, const llvm::Triple& Triple)
- : Generic_GCC(D, Triple) {}
+ Generic_ELF(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : Generic_GCC(D, Triple, UserTriple) {}
virtual bool IsIntegratedAssemblerDefault() const {
// Default integrated assembler to on for x86.
@@ -446,7 +452,8 @@ public:
class LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC {
public:
- AuroraUX(const Driver &D, const llvm::Triple& Triple);
+ AuroraUX(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
@@ -454,7 +461,8 @@ public:
class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
public:
- OpenBSD(const Driver &D, const llvm::Triple& Triple);
+ OpenBSD(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
@@ -462,7 +470,8 @@ public:
class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
public:
- FreeBSD(const Driver &D, const llvm::Triple& Triple);
+ FreeBSD(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
@@ -470,7 +479,8 @@ public:
class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
public:
- NetBSD(const Driver &D, const llvm::Triple& Triple);
+ NetBSD(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
@@ -478,7 +488,8 @@ public:
class LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF {
public:
- Minix(const Driver &D, const llvm::Triple& Triple);
+ Minix(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
@@ -486,7 +497,8 @@ public:
class LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF {
public:
- DragonFly(const Driver &D, const llvm::Triple& Triple);
+ DragonFly(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
@@ -494,7 +506,8 @@ public:
class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
public:
- Linux(const Driver &D, const llvm::Triple& Triple);
+ Linux(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual bool HasNativeLLVMSupport() const;
@@ -520,7 +533,8 @@ private:
/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
class LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain {
public:
- TCEToolChain(const Driver &D, const llvm::Triple& Triple);
+ TCEToolChain(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
~TCEToolChain();
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
@@ -539,7 +553,8 @@ class LLVM_LIBRARY_VISIBILITY Windows : public ToolChain {
mutable llvm::DenseMap<unsigned, Tool*> Tools;
public:
- Windows(const Driver &D, const llvm::Triple& Triple);
+ Windows(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple);
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
const ActionList &Inputs) const;
diff --git a/lib/Driver/WindowsToolChain.cpp b/lib/Driver/WindowsToolChain.cpp
index b951581e4b..076dff929a 100644
--- a/lib/Driver/WindowsToolChain.cpp
+++ b/lib/Driver/WindowsToolChain.cpp
@@ -35,8 +35,9 @@ using namespace clang::driver;
using namespace clang::driver::toolchains;
using namespace clang;
-Windows::Windows(const Driver &D, const llvm::Triple& Triple)
- : ToolChain(D, Triple) {
+Windows::Windows(const Driver &D, const llvm::Triple& Triple,
+ const std::string &UserTriple)
+ : ToolChain(D, Triple, UserTriple) {
}
Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
diff --git a/test/Driver/prefixed-tools.c b/test/Driver/prefixed-tools.c
new file mode 100644
index 0000000000..1fc3d8f6a6
--- /dev/null
+++ b/test/Driver/prefixed-tools.c
@@ -0,0 +1,14 @@
+// RUN: env PATH=%s-helper %clang -no-integrated-as -target x86_64--linux %s -o - > %t.log
+// RUN: env PATH=%s-helper %clang -no-integrated-as -m32 -target x86_64--linux %s -o - >> %t.log
+// RUN: FileCheck -input-file %t.log %s
+
+// CHECK: x86_64--linux-as called
+// CHECK: x86_64--linux-ld called
+// CHECK: x86_64--linux-as called
+// CHECK: x86_64--linux-ld called
+
+int
+main(void)
+{
+ return 0;
+} \ No newline at end of file
diff --git a/test/Driver/prefixed-tools.c-helper/x86_64--linux-as b/test/Driver/prefixed-tools.c-helper/x86_64--linux-as
new file mode 100755
index 0000000000..141e1fab16
--- /dev/null
+++ b/test/Driver/prefixed-tools.c-helper/x86_64--linux-as
@@ -0,0 +1,2 @@
+#!/bin/sh
+echo "x86_64--linux-as called"
diff --git a/test/Driver/prefixed-tools.c-helper/x86_64--linux-ld b/test/Driver/prefixed-tools.c-helper/x86_64--linux-ld
new file mode 100755
index 0000000000..129ba0a4a9
--- /dev/null
+++ b/test/Driver/prefixed-tools.c-helper/x86_64--linux-ld
@@ -0,0 +1,2 @@
+#!/bin/sh
+echo "x86_64--linux-ld called"