From efa77170b531d519f2637c874fe4434198e91384 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 20 Jan 2013 00:00:22 +0000 Subject: [PATCH] convert some more stuff over to use new cursor APIs. llvm-svn: 172932 --- clang/include/clang/Serialization/ASTReader.h | 2 +- clang/lib/Serialization/ASTReader.cpp | 71 +++++++++++++-------------- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 07ccab4..328f967 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -1757,7 +1757,7 @@ public: /// then restores it when destroyed. struct SavedStreamPosition { explicit SavedStreamPosition(llvm::BitstreamCursor &Cursor) - : Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) { } + : Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) { } ~SavedStreamPosition() { Cursor.JumpToBit(Offset); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index e09e94f..9438d0f 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -673,7 +673,7 @@ bool ASTReader::ReadDeclContextStorage(ModuleFile &M, const char *Blob; unsigned BlobLen; unsigned Code = Cursor.ReadCode(); - unsigned RecCode = Cursor.ReadRecord(Code, Record, &Blob, &BlobLen); + unsigned RecCode = Cursor.ReadRecord(Code, Record, Blob, BlobLen); if (RecCode != DECL_CONTEXT_LEXICAL) { Error("Expected lexical block"); return true; @@ -691,7 +691,7 @@ bool ASTReader::ReadDeclContextStorage(ModuleFile &M, const char *Blob; unsigned BlobLen; unsigned Code = Cursor.ReadCode(); - unsigned RecCode = Cursor.ReadRecord(Code, Record, &Blob, &BlobLen); + unsigned RecCode = Cursor.ReadRecord(Code, Record, Blob, BlobLen); if (RecCode != DECL_CONTEXT_VISIBLE) { Error("Expected visible lookup table block"); return true; @@ -930,7 +930,7 @@ bool ASTReader::ReadSLocEntry(int ID) { unsigned Code = SLocEntryCursor.ReadCode(); Record.clear(); unsigned RecCode - = SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen); + = SLocEntryCursor.ReadRecord(Code, Record, BlobStart, BlobLen); if (RecCode != SM_SLOC_BUFFER_BLOB) { Error("AST record has invalid code"); @@ -958,7 +958,7 @@ bool ASTReader::ReadSLocEntry(int ID) { unsigned Code = SLocEntryCursor.ReadCode(); Record.clear(); unsigned RecCode - = SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen); + = SLocEntryCursor.ReadRecord(Code, Record, BlobStart, BlobLen); if (RecCode != SM_SLOC_BUFFER_BLOB) { Error("AST record has invalid code"); @@ -1081,24 +1081,22 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, } AddLoadedMacroInfo(PP, Hint); while (true) { - unsigned Code = Stream.ReadCode(); - switch (Code) { - case llvm::bitc::END_BLOCK: + // Advance to the next record, but if we get to the end of the block, don't + // pop it (removing all the abbreviations from the cursor) since we want to + // be able to reseek within the block and read entries. + unsigned Flags = llvm::BitstreamCursor::AF_DontPopBlockAtEnd; + llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags); + + switch (Entry.Kind) { + case llvm::BitstreamEntry::SubBlock: // Handled for us already. + case llvm::BitstreamEntry::Error: + Error("malformed block record in AST file"); return; - - case llvm::bitc::ENTER_SUBBLOCK: - // No known subblocks, always skip them. - Stream.ReadSubBlockID(); - if (Stream.SkipBlock()) { - Error("malformed block record in AST file"); - return; - } - continue; - - case llvm::bitc::DEFINE_ABBREV: - Stream.ReadAbbrevRecord(); - continue; - default: break; + case llvm::BitstreamEntry::EndBlock: + return; + case llvm::BitstreamEntry::Record: + // The interesting case. + break; } // Read a record. @@ -1106,7 +1104,7 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, unsigned BlobLen = 0; Record.clear(); PreprocessorRecordTypes RecType = - (PreprocessorRecordTypes)Stream.ReadRecord(Code, Record, BlobStart, + (PreprocessorRecordTypes)Stream.ReadRecord(Entry.ID, Record, BlobStart, BlobLen); switch (RecType) { case PP_MACRO_OBJECT_LIKE: @@ -2843,18 +2841,22 @@ ASTReader::ReadASTCore(StringRef FileName, // This is used for compatibility with older PCH formats. bool HaveReadControlBlock = false; - while (!Stream.AtEndOfStream()) { - unsigned Code = Stream.ReadCode(); - - if (Code != llvm::bitc::ENTER_SUBBLOCK) { + while (1) { + llvm::BitstreamEntry Entry = Stream.advance(); + + switch (Entry.Kind) { + case llvm::BitstreamEntry::Error: + case llvm::BitstreamEntry::EndBlock: + case llvm::BitstreamEntry::Record: Error("invalid record at top-level of AST file"); return Failure; + + case llvm::BitstreamEntry::SubBlock: + break; } - unsigned BlockID = Stream.ReadSubBlockID(); - // We only know the control subblock ID. - switch (BlockID) { + switch (Entry.ID) { case llvm::bitc::BLOCKINFO_BLOCK_ID: if (Stream.ReadBlockInfoBlock()) { Error("malformed BlockInfoBlock in AST file"); @@ -3085,16 +3087,11 @@ std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, Diags.Report(diag::err_fe_pch_error_at_end_block) << ASTFileName; return std::string(); - case llvm::BitstreamEntry::Record: { + case llvm::BitstreamEntry::Record: // Ignore top-level records. - // FIXME: Should have a skipRecord() method. - Record.clear(); - const char *BlobStart = 0; - unsigned BlobLen = 0; - Stream.ReadRecord(Entry.ID, Record, BlobStart, BlobLen); + Stream.skipRecord(Entry.ID); break; - } - + case llvm::BitstreamEntry::SubBlock: if (Entry.ID == CONTROL_BLOCK_ID) { if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { -- 2.7.4