From: Chris Lattner Date: Mon, 27 Apr 2009 01:05:14 +0000 (+0000) Subject: Set up DeclsCursor. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6367f6d06308ef29c28d2c1604ded45625caeec9;p=clang Set up DeclsCursor. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70173 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 90f79b86f3..f92975d05c 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -87,7 +87,12 @@ private: /// \brief The bitstream reader from which we'll read the PCH file. llvm::BitstreamReader StreamFile; - llvm::BitstreamCursor Stream; + llvm::BitstreamCursor Stream; + + /// DeclsCursor - This is a cursor to the start of the DECLS_BLOCK block. It + /// has read all the abbreviations at the start of the block and is ready to + /// jump around with these in context. + llvm::BitstreamCursor DeclsCursor; /// \brief The file name of the PCH file. std::string FileName; @@ -292,6 +297,11 @@ public: /// LazyOffsetPtr. virtual Stmt *GetStmt(uint64_t Offset); + /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the + /// specified cursor. Read the abbreviations that are at the top of the block + /// and then leave the cursor pointing into the block. + bool ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID); + /// \brief Read all of the declarations lexically stored in a /// declaration context. /// diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index ebfe77ccd7..e9a4f54856 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -1683,6 +1683,27 @@ PCHReader::PCHReadResult PCHReader::ReadSourceManagerBlock() { } } +/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the +/// specified cursor. Read the abbreviations that are at the top of the block +/// and then leave the cursor pointing into the block. +bool PCHReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, + unsigned BlockID) { + if (Cursor.EnterSubBlock(BlockID)) { + Error("Malformed block record"); + return Failure; + } + + RecordData Record; + while (true) { + unsigned Code = Cursor.ReadCode(); + + // We expect all abbrevs to be at the start of the block. + if (Code != llvm::bitc::DEFINE_ABBREV) + return false; + Cursor.ReadAbbrevRecord(); + } +} + void PCHReader::ReadMacroRecord(uint64_t Offset) { // Keep track of where we are in the stream, then jump back there // after reading this macro. @@ -1807,7 +1828,6 @@ PCHReader::ReadPCHBlock() { 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()) { @@ -1816,6 +1836,20 @@ PCHReader::ReadPCHBlock() { } break; + case pch::DECLS_BLOCK_ID: + // We lazily load the decls block, but we want to set up the + // DeclsCursor cursor to point into it. Clone our current bitcode + // cursor to it, enter the block and read the abbrevs in that block. + // With the main cursor, we just skip over it. + DeclsCursor = Stream; + if (Stream.SkipBlock() || // Skip with the main cursor. + // Read the abbrevs. + ReadBlockAbbrevs(DeclsCursor, pch::DECLS_BLOCK_ID)) { + Error("Malformed block record"); + return Failure; + } + break; + case pch::PREPROCESSOR_BLOCK_ID: if (Stream.SkipBlock()) { Error("Malformed block record");