]> granicus.if.org Git - clang/commitdiff
Move the Linux header searching from the Frontend to the Driver. This is
authorChandler Carruth <chandlerc@gmail.com>
Sat, 5 Nov 2011 20:17:13 +0000 (20:17 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sat, 5 Nov 2011 20:17:13 +0000 (20:17 +0000)
the first (and diff-noisiest) step to making Linux header searching
tremendously more principled and less brittle. Note that this step
should have essentially no functional impact. We still search the exact
same set of paths in the exact same order. The only change here is where
the code implementing such a search lives.

This has one obvious negative impact -- we now pass a ludicrous number
of flags to the CC1 layer. That should go away as I re-base this logic
on the logic to detect a GCC installation. I want to do this in two
phases so the bots can tell me if this step alone breaks something, and
so that the diffs of the refactoring make more sense.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143822 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h
lib/Driver/Tools.cpp
lib/Frontend/InitHeaderSearch.cpp

index 3a404e52452fb8e1e3deddaf9ddb40aac2b8ce08..bfdd7196d0b37aa3898a9c377acfbd139312feb0 100644 (file)
@@ -53,6 +53,38 @@ using namespace clang::driver;
 using namespace clang::driver::toolchains;
 using namespace clang;
 
+/// \brief Utility function to add a system include directory to CC1 arguments.
+static void addSystemInclude(const ArgList &DriverArgs, ArgStringList &CC1Args,
+                             const Twine &Path) {
+  CC1Args.push_back("-internal-isystem");
+  CC1Args.push_back(DriverArgs.MakeArgString(Path));
+}
+
+/// \brief Utility function to add a system include directory with extern "C"
+/// semantics to CC1 arguments.
+///
+/// Note that this should be used rarely, and only for directories that
+/// historically and for legacy reasons are treated as having implicit extern
+/// "C" semantics. These semantics are *ignored* by and large today, but its
+/// important to preserve the preprocessor changes resulting from the
+/// classification.
+static void addExternCSystemInclude(const ArgList &DriverArgs,
+                                    ArgStringList &CC1Args, const Twine &Path) {
+  CC1Args.push_back("-internal-externc-isystem");
+  CC1Args.push_back(DriverArgs.MakeArgString(Path));
+}
+
+/// \brief Utility function to add a list of system include directories to CC1.
+static void addSystemIncludes(const ArgList &DriverArgs,
+                              ArgStringList &CC1Args,
+                              ArrayRef<StringRef> Paths) {
+  for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end();
+       I != E; ++I) {
+    CC1Args.push_back("-internal-isystem");
+    CC1Args.push_back(DriverArgs.MakeArgString(*I));
+  }
+}
+
 /// Darwin - Darwin tool chain for i386 and x86_64.
 
 Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
@@ -1922,6 +1954,430 @@ Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
   return *T;
 }
 
