From: Rafael Espindola Date: Sun, 19 Feb 2012 01:38:32 +0000 (+0000) Subject: Implement a -gcc-toolchain command line option that does the same as X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e65959196b45d8afc89e9102c4fc4ec0d642066;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150898 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 6d7417d16c..e3bff60e8c 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -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; def time : Flag<"-time">, diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 4209c9598e..e105e99246 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -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; } } diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 2a5bdbc553..e30828d1b0 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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 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()); diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 605fefb0c8..98c226b0e1 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -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 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; diff --git a/test/Driver/gcc-toolchain.cpp b/test/Driver/gcc-toolchain.cpp new file mode 100644 index 0000000000..ab651ac8eb --- /dev/null +++ b/test/Driver/gcc-toolchain.cpp @@ -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"