[PATCH] D27241: Bitcode: Correctly handle Fixed and VBR arrays in BitstreamCursor::skipRecord().
Peter Collingbourne via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 29 16:40:10 PST 2016
pcc created this revision.
pcc added a reviewer: mehdi_amini.
pcc added a subscriber: llvm-commits.
The assertions were wrong; we need to call getEncodingData() on the element,
not the array. While here, simplify the skipRecord() implementation for Fixed
and Char6 arrays. This is tested by the code I added to llvm-bcanalyzer
which makes sure that we can skip any record.
https://reviews.llvm.org/D27241
Files:
llvm/lib/Bitcode/Reader/BitstreamReader.cpp
llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
Index: llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
===================================================================
--- llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
+++ llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
@@ -567,7 +567,7 @@
++BlockStats.NumRecords;
StringRef Blob;
- unsigned CurrentRecordPos = Stream.getCurrentByteNo();
+ unsigned CurrentRecordPos = Stream.GetCurrentBitNo();
unsigned Code = Stream.readRecord(Entry.ID, Record, &Blob);
// Increment the # occurrences of this code.
@@ -608,7 +608,7 @@
SHA1 Hasher;
StringRef Hash;
{
- int BlockSize = CurrentRecordPos - BlockEntryPos;
+ int BlockSize = (CurrentRecordPos / 8) - BlockEntryPos;
auto Ptr = Stream.getPointerToByte(BlockEntryPos, BlockSize);
Hasher.update(ArrayRef<uint8_t>(Ptr, BlockSize));
Hash = Hasher.result();
@@ -675,6 +675,10 @@
outs() << "\n";
}
+
+ // Make sure that we can skip the current record.
+ Stream.JumpToBit(CurrentRecordPos);
+ Stream.skipRecord(Entry.ID);
}
}
Index: llvm/lib/Bitcode/Reader/BitstreamReader.cpp
===================================================================
--- llvm/lib/Bitcode/Reader/BitstreamReader.cpp
+++ llvm/lib/Bitcode/Reader/BitstreamReader.cpp
@@ -131,18 +131,16 @@
default:
report_fatal_error("Array element type can't be an Array or a Blob");
case BitCodeAbbrevOp::Fixed:
- assert((unsigned)Op.getEncodingData() <= MaxChunkSize);
- for (; NumElts; --NumElts)
- Read((unsigned)EltEnc.getEncodingData());
+ assert((unsigned)EltEnc.getEncodingData() <= MaxChunkSize);
+ JumpToBit(GetCurrentBitNo() + NumElts * EltEnc.getEncodingData());
break;
case BitCodeAbbrevOp::VBR:
- assert((unsigned)Op.getEncodingData() <= MaxChunkSize);
+ assert((unsigned)EltEnc.getEncodingData() <= MaxChunkSize);
for (; NumElts; --NumElts)
ReadVBR64((unsigned)EltEnc.getEncodingData());
break;
case BitCodeAbbrevOp::Char6:
- for (; NumElts; --NumElts)
- Read(6);
+ JumpToBit(GetCurrentBitNo() + NumElts * 6);
break;
}
continue;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27241.79673.patch
Type: text/x-patch
Size: 2267 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161130/c28395ba/attachment.bin>
More information about the llvm-commits
mailing list