+void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
+                                      ArgStringList &CC1Args) const {
+  const Driver &D = getDriver();
+
+  if (DriverArgs.hasArg(options::OPT_nostdinc))
+    return;
+
+  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
+    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
+
+  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
+    // Ignore the sysroot, we *always* look for clang headers relative to
+    // supplied path.
+    llvm::sys::Path P(D.ResourceDir);
+    P.appendComponent("include");
+    CC1Args.push_back("-internal-nosysroot-isystem");
+    CC1Args.push_back(DriverArgs.MakeArgString(P.str()));
+  }
+
+  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
+    return;
+
+  // Check for configure-time C include directories.
+  StringRef CIncludeDirs(C_INCLUDE_DIRS);
+  if (CIncludeDirs != "") {
+    SmallVector<StringRef, 5> dirs;
+    CIncludeDirs.split(dirs, ":");
+    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
+         I != E; ++I) {
+      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
+      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
+    }
+    return;
+  }
+
+  // Lacking those, try to detect the correct set of system includes for the
+  // target triple.
+
+  // Generic Debian multiarch support:
+  if (getTriple().getArch() == llvm::Triple::x86_64) {
+    addExternCSystemInclude(DriverArgs, CC1Args,
+                            "/usr/include/x86_64-linux-gnu");
+    addExternCSystemInclude(DriverArgs, CC1Args,
+                            "/usr/include/i686-linux-gnu/64");
+    addExternCSystemInclude(DriverArgs, CC1Args,
+                            "/usr/include/i486-linux-gnu/64");
+  } else if (getTriple().getArch() == llvm::Triple::x86) {
+    addExternCSystemInclude(DriverArgs, CC1Args,
+                            "/usr/include/x86_64-linux-gnu/32");
+    addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include/i686-linux-gnu");
+    addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include/i486-linux-gnu");
+    addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include/i386-linux-gnu");
+  } else if (getTriple().getArch() == llvm::Triple::arm) {
+    addExternCSystemInclude(DriverArgs, CC1Args,
+                            "/usr/include/arm-linux-gnueabi");
+  }
+
+  if (getTriple().getOS() == llvm::Triple::RTEMS)
+    return;
+
+  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
+}
+
+static void AddLibStdCXXIncludePaths(StringRef Base, StringRef ArchDir,
+                                     StringRef Dir32, StringRef Dir64,
+                                     const llvm::Triple &Triple,
+                                     const ArgList &DriverArgs,
+                                     ArgStringList &CC1Args) {
+  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 + "/backward");
+}
+
+void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
+                                         ArgStringList &CC1Args) const {
+  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
+      DriverArgs.hasArg(options::OPT_nostdincxx))
+    return;
+
+  const llvm::Triple &Triple = getTriple();
+  StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
+  if (CxxIncludeRoot != "") {
+    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);
+    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 x86 llvm-gcc trunk
+  AddLibStdCXXIncludePaths(
+    "/usr/lib/llvm-gcc-4.2-9999/include/c++/4.2.1",
+    "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);
+
+  // Gentoo amd64 llvm-gcc trunk
+  AddLibStdCXXIncludePaths(
+    "/usr/lib/llvm-gcc-4.2-9999/include/c++/4.2.1",
+    "x86_64-pc-linux-gnu", "", "", Triple, DriverArgs, CC1Args);
+}
+
 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
 
 DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
@@ -2230,27 +2686,8 @@ static bool getVisualStudioDir(std::string &path) {
   return false;
 }
 
-// FIXME: Hoist this up, generalize, and document it as more stuff begins using
-// it.
-static void addSystemInclude(const ArgList &DriverArgs, ArgStringList &CC1Args,
-                             const Twine &Path) {
-  CC1Args.push_back("-internal-isystem");
-  CC1Args.push_back(DriverArgs.MakeArgString(Path));
-}
-
 #endif // _MSC_VER
 
-// FIXME: Generalize this and document it as more clients begin to use it.
-static void addSystemIncludes(const ArgList &DriverArgs,
-                              ArgStringList &CC1Args,
-                              ArrayRef<StringRef> Paths) {
-  for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end();
-       I != E; ++I) {
-    CC1Args.push_back("-internal-isystem");
-    CC1Args.push_back(DriverArgs.MakeArgString(*I));
-  }
-}
-
 void Windows::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
                                         ArgStringList &CC1Args) const {
   if (DriverArgs.hasArg(options::OPT_nostdinc))
index f0c348402c4959a92f212b23662d073c7298f959..cd3afa158533399f78777347f8dd3ee46bf448c4 100644 (file)
@@ -380,6 +380,11 @@ public:
   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
                            const ActionList &Inputs) const;
 
+  virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
+                                         ArgStringList &CC1Args) const;
+  virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
+                                            ArgStringList &CC1Args) const;
+
   std::string Linker;
   std::vector<std::string> ExtraOpts;
 };
index 6e739f0a95bee0a5deba391024bb53b12e0ba377..c4e536079e19d034b031e13d6394014543688ebe 100644 (file)
@@ -421,12 +421,12 @@ void Clang::AddPreprocessingOptions(const Driver &D,
   AddIncludeDirectoryList(Args, CmdArgs, "-objcxx-isystem",
                           ::getenv("OBJCPLUS_INCLUDE_PATH"));
 
-  // Add system include arguments.
-  getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
-
   // Add C++ include arguments, if needed.
   if (types::isCXX(Inputs[0].getType()))
     getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
+
+  // Add system include arguments.
+  getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
 }
 
 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
index decf345de418c1119b81ae433adee362fcd37d2a..051d5634b30f4fe3b5ed30eb1ccb7c11d7f5df50 100644 (file)
@@ -248,8 +248,9 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
   }
 
   switch (os) {
+  case llvm::Triple::Linux:
   case llvm::Triple::Win32:
-    llvm_unreachable("Windows include management is handled in the driver.");
+    llvm_unreachable("Include management is handled in the driver.");
 
   case llvm::Triple::Haiku:
     AddPath("/boot/common/include", System, true, false, false);
@@ -316,20 +317,6 @@ void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple,
     }
     break;
       
