diff options
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 126 |
1 files changed, 30 insertions, 96 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 01a79b44d9..0e5b6ee8aa 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -192,129 +192,63 @@ bool PCHReader::ReadSourceManagerBlock() { } } -/// \brief Read the type-offsets block. -bool PCHReader::ReadTypeOffsets() { - if (Stream.EnterSubBlock(pch::TYPE_OFFSETS_BLOCK_ID)) +bool PCHReader::ReadPCHBlock() { + if (Stream.EnterSubBlock(pch::PCH_BLOCK_ID)) return Error("Malformed block record"); + // Read all of the records and blocks for the PCH file. RecordData Record; - while (true) { + while (!Stream.AtEndOfStream()) { unsigned Code = Stream.ReadCode(); if (Code == llvm::bitc::END_BLOCK) { if (Stream.ReadBlockEnd()) - return Error("Error at end of TYPE_OFFSETS block"); + return Error("Error at end of module block"); return false; } - + if (Code == llvm::bitc::ENTER_SUBBLOCK) { - // No known subblocks, always skip them. - Stream.ReadSubBlockID(); - if (Stream.SkipBlock()) - return Error("Malformed block record"); + switch (Stream.ReadSubBlockID()) { + case pch::DECLS_BLOCK_ID: // Skip decls block (lazily loaded) + case pch::TYPES_BLOCK_ID: // Skip types block (lazily loaded) + default: // Skip unknown content. + if (Stream.SkipBlock()) + return Error("Malformed block record"); + break; + + case pch::SOURCE_MANAGER_BLOCK_ID: + if (ReadSourceManagerBlock()) + return Error("Malformed source manager block"); + break; + } continue; } - + if (Code == llvm::bitc::DEFINE_ABBREV) { Stream.ReadAbbrevRecord(); continue; } - - // Read a record. + + // Read and process a record. Record.clear(); - switch (Stream.ReadRecord(Code, Record)) { + switch ((pch::PCHRecordTypes)Stream.ReadRecord(Code, Record)) { default: // Default behavior: ignore. break; + case pch::TYPE_OFFSET: if (!TypeOffsets.empty()) - return Error("Duplicate TYPE_OFFSETS block"); + return Error("Duplicate TYPE_OFFSET record in PCH file"); TypeOffsets.swap(Record); TypeAlreadyLoaded.resize(TypeOffsets.size(), false); break; - } - } -} - -/// \brief Read the decl-offsets block. -bool PCHReader::ReadDeclOffsets() { - if (Stream.EnterSubBlock(pch::DECL_OFFSETS_BLOCK_ID)) - return Error("Malformed block record"); - RecordData Record; - while (true) { - unsigned Code = Stream.ReadCode(); - if (Code == llvm::bitc::END_BLOCK) { - if (Stream.ReadBlockEnd()) - return Error("Error at end of DECL_OFFSETS block"); - return false; - } - - if (Code == llvm::bitc::ENTER_SUBBLOCK) { - // No known subblocks, always skip them. - Stream.ReadSubBlockID(); - if (Stream.SkipBlock()) - return Error("Malformed block record"); - continue; - } - - if (Code == llvm::bitc::DEFINE_ABBREV) { - Stream.ReadAbbrevRecord(); - continue; - } - - // Read a record. - Record.clear(); - switch (Stream.ReadRecord(Code, Record)) { - default: // Default behavior: ignore. - break; case pch::DECL_OFFSET: if (!DeclOffsets.empty()) - return Error("Duplicate DECL_OFFSETS block"); + return Error("Duplicate DECL_OFFSET record in PCH file"); DeclOffsets.swap(Record); DeclAlreadyLoaded.resize(DeclOffsets.size(), false); break; } } -} - -bool PCHReader::ReadPCHBlock() { - if (Stream.EnterSubBlock(pch::PCH_BLOCK_ID)) - return Error("Malformed block record"); - - // Read all of the records and blocks for the PCH file. - while (!Stream.AtEndOfStream()) { - unsigned Code = Stream.ReadCode(); - if (Code == llvm::bitc::END_BLOCK) { - if (Stream.ReadBlockEnd()) - return Error("Error at end of module block"); - return false; - } - - if (Code == llvm::bitc::ENTER_SUBBLOCK) { - switch (Stream.ReadSubBlockID()) { - case pch::DECLS_BLOCK_ID: // Skip decls block (lazily loaded) - case pch::TYPES_BLOCK_ID: // Skip types block (lazily loaded) - default: // Skip unknown content. - if (Stream.SkipBlock()) - return Error("Malformed block record"); - break; - - case pch::SOURCE_MANAGER_BLOCK_ID: - if (ReadSourceManagerBlock()) - return Error("Malformed source manager block"); - break; - - case pch::TYPE_OFFSETS_BLOCK_ID: - if (ReadTypeOffsets()) - return Error("Malformed type-offsets block"); - break; - - case pch::DECL_OFFSETS_BLOCK_ID: - if (ReadDeclOffsets()) - return Error("Malformed decl-offsets block"); - break; - } - } - } return Error("Premature end of bitstream"); } @@ -426,7 +360,7 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) { // FIXME: Several other kinds of types to deserialize here! default: - assert("Unable to deserialize this type"); + assert(false && "Unable to deserialize this type"); break; } @@ -500,7 +434,7 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) { return D; } -QualType PCHReader::GetType(unsigned ID) { +QualType PCHReader::GetType(pch::TypeID ID) { unsigned Quals = ID & 0x07; unsigned Index = ID >> 3; @@ -550,7 +484,7 @@ QualType PCHReader::GetType(unsigned ID) { return QualType(reinterpret_cast<Type *>(TypeOffsets[Index]), Quals); } -Decl *PCHReader::GetDecl(unsigned ID) { +Decl *PCHReader::GetDecl(pch::DeclID ID) { if (ID == 0) return 0; @@ -563,7 +497,7 @@ Decl *PCHReader::GetDecl(unsigned ID) { } bool PCHReader::ReadDeclsLexicallyInContext(DeclContext *DC, - llvm::SmallVectorImpl<unsigned> &Decls) { + llvm::SmallVectorImpl<pch::DeclID> &Decls) { assert(DC->hasExternalLexicalStorage() && "DeclContext has no lexical decls in storage"); uint64_t Offset = DeclContextOffsets[DC].first; |