summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Bitcode
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-11-08 04:17:11 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-11-08 04:17:11 +0000
commit77c89b6958f51a0b26c4849d37a200c1bc0319df (patch)
tree7ac81d7f4f32b81635db74539ad07fdbd1a6c535 /llvm/lib/Bitcode
parent939c7d916e1631cf2a005b4ba6c03726ecbe0f85 (diff)
downloadbcm5719-llvm-77c89b6958f51a0b26c4849d37a200c1bc0319df.tar.gz
bcm5719-llvm-77c89b6958f51a0b26c4849d37a200c1bc0319df.zip
Bitcode: Decouple block info block state from reader.
As proposed on llvm-dev: http://lists.llvm.org/pipermail/llvm-dev/2016-October/106630.html Move block info block state to a new class, BitstreamBlockInfo. Clients may set the block info for a particular cursor with the BitstreamCursor::setBlockInfo() method. At this point BitstreamReader is not much more than a container for an ArrayRef<uint8_t>, so remove it and replace all uses with direct uses of memory buffers. Differential Revision: https://reviews.llvm.org/D26259 llvm-svn: 286207
Diffstat (limited to 'llvm/lib/Bitcode')
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp16
-rw-r--r--llvm/lib/Bitcode/Reader/BitstreamReader.cpp48
2 files changed, 29 insertions, 35 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index 658e6d227e5..a5f040bfa36 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -233,7 +233,7 @@ protected:
BitcodeReaderBase(MemoryBuffer *Buffer) : Buffer(Buffer) {}
std::unique_ptr<MemoryBuffer> Buffer;
- std::unique_ptr<BitstreamReader> StreamFile;
+ BitstreamBlockInfo BlockInfo;
BitstreamCursor Stream;
std::error_code initStream();
@@ -256,8 +256,8 @@ std::error_code BitcodeReaderBase::initStream() {
if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true))
return error("Invalid bitcode wrapper header");
- StreamFile.reset(new BitstreamReader(ArrayRef<uint8_t>(BufPtr, BufEnd)));
- Stream.init(&*StreamFile);
+ Stream = BitstreamCursor(ArrayRef<uint8_t>(BufPtr, BufEnd));
+ Stream.setBlockInfo(&BlockInfo);
return std::error_code();
}
@@ -2211,8 +2211,7 @@ std::error_code BitcodeReader::parseMetadataStrings(ArrayRef<uint64_t> Record,
return error("Invalid record: metadata strings corrupt offset");
StringRef Lengths = Blob.slice(0, StringsOffset);
- SimpleBitstreamCursor R(*StreamFile);
- R.jumpToPointer(Lengths.begin());
+ SimpleBitstreamCursor R(Lengths);
StringRef Strings = Blob.drop_front(StringsOffset);
do {
@@ -3759,9 +3758,12 @@ std::error_code BitcodeReader::parseBitcodeVersion() {
}
}
-
bool BitcodeReaderBase::readBlockInfo() {
- return Stream.ReadBlockInfoBlock();
+ Optional<BitstreamBlockInfo> NewBlockInfo = Stream.ReadBlockInfoBlock();
+ if (!NewBlockInfo)
+ return true;
+ BlockInfo = std::move(*NewBlockInfo);
+ return false;
}
std::error_code BitcodeReader::parseModule(uint64_t ResumeBit,
diff --git a/llvm/lib/Bitcode/Reader/BitstreamReader.cpp b/llvm/lib/Bitcode/Reader/BitstreamReader.cpp
index 0b549f7550f..f1237069f7b 100644
--- a/llvm/lib/Bitcode/Reader/BitstreamReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitstreamReader.cpp
@@ -18,14 +18,6 @@ using namespace llvm;
// BitstreamCursor implementation
//===----------------------------------------------------------------------===//
-void BitstreamCursor::freeState() {
- // Free all the Abbrevs.
- CurAbbrevs.clear();
-
- // Free all the Abbrevs in the block scope.
- BlockScope.clear();
-}
-
/// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter
/// the block, and return true if the block has an error.
bool BitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) {
@@ -34,10 +26,12 @@ bool BitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) {
BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
// Add the abbrevs specific to this block to the CurAbbrevs list.
- if (const BitstreamReader::BlockInfo *Info =
- getBitStreamReader()->getBlockInfo(BlockID)) {
- CurAbbrevs.insert(CurAbbrevs.end(), Info->Abbrevs.begin(),
- Info->Abbrevs.end());
+ if (BlockInfo) {
+ if (const BitstreamBlockInfo::BlockInfo *Info =
+ BlockInfo->getBlockInfo(BlockID)) {
+ CurAbbrevs.insert(CurAbbrevs.end(), Info->Abbrevs.begin(),
+ Info->Abbrevs.end());
+ }
}
// Get the codesize of this block.
@@ -318,15 +312,14 @@ void BitstreamCursor::ReadAbbrevRecord() {
CurAbbrevs.push_back(Abbv);
}
-bool BitstreamCursor::ReadBlockInfoBlock() {
- // We expect the client to read the block info block at most once.
- if (getBitStreamReader()->hasBlockInfoRecords())
- report_fatal_error("Duplicate read of block info block");
+Optional<BitstreamBlockInfo>
+BitstreamCursor::ReadBlockInfoBlock(bool ReadBlockInfoNames) {
+ if (EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) return None;
- if (EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) return true;
+ BitstreamBlockInfo NewBlockInfo;
SmallVector<uint64_t, 64> Record;
- BitstreamReader::BlockInfo *CurBlockInfo = nullptr;
+ BitstreamBlockInfo::BlockInfo *CurBlockInfo = nullptr;
// Read all the records for this module.
while (true) {
@@ -335,9 +328,9 @@ bool BitstreamCursor::ReadBlockInfoBlock() {
switch (Entry.Kind) {
case llvm::BitstreamEntry::SubBlock: // Handled for us already.
case llvm::BitstreamEntry::Error:
- return true;
+ return None;
case llvm::BitstreamEntry::EndBlock:
- return false;
+ return std::move(NewBlockInfo);
case llvm::BitstreamEntry::Record:
// The interesting case.
break;
@@ -345,7 +338,7 @@ bool BitstreamCursor::ReadBlockInfoBlock() {
// Read abbrev records, associate them with CurBID.
if (Entry.ID == bitc::DEFINE_ABBREV) {
- if (!CurBlockInfo) return true;
+ if (!CurBlockInfo) return None;
ReadAbbrevRecord();
// ReadAbbrevRecord installs the abbrev in CurAbbrevs. Move it to the
@@ -360,13 +353,12 @@ bool BitstreamCursor::ReadBlockInfoBlock() {
switch (readRecord(Entry.ID, Record)) {
default: break; // Default behavior, ignore unknown content.
case bitc::BLOCKINFO_CODE_SETBID:
- if (Record.size() < 1) return true;
- CurBlockInfo =
- &getBitStreamReader()->getOrCreateBlockInfo((unsigned)Record[0]);
+ if (Record.size() < 1) return None;
+ CurBlockInfo = &NewBlockInfo.getOrCreateBlockInfo((unsigned)Record[0]);
break;
case bitc::BLOCKINFO_CODE_BLOCKNAME: {
- if (!CurBlockInfo) return true;
- if (getBitStreamReader()->isIgnoringBlockInfoNames())
+ if (!CurBlockInfo) return None;
+ if (!ReadBlockInfoNames)
break; // Ignore name.
std::string Name;
for (unsigned i = 0, e = Record.size(); i != e; ++i)
@@ -375,8 +367,8 @@ bool BitstreamCursor::ReadBlockInfoBlock() {
break;
}
case bitc::BLOCKINFO_CODE_SETRECORDNAME: {
- if (!CurBlockInfo) return true;
- if (getBitStreamReader()->isIgnoringBlockInfoNames())
+ if (!CurBlockInfo) return None;
+ if (!ReadBlockInfoNames)
break; // Ignore name.
std::string Name;
for (unsigned i = 1, e = Record.size(); i != e; ++i)
OpenPOWER on IntegriCloud