[cfe-commits] r143874 - /cfe/trunk/lib/Driver/ToolChains.cpp

Chandler Carruth chandlerc at gmail.com
Sun Nov 6 02:31:02 PST 2011


Author: chandlerc
Date: Sun Nov  6 04:31:01 2011
New Revision: 143874

URL: http://llvm.org/viewvc/llvm-project?rev=143874&view=rev
Log:
Throw the switch and move all Linux header search over to the GCC
detection system that is providing the library paths and crt object
files.

This, modulo any bugs that need to be shaken out, resolves numerous bugs
with how we handle header paths. Here are a few that I know of:
- We no longer need to enumerate all GCC versions searched.
- OpenSUSE searched GCC versions in the wrong order.
- There were typos when selecting various patterns, etc.
- We aren't stating quite some many directories now.
- SysRoot didn't always work in a reasonable way.

I'm working on tests for this, but the tests are making me and Lit sad.
The real testing for this type of driver change is to try it out on
various distributions. I'll hit the common ones right away, and start
more thorough testing tomorrow after some sleep.

Modified:
    cfe/trunk/lib/Driver/ToolChains.cpp

Modified: cfe/trunk/lib/Driver/ToolChains.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=143874&r1=143873&r2=143874&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/ToolChains.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains.cpp Sun Nov  6 04:31:01 2011
@@ -2015,23 +2015,15 @@
   addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
 }
 
-static void AddLibStdCXXIncludePaths(StringRef Base, StringRef ArchDir,
-                                     StringRef Dir32, StringRef Dir64,
-                                     const llvm::Triple &Triple,
+static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
                                      const ArgList &DriverArgs,
                                      ArgStringList &CC1Args) {
+  if (!llvm::sys::fs::exists(Base))
+    return false;
   addSystemInclude(DriverArgs, CC1Args, Base);
-
-  // Add the multilib dirs
-  llvm::Triple::ArchType Arch = Triple.getArch();
-  bool Is64bit = Arch == llvm::Triple::ppc64 || Arch == llvm::Triple::x86_64;
-  if (Is64bit)
-    addSystemInclude(DriverArgs, CC1Args, Base + "/" + ArchDir + "/" + Dir64);
-  else
-    addSystemInclude(DriverArgs, CC1Args, Base + "/" + ArchDir + "/" + Dir32);
-
-  // Add the backward dir
+  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
   addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
+  return true;
 }
 
 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
@@ -2040,331 +2032,53 @@
       DriverArgs.hasArg(options::OPT_nostdincxx))
     return;
 
-  const llvm::Triple &Triple = getTriple();
+  const llvm::Triple &TargetTriple = getTriple();
+  const llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
+  bool IsTarget64Bit = (TargetArch == llvm::Triple::x86_64 ||
+                        TargetArch == llvm::Triple::ppc64);
+
   StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
