Add PCH support for #import.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69987 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index d97cf81..62d0ba4 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -23,6 +23,7 @@
 #include "clang/AST/Type.h"
 #include "clang/Lex/MacroInfo.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Lex/HeaderSearch.h"
 #include "clang/Basic/OnDiskHashTable.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/SourceManagerInternals.h"
@@ -1444,6 +1445,7 @@
   RecordData Record;
   llvm::SmallVector<IdentifierInfo*, 16> MacroArgs;
   MacroInfo *Macro = 0;
+  
   while (true) {
     unsigned Code = Stream.ReadCode();
     switch (Code) {
@@ -1536,7 +1538,9 @@
       Macro->AddTokenToBody(Tok);
       break;
     }
-    }
+    case pch::PP_HEADER_FILE_INFO:
+      break; // Already processed by ReadPreprocessorBlock().
+  }
   }
 }
 
@@ -1545,6 +1549,7 @@
     return Error("Malformed preprocessor block record");
   
   RecordData Record;
+  unsigned NumHeaderInfos = 0;
   while (true) {
     unsigned Code = Stream.ReadCode();
     switch (Code) {
@@ -1581,8 +1586,16 @@
     case pch::PP_MACRO_OBJECT_LIKE:
     case pch::PP_MACRO_FUNCTION_LIKE:
     case pch::PP_TOKEN:
-      // Once we've hit a macro definition or a token, we're done.
-      return false;
+      break;
+    case pch::PP_HEADER_FILE_INFO: {
+      HeaderFileInfo HFI;
+      HFI.isImport = Record[0];
+      HFI.DirInfo = Record[1];
+      HFI.NumIncludes = Record[2];
+      HFI.ControllingMacro = DecodeIdentifierInfo(Record[3]);
+      PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, NumHeaderInfos++);
+      break;
+    }
     }
   }
 }
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index 1af093a..de4b999 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -23,6 +23,7 @@
 #include "clang/AST/Type.h"
 #include "clang/Lex/MacroInfo.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Lex/HeaderSearch.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/OnDiskHashTable.h"
 #include "clang/Basic/SourceManager.h"
@@ -1547,7 +1548,22 @@
     }
     ++NumMacros;
   }
-  
+
+  // Loop over all the header files.
+  HeaderSearch &HS = PP.getHeaderSearchInfo();  
+  for (HeaderSearch::header_file_iterator I = HS.header_file_begin(), 
+                                          E = HS.header_file_end();
+       I != E; ++I) {
+    Record.push_back((*I).isImport);
+    Record.push_back((*I).DirInfo);
+    Record.push_back((*I).NumIncludes);
+    if ((*I).ControllingMacro)
+      AddIdentifierRef((*I).ControllingMacro, Record);
+    else
+      Record.push_back(0);
+    Stream.EmitRecord(pch::PP_HEADER_FILE_INFO, Record);
+    Record.clear();
+  }
   Stream.ExitBlock();
 }