]> granicus.if.org Git - clang/commitdiff
Set up DeclsCursor.
authorChris Lattner <sabre@nondot.org>
Mon, 27 Apr 2009 01:05:14 +0000 (01:05 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 27 Apr 2009 01:05:14 +0000 (01:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70173 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/PCHReader.h
lib/Frontend/PCHReader.cpp

index 90f79b86f368782381ced536432c7ef9ffadcf66..f92975d05cfead2987d5540dd2aafef8633cf072 100644 (file)
@@ -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.
   ///
index ebfe77ccd7878fc3feedb084047684122b4e81a1..e9a4f54856197fe0878c83bd793e3d1904ce65df 100644 (file)
@@ -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");