[PATCH] Rename clang::driver::toolchains::Linux to clang::driver::toolchains::GNUOrAndroidEnvironment and handle llvm::Triple::Hurd.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Mon Mar 25 11:06:57 PDT 2013


needs tests.

On 25 March 2013 09:15, Thomas Schwinge <thomas at codesourcery.com> wrote:
> ---
>  lib/Basic/Targets.cpp     |    2 +-
>  lib/Driver/Driver.cpp     |    5 +++-
>  lib/Driver/ToolChains.cpp |   60 +++++++++++++++++++++++++++------------------
>  lib/Driver/ToolChains.h   |    9 ++++---
>  lib/Driver/Tools.cpp      |    4 +--
>  5 files changed, 49 insertions(+), 31 deletions(-)
>
> diff --git lib/Basic/Targets.cpp lib/Basic/Targets.cpp
> index ad63fd7..0f6256c 100644
> --- lib/Basic/Targets.cpp
> +++ lib/Basic/Targets.cpp
> @@ -4996,7 +4996,7 @@ static TargetInfo *AllocateTarget(const std::string &T) {
>    case llvm::Triple::aarch64:
>      switch (os) {
>      case llvm::Triple::Linux:
> -      return new LinuxTargetInfo<AArch64TargetInfo>(T);
> +      return new GNUOrAndroidEnvironmentTargetInfo<AArch64TargetInfo>(T);
>      default:
>        return new AArch64TargetInfo(T);
>      }
> diff --git lib/Driver/Driver.cpp lib/Driver/Driver.cpp
> index 689ecbc..b23b873 100644
> --- lib/Driver/Driver.cpp
> +++ lib/Driver/Driver.cpp
> @@ -1677,6 +1677,8 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
>
>    ToolChain *&TC = ToolChains[Target.str()];
>    if (!TC) {
> +    // FIXME: Perhaps this should first decide and specialize based upon the
> +    // Environment, then Operating System, then Vendor, then Architecture.
>      switch (Target.getOS()) {
>      case llvm::Triple::AuroraUX:
>        TC = new toolchains::AuroraUX(*this, Target, Args);
> @@ -1711,10 +1713,11 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
>        TC = new toolchains::Minix(*this, Target, Args);
>        break;
>      case llvm::Triple::Linux:
> +    case llvm::Triple::Hurd:
>        if (Target.getArch() == llvm::Triple::hexagon)
>          TC = new toolchains::Hexagon_TC(*this, Target, Args);
>        else
> -        TC = new toolchains::Linux(*this, Target, Args);
> +        TC = new toolchains::GNUOrAndroidEnvironment(*this, Target, Args);
>        break;
>      case llvm::Triple::Solaris:
>        TC = new toolchains::Solaris(*this, Target, Args);
> diff --git lib/Driver/ToolChains.cpp lib/Driver/ToolChains.cpp
> index bcfe51e..b355709 100644
> --- lib/Driver/ToolChains.cpp
> +++ lib/Driver/ToolChains.cpp
> @@ -912,7 +912,7 @@ Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
>  ///
>  /// This is the primary means of forming GCCVersion objects.
>  /*static*/
> -Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
> +Generic_GCC::GCCVersion GNUOrAndroidEnvironment::GCCVersion::Parse(StringRef VersionText) {
>    const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
>    std::pair<StringRef, StringRef> First = VersionText.split('.');
>    std::pair<StringRef, StringRef> Second = First.second.split('.');
> @@ -1108,7 +1108,11 @@ Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
>      "i386-redhat-linux",
>      "i586-suse-linux",
>      "i486-slackware-linux",
> -    "i686-montavista-linux"
> +    "i686-montavista-linux",
> +    "i686-gnu", "i686-pc-gnu", "i686-unknown-gnu",
> +    "i586-gnu", "i586-pc-gnu", "i586-unknown-gnu",
> +    "i486-gnu", "i486-pc-gnu", "i486-unknown-gnu",
> +    "i386-gnu", "i386-pc-gnu", "i386-unknown-gnu",
>    };
>
>    static const char *const MIPSLibDirs[] = { "/lib" };
> @@ -1472,7 +1476,7 @@ static void GetHexagonLibraryPaths(
>
>  Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
>                         const ArgList &Args)
> -  : Linux(D, Triple, Args) {
> +  : GNUOrAndroidEnvironment(D, Triple, Args) {
>    const std::string InstalledDir(getDriver().getInstalledDir());
>    const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
>
> @@ -1496,9 +1500,10 @@ Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
>
>    ToolChain::path_list *LibPaths= &getFilePaths();
>
> -  // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
> -  // 'elf' OS type, so the Linux paths are not appropriate. When we actually
> -  // support 'linux' we'll need to fix this up
> +  // Remove paths added by GNUOrAndroidEnvironment toolchain.  Currently
> +  // Hexagon_TC really targets 'elf' OS type, so the GNUOrAndroidEnvironment
> +  // paths are not appropriate.  When we actually add such support, we'll need
> +  // to fix this up.
>    LibPaths->clear();
>
>    GetHexagonLibraryPaths(
> @@ -2003,6 +2008,8 @@ static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
>    case llvm::Triple::x86:
>      if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
>        return "i386-linux-gnu";
> +    else if (llvm::sys::fs::exists(SysRoot + "/lib/i386-gnu"))
> +      return "i386-gnu";
>      return TargetTriple.str();
>    case llvm::Triple::x86_64:
>      if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
> @@ -2076,7 +2083,9 @@ static StringRef getMultilibDir(const llvm::Triple &Triple,
>    return Triple.isArch32Bit() ? "lib" : "lib64";
>  }
>
> -Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
> +GNUOrAndroidEnvironment::GNUOrAndroidEnvironment(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;
> @@ -2199,20 +2208,20 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
>    addPathIfExists(SysRoot + "/usr/lib", Paths);
>  }
>
> -bool Linux::HasNativeLLVMSupport() const {
> +bool GNUOrAndroidEnvironment::HasNativeLLVMSupport() const {
>    return true;
>  }
>
> -Tool *Linux::buildLinker() const {
> +Tool *GNUOrAndroidEnvironment::buildLinker() const {
>    return new tools::gnutools::Link(*this);
>  }
>
> -Tool *Linux::buildAssembler() const {
> +Tool *GNUOrAndroidEnvironment::buildAssembler() const {
>    return new tools::gnutools::Assemble(*this);
>  }
>
> -void Linux::addClangTargetOptions(const ArgList &DriverArgs,
> -                                  ArgStringList &CC1Args) const {
> +void GNUOrAndroidEnvironment::addClangTargetOptions(const ArgList &DriverArgs,
> +                                                    ArgStringList &CC1Args) const {
>    const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
>    bool UseInitArrayDefault
>      = V >= Generic_GCC::GCCVersion::Parse("4.7.0") ||
> @@ -2224,8 +2233,8 @@ void Linux::addClangTargetOptions(const ArgList &DriverArgs,
>      CC1Args.push_back("-fuse-init-array");
>  }
>
> -void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
> -                                      ArgStringList &CC1Args) const {
> +void GNUOrAndroidEnvironment::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
> +                                                        ArgStringList &CC1Args) const {
>    const Driver &D = getDriver();
>
>    if (DriverArgs.hasArg(options::OPT_nostdinc))
> @@ -2271,6 +2280,7 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
>    };
>    const StringRef X86MultiarchIncludeDirs[] = {
>      "/usr/include/i386-linux-gnu",
> +    "/usr/include/i386-gnu",
>
>      // FIXME: These are older forms of multiarch. It's not clear that they're
>      // in use in any released version of Debian, so we should consider
> @@ -2342,9 +2352,10 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
>  }
>
>  /// \brief Helper to add the three variant paths for a libstdc++ installation.
> -/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
> -                                                const ArgList &DriverArgs,
> -                                                ArgStringList &CC1Args) {
> +/*static*/ bool GNUOrAndroidEnvironment::addLibStdCXXIncludePaths(Twine Base,
> +                                                                  Twine TargetArchDir,
> +                                                                  const ArgList &DriverArgs,
> +                                                                  ArgStringList &CC1Args) {
>    if (!llvm::sys::fs::exists(Base))
>      return false;
>    addSystemInclude(DriverArgs, CC1Args, Base);
> @@ -2355,11 +2366,12 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
>
>  /// \brief Helper to add an extra variant path for an (Ubuntu) multilib
>  /// libstdc++ installation.
> -/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
> -                                                Twine TargetArchDir,
> -                                                Twine MultiLibSuffix,
> -                                                const ArgList &DriverArgs,
> -                                                ArgStringList &CC1Args) {
> +/*static*/ bool GNUOrAndroidEnvironment::addLibStdCXXIncludePaths(Twine Base,
> +                                                                  Twine Suffix,
> +                                                                  Twine TargetArchDir,
> +                                                                  Twine MultiLibSuffix,
> +                                                                  const ArgList &DriverArgs,
> +                                                                  ArgStringList &CC1Args) {
>    if (!addLibStdCXXIncludePaths(Base+Suffix, TargetArchDir + MultiLibSuffix,
>                                  DriverArgs, CC1Args))
>      return false;
> @@ -2369,8 +2381,8 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
>    return true;
>  }
>
> -void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
> -                                         ArgStringList &CC1Args) const {
> +void GNUOrAndroidEnvironment::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
> +                                                           ArgStringList &CC1Args) const {
>    if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
>        DriverArgs.hasArg(options::OPT_nostdincxx))
>      return;
> diff --git lib/Driver/ToolChains.h lib/Driver/ToolChains.h
> index 3421c53..b232ef6 100644
> --- lib/Driver/ToolChains.h
> +++ lib/Driver/ToolChains.h
> @@ -497,9 +497,12 @@ protected:
>    virtual Tool *buildLinker() const;
>  };
>
> -class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
> +// FIXME: Perhaps this mixes up too many different things: GNU vs. Android
> +// Environment; Linux vs. Hurd Operating System.
> +class LLVM_LIBRARY_VISIBILITY GNUOrAndroidEnvironment : public Generic_ELF {
>  public:
> -  Linux(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
> +  GNUOrAndroidEnvironment(const Driver &D, const llvm::Triple& Triple,
> +                          const ArgList &Args);
>
>    virtual bool HasNativeLLVMSupport() const;
>
> @@ -528,7 +531,7 @@ private:
>                                         ArgStringList &CC1Args);
>  };
>
> -class LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux {
> +class LLVM_LIBRARY_VISIBILITY Hexagon_TC : public GNUOrAndroidEnvironment {
>  protected:
>    GCCVersion GCCLibAndIncVersion;
>    virtual Tool *buildAssembler() const;
> diff --git lib/Driver/Tools.cpp lib/Driver/Tools.cpp
> index 37e6abb..b80765f 100644
> --- lib/Driver/Tools.cpp
> +++ lib/Driver/Tools.cpp
> @@ -5706,8 +5706,8 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
>                                    const InputInfoList &Inputs,
>                                    const ArgList &Args,
>                                    const char *LinkingOutput) const {
> -  const toolchains::Linux& ToolChain =
> -    static_cast<const toolchains::Linux&>(getToolChain());
> +  const toolchains::GNUOrAndroidEnvironment& ToolChain =
> +    static_cast<const toolchains::GNUOrAndroidEnvironment&>(getToolChain());
>    const Driver &D = ToolChain.getDriver();
>    const bool isAndroid =
>      ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
> --
> 1.7.9.5
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list