[llvm-commits] [llvm] r44470 - in /llvm/trunk: include/llvm/Bitcode/Deserialize.h lib/Bitcode/Reader/Deserialize.cpp
Ted Kremenek
kremenek at apple.com
Fri Nov 30 14:45:05 PST 2007
Author: kremenek
Date: Fri Nov 30 16:45:05 2007
New Revision: 44470
URL: http://llvm.org/viewvc/llvm-project?rev=44470&view=rev
Log:
Fixed subtle bug in Deserializer::JumpTo when jumping when the block-nesting
information matching did not exactly match the underlying stream's scoping
information.
Modified:
llvm/trunk/include/llvm/Bitcode/Deserialize.h
llvm/trunk/lib/Bitcode/Reader/Deserialize.cpp
Modified: llvm/trunk/include/llvm/Bitcode/Deserialize.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/Deserialize.h?rev=44470&r1=44469&r2=44470&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Bitcode/Deserialize.h (original)
+++ llvm/trunk/include/llvm/Bitcode/Deserialize.h Fri Nov 30 16:45:05 2007
@@ -125,7 +125,7 @@
llvm::SmallVector<Location,8> BlockStack;
unsigned AbbrevNo;
unsigned RecordCode;
- Location StreamStart;
+ uint64_t StreamStart;
//===----------------------------------------------------------===//
// Public Interface.
@@ -348,7 +348,7 @@
bool FinishedBlock(Location BlockLoc);
bool JumpTo(const Location& BlockLoc);
- void Rewind() { JumpTo(StreamStart); }
+ void Rewind();
bool AtEnd();
bool inRecord();
Modified: llvm/trunk/lib/Bitcode/Reader/Deserialize.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/Deserialize.cpp?rev=44470&r1=44469&r2=44470&view=diff
==============================================================================
--- llvm/trunk/lib/Bitcode/Reader/Deserialize.cpp (original)
+++ llvm/trunk/lib/Bitcode/Reader/Deserialize.cpp Fri Nov 30 16:45:05 2007
@@ -21,9 +21,8 @@
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 @@
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 @@
// 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 @@
}
// 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 @@
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();
More information about the llvm-commits
mailing list