-  if (CxxIncludeRoot != "") {
+  if (!CxxIncludeRoot.empty()) {
     StringRef CxxIncludeArch(CXX_INCLUDE_ARCH);
-    if (CxxIncludeArch == "")
-      AddLibStdCXXIncludePaths(CxxIncludeRoot, Triple.str().c_str(),
-                               CXX_INCLUDE_32BIT_DIR, CXX_INCLUDE_64BIT_DIR,
-                               Triple, DriverArgs, CC1Args);
-    else
-      AddLibStdCXXIncludePaths(CxxIncludeRoot, CXX_INCLUDE_ARCH,
-                               CXX_INCLUDE_32BIT_DIR, CXX_INCLUDE_64BIT_DIR,
-                               Triple, DriverArgs, CC1Args);
+    if (CxxIncludeArch.empty())
+      CxxIncludeArch = TargetTriple.str();
+
+    addLibStdCXXIncludePaths(
+      CxxIncludeRoot,
+      CxxIncludeArch + (IsTarget64Bit ? CXX_INCLUDE_64BIT_DIR
+                                      : CXX_INCLUDE_32BIT_DIR),
+      DriverArgs, CC1Args);
     return;
   }
-  // FIXME: temporary hack: hard-coded paths.
 
-  //===------------------------------------------------------------------===//
-  // Debian based distros.
-  // Note: these distros symlink /usr/include/c++/X.Y.Z -> X.Y
-  //===------------------------------------------------------------------===//
-
-  // Ubuntu 11.11 "Oneiric Ocelot" -- gcc-4.6.0
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6",
-    "x86_64-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6",
-    "i686-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6",
-    "i486-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6",
-    "arm-linux-gnueabi", "", "", Triple, DriverArgs, CC1Args);
-
-  // Ubuntu 11.04 "Natty Narwhal" -- gcc-4.5.2
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5",
-    "x86_64-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5",
-    "i686-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5",
-    "i486-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5",
-    "arm-linux-gnueabi", "", "", Triple, DriverArgs, CC1Args);
-
-  // Ubuntu 10.10 "Maverick Meerkat" -- gcc-4.4.5
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4",
-    "i686-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  // The rest of 10.10 is the same as previous versions.
-
-  // Ubuntu 10.04 LTS "Lucid Lynx" -- gcc-4.4.3
-  // Ubuntu 9.10 "Karmic Koala"    -- gcc-4.4.1
-  // Debian 6.0 "squeeze"          -- gcc-4.4.2
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4",
-    "x86_64-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4",
-    "i486-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4",
-    "arm-linux-gnueabi", "", "", Triple, DriverArgs, CC1Args);
-  // Ubuntu 9.04 "Jaunty Jackalope" -- gcc-4.3.3
-  // Ubuntu 8.10 "Intrepid Ibex"    -- gcc-4.3.2
-  // Debian 5.0 "lenny"             -- gcc-4.3.2
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3",
-    "x86_64-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3",
-    "i486-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3",
-    "arm-linux-gnueabi", "", "", Triple, DriverArgs, CC1Args);
-  // Ubuntu 8.04.4 LTS "Hardy Heron"     -- gcc-4.2.4
-  // Ubuntu 8.04.[0-3] LTS "Hardy Heron" -- gcc-4.2.3
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.2",
-    "x86_64-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.2",
-    "i486-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-  // Ubuntu 7.10 "Gutsy Gibbon" -- gcc-4.1.3
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.1",
-    "x86_64-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.1",
-    "i486-linux-gnu", "", "64", Triple, DriverArgs, CC1Args);
-
-  //===------------------------------------------------------------------===//
-  // Redhat based distros.
-  //===------------------------------------------------------------------===//
-  // Fedora 15 (GCC 4.6.1)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.1",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.1",
-    "i686-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-  // Fedora 15 (GCC 4.6.0)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.0",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.0",
-    "i686-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-  // Fedora 14
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5.1",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5.1",
-    "i686-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-  // RHEL5(gcc44)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.4",
-    "x86_64-redhat-linux6E", "32", "", Triple, DriverArgs, CC1Args);
-  // Fedora 13
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.4",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.4",
-    "i686-redhat-linux","", "", Triple, DriverArgs, CC1Args);
-  // Fedora 12
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.3",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.3",
-    "i686-redhat-linux","", "", Triple, DriverArgs, CC1Args);
-  // Fedora 12 (pre-FEB-2010)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.2",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.2",
-    "i686-redhat-linux","", "", Triple, DriverArgs, CC1Args);
-  // Fedora 11
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.1",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.1",
-    "i586-redhat-linux","", "", Triple, DriverArgs, CC1Args);
-  // Fedora 10
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3.2",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3.2",
-    "i386-redhat-linux","", "", Triple, DriverArgs, CC1Args);
-  // Fedora 9
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3.0",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3.0",
-    "i386-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-  // Fedora 8
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.1.2",
-    "x86_64-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.1.2",
-    "i386-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-
-  // RHEL 5
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.1.1",
-    "x86_64-redhat-linux", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.1.1",
-    "i386-redhat-linux", "", "", Triple, DriverArgs, CC1Args);
-
-
-  //===------------------------------------------------------------------===//
-
-  // Exherbo (2010-01-25)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.3",
-    "x86_64-pc-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4.3",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-
-  // openSUSE 11.1 32 bit
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3",
-    "i586-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-  // openSUSE 11.1 64 bit
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3",
-    "x86_64-suse-linux", "32", "", Triple, DriverArgs, CC1Args);
-  // openSUSE 11.2
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4",
-    "i586-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.4",
-    "x86_64-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-
-  // openSUSE 11.4
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5",
-    "i586-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5",
-    "x86_64-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-
-  // openSUSE 12.1
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6",
-    "i586-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6",
-    "x86_64-suse-linux", "", "", Triple, DriverArgs, CC1Args);
-  // Arch Linux 2008-06-24
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3.1",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.3.1",
-    "x86_64-unknown-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-
-  // Arch Linux gcc 4.6
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.1",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.1",
-    "x86_64-unknown-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.0",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.6.0",
-    "x86_64-unknown-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-
-  // Slackware gcc 4.5.2 (13.37)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5.2",
-    "i486-slackware-linux", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5.2",
-    "x86_64-slackware-linux", "", "", Triple, DriverArgs, CC1Args);
-  // Slackware gcc 4.5.3 (-current)
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5.3",
-    "i486-slackware-linux", "", "", Triple, DriverArgs, CC1Args);
-  AddLibStdCXXIncludePaths(
-    "/usr/include/c++/4.5.3",
-    "x86_64-slackware-linux", "", "", Triple, DriverArgs, CC1Args);
-
-  // Gentoo x86 gcc 4.5.3
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.5.3/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 gcc 4.5.2
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.5.2/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 gcc 4.4.5
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.4.5/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 gcc 4.4.4
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.4.4/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 2010.0 stable
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 2009.1 stable
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 2009.0 stable
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo x86 2008.0 stable
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4",
-    "i686-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-
-  // Gentoo amd64 gcc 4.5.3
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4",
-    "x86_64-pc-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 gcc 4.5.2
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4",
-    "x86_64-pc-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 gcc 4.4.5
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/include/g++-v4",
-    "x86_64-pc-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 gcc 4.4.4
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4",
-    "x86_64-pc-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 gcc 4.4.3
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/include/g++-v4",
-    "x86_64-pc-linux-gnu", "32", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 gcc 4.3.4
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4",
-    "x86_64-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 gcc 4.3.2
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/include/g++-v4",
-    "x86_64-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
-  // Gentoo amd64 stable
-  AddLibStdCXXIncludePaths(
-    "/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4",
-    "x86_64-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
+  // Check if the target architecture specific dirs need a suffix. Note that we
+  // only support the suffix-based bi-arch-like header scheme for host/target
+  // mismatches of just bit width.
+  llvm::Triple::ArchType HostArch =
+    llvm::Triple(getDriver().DefaultHostTriple).getArch();
+  StringRef Suffix;
+  if ((HostArch == llvm::Triple::x86 && TargetArch == llvm::Triple::x86_64) ||
+      (HostArch == llvm::Triple::ppc && TargetArch == llvm::Triple::ppc64))
+    Suffix = "/64";
+  if ((HostArch == llvm::Triple::x86_64 && TargetArch == llvm::Triple::x86) ||
+      (HostArch == llvm::Triple::ppc64 && TargetArch == llvm::Triple::ppc))
+    Suffix = "/32";
+
+  // By default, look for the C++ headers in an include directory adjacent to
+  // the lib directory of the GCC installation. Note that this is expect to be
+  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
+  StringRef LibDir = GCCInstallation.getParentLibPath();
+  StringRef InstallDir = GCCInstallation.getInstallPath();
+  StringRef Version = GCCInstallation.getVersion();
+  if (!addLibStdCXXIncludePaths(LibDir + "/../include/c++/" + Version,
+                                GCCInstallation.getTriple() + Suffix,
+                                DriverArgs, CC1Args)) {
+    // Gentoo is weird and places its headers inside the GCC install, so if the
+    // first attempt to find the headers fails, try this pattern.
+    addLibStdCXXIncludePaths(InstallDir + "/include/g++-v4",
+                             GCCInstallation.getTriple() + Suffix,
+                             DriverArgs, CC1Args);
+  }
 }
 
 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.





More information about the cfe-commits mailing list