diff options
-rw-r--r-- | lib/Driver/ToolChains.cpp | 475 | ||||
-rw-r--r-- | lib/Driver/ToolChains.h | 5 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 6 | ||||
-rw-r--r-- | lib/Frontend/InitHeaderSearch.cpp | 281 |
4 files changed, 471 insertions, 296 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 3a404e5245..bfdd7196d0 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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)) diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index f0c348402c..cd3afa1585 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -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; }; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 6e739f0a95..c4e536079e 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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. diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp index decf345de4..051d5634b3 100644 --- a/lib/Frontend/InitHeaderSearch.cpp +++ b/lib/Frontend/InitHeaderSearch.cpp @@ -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"); @@ -417,265 +408,6 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp 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 // FreeBSD 7.3 @@ -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; } |