Implement a -gcc-toolchain command line option that does the same as
configure's --with-gcc-toolchain. The configure option is now just a default value for the command line one. llvm-svn: 150898
This commit is contained in:
parent
4f9484722c
commit
1af7c219c7
|
@ -756,6 +756,8 @@ def sub__umbrella : JoinedOrSeparate<"-sub_umbrella">;
|
|||
def s : Flag<"-s">;
|
||||
def target : Separate<"-target">, Flags<[DriverOption]>,
|
||||
HelpText<"Generate code for the given target">;
|
||||
def gcc_toolchain : Separate<"-gcc-toolchain">, Flags<[DriverOption]>,
|
||||
HelpText<"Use the gcc toolchain at the given directory">;
|
||||
// We should deprecate the use of -ccc-host-triple, and then remove.
|
||||
def ccc_host_triple : Separate<"-ccc-host-triple">, Alias<target>;
|
||||
def time : Flag<"-time">,
|
||||
|
|
|
@ -1629,7 +1629,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
|
|||
if (!TC) {
|
||||
switch (Target.getOS()) {
|
||||
case llvm::Triple::AuroraUX:
|
||||
TC = new toolchains::AuroraUX(*this, Target);
|
||||
TC = new toolchains::AuroraUX(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::Darwin:
|
||||
case llvm::Triple::MacOSX:
|
||||
|
@ -1640,31 +1640,31 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
|
|||
Target.getArch() == llvm::Triple::thumb)
|
||||
TC = new toolchains::DarwinClang(*this, Target);
|
||||
else
|
||||
TC = new toolchains::Darwin_Generic_GCC(*this, Target);
|
||||
TC = new toolchains::Darwin_Generic_GCC(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::DragonFly:
|
||||
TC = new toolchains::DragonFly(*this, Target);
|
||||
TC = new toolchains::DragonFly(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::OpenBSD:
|
||||
TC = new toolchains::OpenBSD(*this, Target);
|
||||
TC = new toolchains::OpenBSD(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::NetBSD:
|
||||
TC = new toolchains::NetBSD(*this, Target);
|
||||
TC = new toolchains::NetBSD(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::FreeBSD:
|
||||
TC = new toolchains::FreeBSD(*this, Target);
|
||||
TC = new toolchains::FreeBSD(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::Minix:
|
||||
TC = new toolchains::Minix(*this, Target);
|
||||
TC = new toolchains::Minix(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::Linux:
|
||||
if (Target.getArch() == llvm::Triple::hexagon)
|
||||
TC = new toolchains::Hexagon_TC(*this, Target);
|
||||
else
|
||||
TC = new toolchains::Linux(*this, Target);
|
||||
TC = new toolchains::Linux(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::Solaris:
|
||||
TC = new toolchains::Solaris(*this, Target);
|
||||
TC = new toolchains::Solaris(*this, Target, Args);
|
||||
break;
|
||||
case llvm::Triple::Win32:
|
||||
TC = new toolchains::Windows(*this, Target);
|
||||
|
@ -1678,7 +1678,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
|
|||
break;
|
||||
}
|
||||
|
||||
TC = new toolchains::Generic_GCC(*this, Target);
|
||||
TC = new toolchains::Generic_GCC(*this, Target, Args);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1087,6 +1087,13 @@ bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
|
|||
return false;
|
||||
}
|
||||
|
||||
static StringRef getGCCToolchainDir(const ArgList &Args) {
|
||||
const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
|
||||
if (A)
|
||||
return A->getValue(Args);
|
||||
return GCC_INSTALL_PREFIX;
|
||||
}
|
||||
|
||||
/// \brief Construct a GCCInstallationDetector from the driver.
|
||||
///
|
||||
/// This performs all of the autodetection and sets up the various paths.
|
||||
|
@ -1098,7 +1105,8 @@ bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
|
|||
/// triple.
|
||||
Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
|
||||
const Driver &D,
|
||||
const llvm::Triple &TargetTriple)
|
||||
const llvm::Triple &TargetTriple,
|
||||
const ArgList &Args)
|
||||
: IsValid(false) {
|
||||
llvm::Triple MultiarchTriple
|
||||
= TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
|
||||
|
@ -1118,12 +1126,12 @@ Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
|
|||
SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
|
||||
D.PrefixDirs.end());
|
||||
|
||||
SmallString<128> CxxInstallRoot(GCC_INSTALL_PREFIX);
|
||||
if (CxxInstallRoot != "") {
|
||||
if (CxxInstallRoot.back() == '/')
|
||||
llvm::sys::path::remove_filename(CxxInstallRoot); // remove the /
|
||||
StringRef GCCToolchainDir = getGCCToolchainDir(Args);
|
||||
if (GCCToolchainDir != "") {
|
||||
if (GCCToolchainDir.back() == '/')
|
||||
GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
|
||||
|
||||
Prefixes.push_back(CxxInstallRoot.str());
|
||||
Prefixes.push_back(GCCToolchainDir);
|
||||
} else {
|
||||
Prefixes.push_back(D.SysRoot);
|
||||
Prefixes.push_back(D.SysRoot + "/usr");
|
||||
|
@ -1356,8 +1364,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 ArgList &Args)
|
||||
: ToolChain(D, Triple), GCCInstallation(getDriver(), Triple, Args) {
|
||||
getProgramPaths().push_back(getDriver().getInstalledDir());
|
||||
if (getDriver().getInstalledDir() != getDriver().Dir)
|
||||
getProgramPaths().push_back(getDriver().Dir);
|
||||
|
@ -1550,8 +1559,8 @@ 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 ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
getFilePaths().push_back(getDriver().Dir + "/../lib");
|
||||
getFilePaths().push_back("/usr/lib");
|
||||
}
|
||||
|
@ -1590,8 +1599,8 @@ 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 ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
|
||||
// When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
|
||||
// back to '/usr/lib' if it doesn't exist.
|
||||
|
@ -1636,8 +1645,8 @@ 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 ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
|
||||
if (getDriver().UseStdLib) {
|
||||
// When targeting a 32-bit platform, try the special directory used on
|
||||
|
@ -1686,8 +1695,8 @@ 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 ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
getFilePaths().push_back(getDriver().Dir + "/../lib");
|
||||
getFilePaths().push_back("/usr/lib");
|
||||
}
|
||||
|
@ -1717,8 +1726,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 ArgList &Args)
|
||||
: Generic_GCC(D, Triple, Args) {
|
||||
|
||||
getProgramPaths().push_back(getDriver().getInstalledDir());
|
||||
if (getDriver().getInstalledDir() != getDriver().Dir)
|
||||
|
@ -1757,8 +1767,9 @@ Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
|
|||
|
||||
/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
|
||||
|
||||
Solaris::Solaris(const Driver &D, const llvm::Triple& Triple)
|
||||
: Generic_GCC(D, Triple) {
|
||||
Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
|
||||
const ArgList &Args)
|
||||
: Generic_GCC(D, Triple, Args) {
|
||||
|
||||
getProgramPaths().push_back(getDriver().getInstalledDir());
|
||||
if (getDriver().getInstalledDir() != getDriver().Dir)
|
||||
|
@ -1958,8 +1969,8 @@ 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 ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
llvm::Triple::ArchType Arch = Triple.getArch();
|
||||
const std::string &SysRoot = getDriver().SysRoot;
|
||||
|
||||
|
@ -2244,8 +2255,8 @@ 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 ArgList &Args)
|
||||
: Generic_ELF(D, Triple, Args) {
|
||||
|
||||
// Path mangling to find libexec
|
||||
getProgramPaths().push_back(getDriver().getInstalledDir());
|
||||
|
|
|
@ -79,7 +79,8 @@ protected:
|
|||
GCCVersion Version;
|
||||
|
||||
public:
|
||||
GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple);
|
||||
GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple,
|
||||
const ArgList &Args);
|
||||
|
||||
/// \brief Check whether we detected a valid GCC install.
|
||||
bool isValid() const { return IsValid; }
|
||||
|
@ -119,7 +120,7 @@ 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 ArgList &Args);
|
||||
~Generic_GCC();
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
|
@ -419,8 +420,8 @@ 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 ArgList &Args)
|
||||
: Generic_GCC(D, Triple, Args) {}
|
||||
|
||||
std::string ComputeEffectiveClangTriple(const ArgList &Args,
|
||||
types::ID InputType) const;
|
||||
|
@ -431,8 +432,8 @@ 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 ArgList &Args)
|
||||
: Generic_GCC(D, Triple, Args) {}
|
||||
|
||||
virtual bool IsIntegratedAssemblerDefault() const {
|
||||
// Default integrated assembler to on for x86.
|
||||
|
@ -443,7 +444,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -451,7 +452,7 @@ public:
|
|||
|
||||
class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC {
|
||||
public:
|
||||
Solaris(const Driver &D, const llvm::Triple& Triple);
|
||||
Solaris(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -462,7 +463,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -470,7 +471,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -478,7 +479,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -486,7 +487,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -494,7 +495,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
|
||||
const ActionList &Inputs) const;
|
||||
|
@ -502,7 +503,7 @@ 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 ArgList &Args);
|
||||
|
||||
virtual bool HasNativeLLVMSupport() const;
|
||||
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
// Test that gcc-toolchain option is working correctly
|
||||
//
|
||||
// RUN: %clangxx -no-canonical-prefixes %s -### -o %t 2>&1 \
|
||||
// RUN: -target i386-unknown-linux \
|
||||
// RUN: -gcc-toolchain %S/Inputs/ubuntu_11.04_multiarch_tree/usr \
|
||||
// RUN: | FileCheck %s
|
||||
|
||||
// CHECK: "-internal-isystem"
|
||||
// CHECK: "[[TOOLCHAIN:.*]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5"
|
||||
// CHECK: "-internal-isystem"
|
||||
// CHECK: "[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5/i686-linux-gnu"
|
||||
// CHECK: "-internal-isystem"
|
||||
// CHECK: "[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5/backward"
|
||||
// CHECK: "-internal-isystem"
|
||||
// CHECK: "/usr/local/include"
|
||||
// CHECK: "-internal-isystem"
|
||||
// CHECK: lib/clang/3.1/include"
|
||||
// CHECK: "-internal-externc-isystem"
|
||||
// CHECK: "/include"
|
||||
// CHECK: "-internal-externc-isystem"
|
||||
// CHECK: "/usr/include"
|
||||
// CHECK: "/{{.*}}/ld"
|
||||
// CHECK: "[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o"
|
||||
// CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5"
|
||||
// CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../.."
|
||||
// CHECK: "-L/lib"
|
||||
// CHECK: "-L/usr/lib"
|
Loading…
Reference in New Issue