aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Frontend/PCHReader.cpp19
-rw-r--r--lib/Frontend/PCHWriter.cpp18
-rw-r--r--lib/Lex/HeaderSearch.cpp12
-rw-r--r--lib/Lex/PPLexerChange.cpp2
4 files changed, 43 insertions, 8 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();
}
diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp
index 2cc29ecbed..ddea8e52a0 100644
--- a/lib/Lex/HeaderSearch.cpp
+++ b/lib/Lex/HeaderSearch.cpp
@@ -377,14 +377,20 @@ LookupSubframeworkHeader(const char *FilenameStart,
//===----------------------------------------------------------------------===//
-/// getFileInfo - Return the PerFileInfo structure for the specified
+/// getFileInfo - Return the HeaderFileInfo structure for the specified
/// FileEntry.
-HeaderSearch::PerFileInfo &HeaderSearch::getFileInfo(const FileEntry *FE) {
+HeaderFileInfo &HeaderSearch::getFileInfo(const FileEntry *FE) {
if (FE->getUID() >= FileInfo.size())
FileInfo.resize(FE->getUID()+1);
return FileInfo[FE->getUID()];
}
+void HeaderSearch::setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID) {
+ if (UID >= FileInfo.size())
+ FileInfo.resize(UID+1);
+ FileInfo[UID] = HFI;
+}
+
/// ShouldEnterIncludeFile - Mark the specified file as a target of of a
/// #include, #include_next, or #import directive. Return false if #including
/// the file will have no effect or true if we should include it.
@@ -392,7 +398,7 @@ bool HeaderSearch::ShouldEnterIncludeFile(const FileEntry *File, bool isImport){
++NumIncluded; // Count # of attempted #includes.
// Get information about this file.
- PerFileInfo &FileInfo = getFileInfo(File);
+ HeaderFileInfo &FileInfo = getFileInfo(File);
// If this is a #import directive, check that we have not already imported
// this header.
diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp
index 6f61c6516b..2a05ba336f 100644
--- a/lib/Lex/PPLexerChange.cpp
+++ b/lib/Lex/PPLexerChange.cpp
@@ -179,7 +179,7 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) {
if (CurPPLexer) { // Not ending a macro, ignore it.
if (const IdentifierInfo *ControllingMacro =
CurPPLexer->MIOpt.GetControllingMacroAtEndOfFile()) {
- // Okay, this has a controlling macro, remember in PerFileInfo.
+ // Okay, this has a controlling macro, remember in HeaderFileInfo.
if (const FileEntry *FE =
SourceMgr.getFileEntryForID(CurPPLexer->getFileID()))
HeaderInfo.SetFileControllingMacro(FE, ControllingMacro);