diff options
Diffstat (limited to 'lib/Frontend')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 19 | ||||
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 18 |
2 files changed, 33 insertions, 4 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index d97cf810ba..62d0ba4f9f 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 @@ void PCHReader::ReadMacroRecord(uint64_t Offset) { RecordData Record; llvm::SmallVector<IdentifierInfo*, 16> MacroArgs; MacroInfo *Macro = 0; + while (true) { unsigned Code = Stream.ReadCode(); switch (Code) { @@ -1536,7 +1538,9 @@ void PCHReader::ReadMacroRecord(uint64_t Offset) { Macro->AddTokenToBody(Tok); break; } - } + case pch::PP_HEADER_FILE_INFO: + break; // Already processed by ReadPreprocessorBlock(). + } } } @@ -1545,6 +1549,7 @@ bool PCHReader::ReadPreprocessorBlock() { return Error("Malformed preprocessor block record"); RecordData Record; + unsigned NumHeaderInfos = 0; while (true) { unsigned Code = Stream.ReadCode(); switch (Code) { @@ -1581,8 +1586,16 @@ bool PCHReader::ReadPreprocessorBlock() { 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 1af093a1cc..de4b9990b1 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 @@ void PCHWriter::WritePreprocessor(const Preprocessor &PP) { } ++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(); } |