Step #1 in adding headermap support to clang.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45089 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 095eaaa..4f6ea92 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -613,8 +613,9 @@
 ///
 static void AddPath(const std::string &Path, IncludeDirGroup Group,
                     bool isCXXAware, bool isUserSupplied,
-                    bool isFramework, FileManager &FM) {
+                    bool isFramework, HeaderSearch &HS) {
   assert(!Path.empty() && "can't handle empty path here");
+  FileManager &FM = HS.getFileMgr();
   
   // Compute the actual path, taking into consideration -isysroot.
   llvm::SmallString<256> MappedPath;
@@ -648,6 +649,25 @@
     return;
   }
   
+  // Check to see if this is an apple-style headermap.
+  if (const FileEntry *FE = FM.getFile(&MappedPath[0], 
+                                       &MappedPath[0]+MappedPath.size())) {
+    std::string ErrorInfo;
+    const HeaderMap *HM = HS.CreateHeaderMap(FE, ErrorInfo);
+    if (HM) {
+      IncludeGroup[Group].push_back(DirectoryLookup(HM, Type, isUserSupplied,
+                                                    isFramework));
+      return;
+    }
+    
+    // If this looked like a headermap but was corrupted, emit that error,
+    // otherwise treat it as a missing directory.
+    if (!ErrorInfo.empty()) {
+      fprintf(stderr, "%s\n", ErrorInfo.c_str());
+      return;
+    }
+  }
+  
   if (Verbose)
     fprintf(stderr, "ignoring nonexistent directory \"%s\"\n", Path.c_str());
 }
@@ -674,23 +694,23 @@
                                    const LangOptions &Lang) {
   // Handle -F... options.
   for (unsigned i = 0, e = F_dirs.size(); i != e; ++i)
-    AddPath(F_dirs[i], Angled, false, true, true, FM);
+    AddPath(F_dirs[i], Angled, false, true, true, Headers);
   
   // Handle -I... options.
   for (unsigned i = 0, e = I_dirs.size(); i != e; ++i)
-    AddPath(I_dirs[i], Angled, false, true, false, FM);
+    AddPath(I_dirs[i], Angled, false, true, false, Headers);
   
   // Handle -idirafter... options.
   for (unsigned i = 0, e = idirafter_dirs.size(); i != e; ++i)
-    AddPath(idirafter_dirs[i], After, false, true, false, FM);
+    AddPath(idirafter_dirs[i], After, false, true, false, Headers);
   
   // Handle -iquote... options.
   for (unsigned i = 0, e = iquote_dirs.size(); i != e; ++i)
-    AddPath(iquote_dirs[i], Quoted, false, true, false, FM);
+    AddPath(iquote_dirs[i], Quoted, false, true, false, Headers);
   
   // Handle -isystem... options.
   for (unsigned i = 0, e = isystem_dirs.size(); i != e; ++i)
-    AddPath(isystem_dirs[i], System, false, true, false, FM);
+    AddPath(isystem_dirs[i], System, false, true, false, Headers);
 
   // Walk the -iprefix/-iwithprefix/-iwithprefixbefore argument lists in
   // parallel, processing the values in order of occurance to get the right
@@ -719,12 +739,12 @@
                   iwithprefix_vals.getPosition(iwithprefix_idx) < 
                   iwithprefixbefore_vals.getPosition(iwithprefixbefore_idx))) {
         AddPath(Prefix+iwithprefix_vals[iwithprefix_idx], 
-                System, false, false, false, FM);
+                System, false, false, false, Headers);
         ++iwithprefix_idx;
         iwithprefix_done = iwithprefix_idx == iwithprefix_vals.size();
       } else {
         AddPath(Prefix+iwithprefixbefore_vals[iwithprefixbefore_idx], 
-                Angled, false, false, false, FM);
+                Angled, false, false, false, Headers);
         ++iwithprefixbefore_idx;
         iwithprefixbefore_done = 
           iwithprefixbefore_idx == iwithprefixbefore_vals.size();
@@ -739,34 +759,35 @@
   // FIXME: get these from the target?
   if (!nostdinc) {
     if (Lang.CPlusPlus) {
-      AddPath("/usr/include/c++/4.0.0", System, true, false, false, FM);
+      AddPath("/usr/include/c++/4.0.0", System, true, false, false, Headers);
       AddPath("/usr/include/c++/4.0.0/i686-apple-darwin8", System, true, false,
-              false, FM);
-      AddPath("/usr/include/c++/4.0.0/backward", System, true, false, false,FM);
+              false, Headers);
+      AddPath("/usr/include/c++/4.0.0/backward", System, true, false, false,
+              Headers);
     }
     
-    AddPath("/usr/local/include", System, false, false, false, FM);
+    AddPath("/usr/local/include", System, false, false, false, Headers);
     // leopard
     AddPath("/usr/lib/gcc/i686-apple-darwin9/4.0.1/include", System, 
-            false, false, false, FM);
+            false, false, false, Headers);
     AddPath("/usr/lib/gcc/powerpc-apple-darwin9/4.0.1/include", 
-            System, false, false, false, FM);
+            System, false, false, false, Headers);
     AddPath("/usr/lib/gcc/powerpc-apple-darwin9/"
             "4.0.1/../../../../powerpc-apple-darwin0/include", 
-            System, false, false, false, FM);
+            System, false, false, false, Headers);
 
     // tiger
     AddPath("/usr/lib/gcc/i686-apple-darwin8/4.0.1/include", System, 
-            false, false, false, FM);
+            false, false, false, Headers);
     AddPath("/usr/lib/gcc/powerpc-apple-darwin8/4.0.1/include", 
-            System, false, false, false, FM);
+            System, false, false, false, Headers);
     AddPath("/usr/lib/gcc/powerpc-apple-darwin8/"
             "4.0.1/../../../../powerpc-apple-darwin8/include", 
-            System, false, false, false, FM);
+            System, false, false, false, Headers);
 
-    AddPath("/usr/include", System, false, false, false, FM);
-    AddPath("/System/Library/Frameworks", System, true, false, true, FM);
-    AddPath("/Library/Frameworks", System, true, false, true, FM);
+    AddPath("/usr/include", System, false, false, false, Headers);
+    AddPath("/System/Library/Frameworks", System, true, false, true, Headers);
+    AddPath("/Library/Frameworks", System, true, false, true, Headers);
   }
 
   // Now that we have collected all of the include paths, merge them all