2009/11/25 Rafael Espindola <[email protected]>:
> Now with the patch!

Attached an updated one for today's head.

Cheers,
-- 
Rafael Ávila de Espíndola
diff --git a/include/clang/Frontend/HeaderSearchOptions.h b/include/clang/Frontend/HeaderSearchOptions.h
index 6712977..ab989c6 100644
--- a/include/clang/Frontend/HeaderSearchOptions.h
+++ b/include/clang/Frontend/HeaderSearchOptions.h
@@ -61,13 +61,16 @@ public:
   std::string CXXEnvIncPath;
   std::string ObjCXXEnvIncPath;
 
-  /// If non-empty, the path to the compiler builtin include directory, which
-  /// will be searched following the user and environment includes.
-  std::string BuiltinIncludePath;
+  /// The directory where clang was installed.
+  std::string ToolDir;
 
   /// Include the system standard include search directories.
   unsigned UseStandardIncludes : 1;
 
+  /// Include the system builtin include directories, which
+  /// will be searched following the user and environment includes.
+  unsigned UseBuiltinIncludes : 1;
+
   /// Whether header search information should be output as for -v.
   unsigned Verbose : 1;
 
diff --git a/lib/Driver/CC1Options.cpp b/lib/Driver/CC1Options.cpp
index e65d3dc..aed55b5 100644
--- a/lib/Driver/CC1Options.cpp
+++ b/lib/Driver/CC1Options.cpp
@@ -359,9 +359,9 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
   Opts.Sysroot = getLastArgValue(Args, OPT_isysroot, "/");
   Opts.Verbose = Args.hasArg(OPT_v);
   Opts.UseStandardIncludes = !Args.hasArg(OPT_nostdinc);
-  Opts.BuiltinIncludePath = "";
+  Opts.ToolDir = "";
   if (!Args.hasArg(OPT_nobuiltininc))
-      Opts.BuiltinIncludePath = "FIXME"; // FIXME: Get builtin include path!
+      Opts.ToolDir = "FIXME"; // FIXME: Get tooldir!
 
   // Add -I... and -F... options in order.
   for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F),
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index be9bab1..37e1518 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -344,11 +344,13 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
     // FIXME: Provide an option for this, and move env detection to driver.
     llvm::llvm_report_error("Not yet implemented!");
   }
-  if (!Opts.BuiltinIncludePath.empty()) {
+  if (!Opts.ToolDir.empty()) {
     // FIXME: Provide an option for this, and move to driver.
   }
   if (!Opts.UseStandardIncludes)
     Res.push_back("-nostdinc");
+  if (!Opts.UseBuiltinIncludes)
+    Res.push_back("-nobuiltininc");
   if (Opts.Verbose)
     Res.push_back("-v");
 }
diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp
index a40a569..ea0ce6d 100644
--- a/lib/Frontend/InitHeaderSearch.cpp
+++ b/lib/Frontend/InitHeaderSearch.cpp
@@ -14,6 +14,7 @@
 #include "clang/Frontend/Utils.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/LangOptions.h"
+#include "clang/Basic/Version.h"
 #include "clang/Frontend/HeaderSearchOptions.h"
 #include "clang/Lex/HeaderSearch.h"
 #include "llvm/ADT/SmallString.h"
