[PATCH] D27184: Bitcode: Change expected layout of module blocks.
Peter Collingbourne via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 28 18:37:21 PST 2016
This revision was automatically updated to reflect the committed changes.
pcc marked an inline comment as done.
Closed by commit rL288098: Bitcode: Change expected layout of module blocks. (authored by pcc).
Changed prior to commit:
https://reviews.llvm.org/D27184?vs=79492&id=79496#toc
Repository:
rL LLVM
https://reviews.llvm.org/D27184
Files:
llvm/trunk/include/llvm/Bitcode/BitcodeReader.h
llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
Index: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
===================================================================
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -2306,7 +2306,10 @@
assert(GO);
}
- uint64_t FuncWordOffset = Record[1];
+ // Note that we subtract 1 here because the offset is relative to one word
+ // before the start of the identification or module block, which was
+ // historically always the start of the regular bitcode header.
+ uint64_t FuncWordOffset = Record[1] - 1;
Function *F = dyn_cast<Function>(GO);
assert(F);
uint64_t FuncBitOffset = FuncWordOffset * 32;
@@ -4354,7 +4357,10 @@
case bitc::MODULE_CODE_VSTOFFSET:
if (Record.size() < 1)
return error("Invalid record");
- VSTOffset = Record[0];
+ // Note that we subtract 1 here because the offset is relative to one word
+ // before the start of the identification or module block, which was
+ // historically always the start of the regular bitcode header.
+ VSTOffset = Record[0] - 1;
break;
/// MODULE_CODE_SOURCE_FILENAME: [namechar x N]
case bitc::MODULE_CODE_SOURCE_FILENAME:
@@ -6549,32 +6555,51 @@
return StreamOrErr.takeError();
BitstreamCursor &Stream = *StreamOrErr;
- uint64_t IdentificationBit = -1ull;
std::vector<BitcodeModule> Modules;
while (true) {
+ uint64_t BCBegin = Stream.getCurrentByteNo();
+
// We may be consuming bitcode from a client that leaves garbage at the end
// of the bitcode stream (e.g. Apple's ar tool). If we are close enough to
// the end that there cannot possibly be another module, stop looking.
- if (Stream.getCurrentByteNo() + 8 >= Stream.getBitcodeBytes().size())
+ if (BCBegin + 8 >= Stream.getBitcodeBytes().size())
return Modules;
BitstreamEntry Entry = Stream.advance();
switch (Entry.Kind) {
case BitstreamEntry::EndBlock:
case BitstreamEntry::Error:
return error("Malformed block");
- case BitstreamEntry::SubBlock:
- if (Entry.ID == bitc::IDENTIFICATION_BLOCK_ID)
- IdentificationBit = Stream.GetCurrentBitNo();
- else if (Entry.ID == bitc::MODULE_BLOCK_ID)
- Modules.push_back({Stream.getBitcodeBytes(),
+ case BitstreamEntry::SubBlock: {
+ uint64_t IdentificationBit = -1ull;
+ if (Entry.ID == bitc::IDENTIFICATION_BLOCK_ID) {
+ IdentificationBit = Stream.GetCurrentBitNo() - BCBegin * 8;
+ if (Stream.SkipBlock())
+ return error("Malformed block");
+
+ Entry = Stream.advance();
+ if (Entry.Kind != BitstreamEntry::SubBlock ||
+ Entry.ID != bitc::MODULE_BLOCK_ID)
+ return error("Malformed block");
+ }
+
+ if (Entry.ID == bitc::MODULE_BLOCK_ID) {
+ uint64_t ModuleBit = Stream.GetCurrentBitNo() - BCBegin * 8;
+ if (Stream.SkipBlock())
+ return error("Malformed block");
+
+ Modules.push_back({Stream.getBitcodeBytes().slice(
+ BCBegin, Stream.getCurrentByteNo() - BCBegin),
Buffer.getBufferIdentifier(), IdentificationBit,
- Stream.GetCurrentBitNo()});
+ ModuleBit});
+ continue;
+ }
if (Stream.SkipBlock())
return error("Malformed block");
continue;
+ }
case BitstreamEntry::Record:
Stream.skipRecord(Entry.ID);
continue;
Index: llvm/trunk/include/llvm/Bitcode/BitcodeReader.h
===================================================================
--- llvm/trunk/include/llvm/Bitcode/BitcodeReader.h
+++ llvm/trunk/include/llvm/Bitcode/BitcodeReader.h
@@ -42,6 +42,7 @@
/// Represents a module in a bitcode file.
class BitcodeModule {
+ // This covers the identification (if present) and module blocks.
ArrayRef<uint8_t> Buffer;
StringRef ModuleIdentifier;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27184.79496.patch
Type: text/x-patch
Size: 3997 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161129/f5643358/attachment.bin>
More information about the llvm-commits
mailing list