-  case llvm::Triple::Linux:
-    // Generic Debian multiarch support:
-    if (triple.getArch() == llvm::Triple::x86_64) {
-      AddPath("/usr/include/x86_64-linux-gnu", System, false, false, false);
-      AddPath("/usr/include/i686-linux-gnu/64", System, false, false, false);
-      AddPath("/usr/include/i486-linux-gnu/64", System, false, false, false);
-    } else if (triple.getArch() == llvm::Triple::x86) {
-      AddPath("/usr/include/x86_64-linux-gnu/32", System, false, false, false);
-      AddPath("/usr/include/i686-linux-gnu", System, false, false, false);
-      AddPath("/usr/include/i486-linux-gnu", System, false, false, false);
-      AddPath("/usr/include/i386-linux-gnu", System, false, false, false);
-    } else if (triple.getArch() == llvm::Triple::arm) {
-      AddPath("/usr/include/arm-linux-gnueabi", System, false, false, false);
-    }
   default:
     break;
   }
@@ -390,6 +377,10 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
   }
 
   switch (os) {
+  case llvm::Triple::Linux:
+  case llvm::Triple::Win32:
+    llvm_unreachable("Include management is handled in the driver.");
+
   case llvm::Triple::Cygwin:
     // Cygwin-1.7
     AddMinGWCPlusPlusIncludePaths("/usr/lib/gcc", "i686-pc-cygwin", "4.3.4");
@@ -416,265 +407,6 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
     break;
   case llvm::Triple::DragonFly:
     AddPath("/usr/include/c++/4.1", CXXSystem, true, false, false);
-    break;
-  case llvm::Triple::Linux:
-    //===------------------------------------------------------------------===//
-    // Debian based distros.
-    // Note: these distros symlink /usr/include/c++/X.Y.Z -> X.Y
-    //===------------------------------------------------------------------===//
-
-    // Ubuntu 11.11 "Oneiric Ocelot" -- gcc-4.6.0
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
-                                "x86_64-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
-                                "i686-linux-gnu", "", "64", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
-                                "i486-linux-gnu", "", "64", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
-                                "arm-linux-gnueabi", "", "", triple);
-
-    // Ubuntu 11.04 "Natty Narwhal" -- gcc-4.5.2
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
-                                "x86_64-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
-                                "i686-linux-gnu", "", "64", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
-                                "i486-linux-gnu", "", "64", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
-                                "arm-linux-gnueabi", "", "", triple);
-
-    // Ubuntu 10.10 "Maverick Meerkat" -- gcc-4.4.5
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                "i686-linux-gnu", "", "64", triple);
-    // 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
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                "x86_64-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                "i486-linux-gnu", "", "64", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                "arm-linux-gnueabi", "", "", triple);
-    // 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
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                "x86_64-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                "i486-linux-gnu", "", "64", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                "arm-linux-gnueabi", "", "", triple);
-    // Ubuntu 8.04.4 LTS "Hardy Heron"     -- gcc-4.2.4
-    // Ubuntu 8.04.[0-3] LTS "Hardy Heron" -- gcc-4.2.3
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2",
-                                "x86_64-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2",
-                                "i486-linux-gnu", "", "64", triple);
-    // Ubuntu 7.10 "Gutsy Gibbon" -- gcc-4.1.3
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1",
-                                "x86_64-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1",
-                                "i486-linux-gnu", "", "64", triple);
-
-    //===------------------------------------------------------------------===//
-    // Redhat based distros.
-    //===------------------------------------------------------------------===//
-    // Fedora 15 (GCC 4.6.1)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
-                                "i686-redhat-linux", "", "", triple);
-    // Fedora 15 (GCC 4.6.0)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
-                                "i686-redhat-linux", "", "", triple);
-    // Fedora 14
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.1",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.1",
-                                "i686-redhat-linux", "", "", triple);
-    // RHEL5(gcc44)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
-                                "x86_64-redhat-linux6E", "32", "", triple);
-    // Fedora 13
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.4",
-                                "i686-redhat-linux","", "", triple);
-    // Fedora 12
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
-                                "i686-redhat-linux","", "", triple);
-    // Fedora 12 (pre-FEB-2010)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.2",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.2",
-                                "i686-redhat-linux","", "", triple);
-    // Fedora 11
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.1",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.1",
-                                "i586-redhat-linux","", "", triple);
-    // Fedora 10
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2",
-                                "i386-redhat-linux","", "", triple);
-    // Fedora 9
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0",
-                                "i386-redhat-linux", "", "", triple);
-    // Fedora 8
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2",
-                                "x86_64-redhat-linux", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2",
-                                "i386-redhat-linux", "", "", triple);
-      
-    // RHEL 5
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.1",
-                                "x86_64-redhat-linux", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.1",
-                                "i386-redhat-linux", "", "", triple);
-
-
-    //===------------------------------------------------------------------===//
-
-    // Exherbo (2010-01-25)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
-                                "x86_64-pc-linux-gnu", "32", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.3",
-                                "i686-pc-linux-gnu", "", "", triple);
-
-    // openSUSE 11.1 32 bit
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                "i586-suse-linux", "", "", triple);
-    // openSUSE 11.1 64 bit
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                "x86_64-suse-linux", "32", "", triple);
-    // openSUSE 11.2
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                "i586-suse-linux", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                "x86_64-suse-linux", "", "", triple);
-
-    // openSUSE 11.4
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
-                                "i586-suse-linux", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5",
-                                "x86_64-suse-linux", "", "", triple);
-
-    // openSUSE 12.1
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
-                                "i586-suse-linux", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6",
-                                "x86_64-suse-linux", "", "", triple);
-    // Arch Linux 2008-06-24
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
-                                "i686-pc-linux-gnu", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
-                                "x86_64-unknown-linux-gnu", "", "", triple);
-
-    // Arch Linux gcc 4.6
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
-                                "i686-pc-linux-gnu", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.1",
-                                "x86_64-unknown-linux-gnu", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
-                                "i686-pc-linux-gnu", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6.0",
-                                "x86_64-unknown-linux-gnu", "", "", triple);
-
-    // Slackware gcc 4.5.2 (13.37)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.2",
-                                "i486-slackware-linux", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.2",
-                                "x86_64-slackware-linux", "", "", triple);
-    // Slackware gcc 4.5.3 (-current)
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.3",
-                                "i486-slackware-linux", "", "", triple);
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.5.3",
-                                "x86_64-slackware-linux", "", "", triple);
-
-    // Gentoo x86 gcc 4.5.3
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.5.3/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 gcc 4.5.2
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.5.2/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 gcc 4.4.5
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.4.5/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 gcc 4.4.4
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.4.4/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-   // Gentoo x86 2010.0 stable
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 2009.1 stable
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 2009.0 stable
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 2008.0 stable
-    AddGnuCPlusPlusIncludePaths(
-      "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4",
-      "i686-pc-linux-gnu", "", "", triple);
-    // Gentoo x86 llvm-gcc trunk
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/llvm-gcc-4.2-9999/include/c++/4.2.1",
-        "i686-pc-linux-gnu", "", "", triple);
-
-    // Gentoo amd64 gcc 4.5.3
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4",
-        "x86_64-pc-linux-gnu", "32", "", triple);
-    // Gentoo amd64 gcc 4.5.2
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/include/g++-v4",
-        "x86_64-pc-linux-gnu", "32", "", triple);
-    // Gentoo amd64 gcc 4.4.5
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/include/g++-v4",
-        "x86_64-pc-linux-gnu", "32", "", triple);
-    // Gentoo amd64 gcc 4.4.4
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4",
-        "x86_64-pc-linux-gnu", "32", "", triple);
-    // Gentoo amd64 gcc 4.4.3
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/include/g++-v4",
-        "x86_64-pc-linux-gnu", "32", "", triple);
-    // Gentoo amd64 gcc 4.3.4
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4",
-        "x86_64-pc-linux-gnu", "", "", triple);
-    // Gentoo amd64 gcc 4.3.2
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/include/g++-v4",
-        "x86_64-pc-linux-gnu", "", "", triple);
-    // Gentoo amd64 stable
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4",
-        "x86_64-pc-linux-gnu", "", "", triple);
-
-    // Gentoo amd64 llvm-gcc trunk
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/llvm-gcc-4.2-9999/include/c++/4.2.1",
-        "x86_64-pc-linux-gnu", "", "", triple);
-
     break;
   case llvm::Triple::FreeBSD:
     // FreeBSD 8.0
@@ -719,6 +451,7 @@ void InitHeaderSearch::AddDefaultIncludePaths(const LangOptions &Lang,
   default:
     break; // Everything else continues to use this routine's logic.
 
+  case llvm::Triple::Linux:
   case llvm::Triple::Win32:
     return;
   }