@@ -42,12 +43,15 @@ class InitHeaderSearch {
   HeaderSearch& Headers;
   bool Verbose;
   std::string isysroot;
+  std::string ToolDir;
 
 public:
 
   InitHeaderSearch(HeaderSearch &HS,
-      bool verbose = false, const std::string &iSysroot = "")
-    : Headers(HS), Verbose(verbose), isysroot(iSysroot) {}
+      const std::string &toolDir, bool verbose = false,
+      const std::string &iSysroot = "")
+    : Headers(HS), Verbose(verbose), isysroot(iSysroot),
+      ToolDir(toolDir) {}
 
   /// AddPath - Add the specified path to the specified group list.
   void AddPath(const llvm::StringRef &Path, IncludeDirGroup Group,
@@ -441,6 +445,10 @@ void InitHeaderSearch::AddDefaultCPlusPlusIncludePaths(const llvm::Triple &tripl
   llvm::Triple::OSType os = triple.getOS();
   llvm::StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
   if (CxxIncludeRoot != "") {
+    if (!llvm::sys::Path::isAbsolute(CxxIncludeRoot.data(),
+                                     CxxIncludeRoot.size()))
+      CxxIncludeRoot = ToolDir + "/" + CxxIncludeRoot.str();
+
     llvm::StringRef CxxIncludeArch(CXX_INCLUDE_ARCH);
     if (CxxIncludeArch == "")
       AddGnuCPlusPlusIncludePaths(CxxIncludeRoot, triple.str().c_str(),
@@ -705,7 +713,8 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS,
                                      const HeaderSearchOptions &HSOpts,
                                      const LangOptions &Lang,
                                      const llvm::Triple &Triple) {
-  InitHeaderSearch Init(HS, HSOpts.Verbose, HSOpts.Sysroot);
+  InitHeaderSearch Init(HS, HSOpts.ToolDir, HSOpts.Verbose,
+                        HSOpts.Sysroot);
 
   // Add the user defined entries.
   for (unsigned i = 0, e = HSOpts.UserEntries.size(); i != e; ++i) {
@@ -725,10 +734,17 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS,
   else
     Init.AddDelimitedPaths(HSOpts.CEnvIncPath.c_str());
 
-  if (!HSOpts.BuiltinIncludePath.empty()) {
+  if (HSOpts.UseBuiltinIncludes) {
+    llvm::sys::Path P(HSOpts.ToolDir);
+    // Get tooldir/lib/clang/<version>/include
+    P.appendComponent("lib");
+    P.appendComponent("clang");
+    P.appendComponent(CLANG_VERSION_STRING);
+    P.appendComponent("include");
+
     // Ignore the sys root, we *always* look for clang headers relative to
     // supplied path.
-    Init.AddPath(HSOpts.BuiltinIncludePath, System,
+    Init.AddPath(P.str(), System,
                  false, false, false, /*IgnoreSysRoot=*/ true);
   }
 
diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp
index 34d7f40..b1ec557 100644
--- a/tools/clang-cc/Options.cpp
+++ b/tools/clang-cc/Options.cpp
@@ -868,7 +868,7 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
 }
 
 void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
-                                          llvm::StringRef BuiltinIncludePath) {
+                                          llvm::StringRef ToolDir) {
   using namespace headersearchoptions;
 
   if (isysroot.getPosition())
@@ -959,9 +959,8 @@ void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
   if (const char *Env = getenv("C_INCLUDE_PATH"))
     Opts.CEnvIncPath = Env;
 
-  if (!nobuiltininc)
-    Opts.BuiltinIncludePath = BuiltinIncludePath;
-
+  Opts.UseBuiltinIncludes = !nobuiltininc;
+  Opts.ToolDir = ToolDir;
   Opts.UseStandardIncludes = !nostdinc;
 }
 
diff --git a/tools/clang-cc/Options.h b/tools/clang-cc/Options.h
index 8367223..70a98b3 100644
--- a/tools/clang-cc/Options.h
+++ b/tools/clang-cc/Options.h
@@ -40,7 +40,7 @@ void InitializeDiagnosticOptions(DiagnosticOptions &Opts);
 void InitializeFrontendOptions(FrontendOptions &Opts);
 
 void InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
-                                   llvm::StringRef BuiltinIncludePath);
+                                   llvm::StringRef ToolDir);
 
 void InitializeLangOptions(LangOptions &Options, FrontendOptions::InputKind LK);
 
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 02eddc8..b79e52f 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -46,20 +46,14 @@ using namespace clang;
 // Main driver
 //===----------------------------------------------------------------------===//
 
-std::string GetBuiltinIncludePath(const char *Argv0) {
+std::string GetToolDir(const char *Argv0) {
   llvm::sys::Path P =
     llvm::sys::Path::GetMainExecutable(Argv0,
-                                       (void*)(intptr_t) GetBuiltinIncludePath);
+                                       (void*)(intptr_t) GetToolDir);
 
   if (!P.isEmpty()) {
     P.eraseComponent();  // Remove /clang from foo/bin/clang
     P.eraseComponent();  // Remove /bin   from foo/bin
-
-    // Get foo/lib/clang/<version>/include
-    P.appendComponent("lib");
-    P.appendComponent("clang");
-    P.appendComponent(CLANG_VERSION_STRING);
-    P.appendComponent("include");
   }
 
   return P.str();
@@ -173,9 +167,10 @@ static bool ConstructCompilerInvocation(CompilerInvocation &Opts,
   // Initialize the dependency output options (-M...).
   InitializeDependencyOutputOptions(Opts.getDependencyOutputOpts());
 
+  const std::string &ToolDir = GetToolDir(Argv0);
   // Initialize the header search options.
   InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(),
-                                GetBuiltinIncludePath(Argv0));
+                                ToolDir);
 
   // Initialize the other preprocessor options.
   InitializePreprocessorOptions(Opts.getPreprocessorOpts());
@@ -311,4 +306,3 @@ int main(int argc, char **argv) {
 
   return (Clang.getDiagnostics().getNumErrors() != 0);
 }
-
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to