diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-11-30 22:45:05 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-11-30 22:45:05 +0000 |
commit | f64903b7d87d9bdb8300205674d754d6bf207eb7 (patch) | |
tree | 70e322edd5f8fe2e643067877f413d024e848a5f /lib/Bitcode | |
parent | 2a2a496aacd53aeb02dbf654f7e7c59de301c8c2 (diff) |
Fixed subtle bug in Deserializer::JumpTo when jumping when the block-nesting
information matching did not exactly match the underlying stream's scoping
information.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44470 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode')
-rw-r--r-- | lib/Bitcode/Reader/Deserialize.cpp | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/lib/Bitcode/Reader/Deserialize.cpp b/lib/Bitcode/Reader/Deserialize.cpp index f7866f8526..cb32f7d5ef 100644 --- a/lib/Bitcode/Reader/Deserialize.cpp +++ b/lib/Bitcode/Reader/Deserialize.cpp @@ -21,9 +21,8 @@ using namespace llvm; Deserializer::Deserializer(BitstreamReader& stream) : Stream(stream), RecIdx(0), FreeList(NULL), AbbrevNo(0), RecordCode(0) { - - AdvanceStream(); - if (!AtEnd()) StreamStart = BlockStack.back(); + + StreamStart = Stream.GetCurrentBitNo(); } Deserializer::~Deserializer() { @@ -165,12 +164,11 @@ bool Deserializer::JumpTo(const Location& Loc) { assert (!inRecord()); -// AdvanceStream(); + AdvanceStream(); -// assert (AbbrevNo == bitc::ENTER_SUBBLOCK); assert (!BlockStack.empty() || AtEnd()); - uint64_t LastBPos = StreamStart.BitNo; + uint64_t LastBPos = StreamStart; while (!BlockStack.empty()) { @@ -183,8 +181,11 @@ bool Deserializer::JumpTo(const Location& Loc) { // destroy any accumulated context within the block scope. We then // jump to the position of the block and enter it. Stream.JumpToBit(LastBPos); + + if (BlockStack.size() == Stream.BlockScope.size()) + Stream.PopBlockScope(); + BlockStack.pop_back(); - Stream.PopBlockScope(); AbbrevNo = 0; AdvanceStream(); @@ -195,14 +196,19 @@ bool Deserializer::JumpTo(const Location& Loc) { } // This block does not contain the block we are looking for. Pop it. + if (BlockStack.size() == Stream.BlockScope.size()) + Stream.PopBlockScope(); + BlockStack.pop_back(); - Stream.PopBlockScope(); + } // Check if we have popped our way to the outermost scope. If so, // we need to adjust our position. if (BlockStack.empty()) { - Stream.JumpToBit(Loc.BitNo < LastBPos ? StreamStart.BitNo : LastBPos); + assert (Stream.BlockScope.empty()); + + Stream.JumpToBit(Loc.BitNo < LastBPos ? StreamStart : LastBPos); AbbrevNo = 0; AdvanceStream(); } @@ -229,6 +235,18 @@ bool Deserializer::JumpTo(const Location& Loc) { return true; } +void Deserializer::Rewind() { + while (!Stream.BlockScope.empty()) + Stream.PopBlockScope(); + + while (!BlockStack.empty()) + BlockStack.pop_back(); + + Stream.JumpToBit(StreamStart); + AbbrevNo = 0; +} + + unsigned Deserializer::getCurrentBlockID() { if (!inRecord()) AdvanceStream(); |