aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReader.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-04-26 00:07:37 +0000
committerDouglas Gregor <dgregor@apple.com>2009-04-26 00:07:37 +0000
commit2eafc1b56347f772729e082e6bac824b0ef1b585 (patch)
tree92d68a82e05f571a0e55e132948265ceb2361454 /lib/Frontend/PCHReader.cpp
parent7c32f8e9be486f8f8ec2e75eba36903f7cb1b73a (diff)
Don't read all of the records in the PCH file's preprocessor block,
most of which are ignored. Instead, move the __COUNTER__ value out to a PCH-level record (since it is handled eagerly) and move the header file information into the SourceManager block (which is also, currently, loaded eagerly). This results in another 17% performance improvement in the Cocoa-prefixed "Hello, World" with PCH. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70097 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r--lib/Frontend/PCHReader.cpp102
1 files changed, 18 insertions, 84 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index c351a24118..d824c56848 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -1473,6 +1473,7 @@ PCHReader::PCHReadResult PCHReader::ReadSourceManagerBlock() {
SourceManager &SourceMgr = Context.getSourceManager();
RecordData Record;
+ unsigned NumHeaderInfos = 0;
while (true) {
unsigned Code = Stream.ReadCode();
if (Code == llvm::bitc::END_BLOCK) {
@@ -1557,6 +1558,16 @@ PCHReader::PCHReadResult PCHReader::ReadSourceManagerBlock() {
if (ParseLineTable(SourceMgr, Record))
return Failure;
break;
+
+ case pch::SM_HEADER_FILE_INFO: {
+ HeaderFileInfo HFI;
+ HFI.isImport = Record[0];
+ HFI.DirInfo = Record[1];
+ HFI.NumIncludes = Record[2];
+ HFI.ControllingMacroID = Record[3];
+ PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, NumHeaderInfos++);
+ break;
+ }
}
}
}
@@ -1597,10 +1608,6 @@ void PCHReader::ReadMacroRecord(uint64_t Offset) {
pch::PreprocessorRecordTypes RecType =
(pch::PreprocessorRecordTypes)Stream.ReadRecord(Code, Record);
switch (RecType) {
- case pch::PP_COUNTER_VALUE:
- // Skip this record.
- break;
-
case pch::PP_MACRO_OBJECT_LIKE:
case pch::PP_MACRO_FUNCTION_LIKE: {
// If we already have a macro, that means that we've hit the end
@@ -1663,70 +1670,12 @@ void PCHReader::ReadMacroRecord(uint64_t Offset) {
Macro->AddTokenToBody(Tok);
break;
}
- case pch::PP_HEADER_FILE_INFO:
- break; // Already processed by ReadPreprocessorBlock().
}
}
}
-bool PCHReader::ReadPreprocessorBlock() {
- if (Stream.EnterSubBlock(pch::PREPROCESSOR_BLOCK_ID))
- return Error("Malformed preprocessor block record");
-
- RecordData Record;
- unsigned NumHeaderInfos = 0;
- while (true) {
- unsigned Code = Stream.ReadCode();
- switch (Code) {
- case llvm::bitc::END_BLOCK:
- if (Stream.ReadBlockEnd())
- return Error("Error at end of preprocessor block");
- return false;
-
- case llvm::bitc::ENTER_SUBBLOCK:
- // No known subblocks, always skip them.
- Stream.ReadSubBlockID();
- if (Stream.SkipBlock())
- return Error("Malformed block record");
- continue;
-
- case llvm::bitc::DEFINE_ABBREV:
- Stream.ReadAbbrevRecord();
- continue;
- default: break;
- }
-
- // Read a record.
- Record.clear();
- pch::PreprocessorRecordTypes RecType =
- (pch::PreprocessorRecordTypes)Stream.ReadRecord(Code, Record);
- switch (RecType) {
- default: // Default behavior: ignore unknown records.
- break;
- case pch::PP_COUNTER_VALUE:
- if (!Record.empty())
- PP.setCounterValue(Record[0]);
- break;
-
- case pch::PP_MACRO_OBJECT_LIKE:
- case pch::PP_MACRO_FUNCTION_LIKE:
- case pch::PP_TOKEN:
- break;
- case pch::PP_HEADER_FILE_INFO: {
- HeaderFileInfo HFI;
- HFI.isImport = Record[0];
- HFI.DirInfo = Record[1];
- HFI.NumIncludes = Record[2];
- HFI.ControllingMacroID = Record[3];
- PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, NumHeaderInfos++);
- break;
- }
- }
- }
-}
-
PCHReader::PCHReadResult
-PCHReader::ReadPCHBlock(uint64_t &PreprocessorBlockOffset) {
+PCHReader::ReadPCHBlock() {
if (Stream.EnterSubBlock(pch::PCH_BLOCK_ID)) {
Error("Malformed block record");
return Failure;
@@ -1757,13 +1706,6 @@ PCHReader::ReadPCHBlock(uint64_t &PreprocessorBlockOffset) {
break;
case pch::PREPROCESSOR_BLOCK_ID:
- // Skip the preprocessor block for now, but remember where it is. We
- // want to read it in after the identifier table.
- if (PreprocessorBlockOffset) {
- Error("Multiple preprocessor blocks found.");
- return Failure;
- }
- PreprocessorBlockOffset = Stream.GetCurrentBitNo();
if (Stream.SkipBlock()) {
Error("Malformed block record");
return Failure;
@@ -1907,6 +1849,11 @@ PCHReader::ReadPCHBlock(uint64_t &PreprocessorBlockOffset) {
PCHMethodPoolLookupTrait(*this));
TotalSelectorsInMethodPool = Record[1];
break;
+
+ case pch::PP_COUNTER_VALUE:
+ if (!Record.empty())
+ PP.setCounterValue(Record[0]);
+ break;
}
}
Error("Premature end of bitstream");
@@ -1938,10 +1885,6 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
return IgnorePCH;
}
- // We expect a number of well-defined blocks, though we don't necessarily
- // need to understand them all.
- uint64_t PreprocessorBlockOffset = 0;
-
while (!Stream.AtEndOfStream()) {
unsigned Code = Stream.ReadCode();
@@ -1961,7 +1904,7 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
}
break;
case pch::PCH_BLOCK_ID:
- switch (ReadPCHBlock(PreprocessorBlockOffset)) {
+ switch (ReadPCHBlock()) {
case Success:
break;
@@ -2036,15 +1979,6 @@ PCHReader::PCHReadResult PCHReader::ReadPCH(const std::string &FileName) {
if (unsigned FastEnum
= SpecialTypes[pch::SPECIAL_TYPE_OBJC_FAST_ENUMERATION_STATE])
Context.setObjCFastEnumerationStateType(GetType(FastEnum));
- // If we saw the preprocessor block, read it now.
- if (PreprocessorBlockOffset) {
- SavedStreamPosition SavedPos(Stream);
- Stream.JumpToBit(PreprocessorBlockOffset);
- if (ReadPreprocessorBlock()) {
- Error("Malformed preprocessor block");
- return Failure;
- }
- }
return Success;
}