Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Unified Diff: lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp

Issue 1798243002: Fix the block stack used by the bitstream cursor. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp
index bdb7255f12c80ff33722b7f1c4b584247f70c5c4..6a27c1626bab39e35c77749511487b81ce900f7e 100644
--- a/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp
+++ b/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp
@@ -54,21 +54,6 @@ Fatal(const std::string &ErrorMessage) const {
report_fatal_error(StrBuf.str());
}
-void NaClBitstreamCursor::freeState() {
- // Free all the Abbrevs.
- for (size_t i = 0, e = CurAbbrevs.size(); i != e; ++i)
- CurAbbrevs[i]->dropRef();
- CurAbbrevs.clear();
-
- // Free all the Abbrevs in the block scope.
- for (size_t S = 0, e = BlockScope.size(); S != e; ++S) {
- std::vector<NaClBitCodeAbbrev*> &Abbrevs = BlockScope[S].PrevAbbrevs;
- for (size_t i = 0, e = Abbrevs.size(); i != e; ++i)
- Abbrevs[i]->dropRef();
- }
- BlockScope.clear();
-}
-
void NaClBitstreamCursor::reportInvalidAbbrevNumber(unsigned AbbrevNo) const {
std::string Buffer;
raw_string_ostream StrBuf(Buffer);
@@ -86,28 +71,17 @@ void NaClBitstreamCursor::reportInvalidJumpToBit(uint64_t BitNo) const {
/// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter
/// the block, and return true if the block has an error.
bool NaClBitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) {
- // Save the current block's state on BlockScope.
- BlockScope.push_back(Block(CurCodeSize));
- BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
-
- // Add the abbrevs specific to this block to the CurAbbrevs list.
- if (const NaClBitstreamReader::BlockInfo *Info =
- BitStream->getBlockInfo(BlockID)) {
- for (size_t i = 0, e = Info->Abbrevs.size(); i != e; ++i) {
- CurAbbrevs.push_back(Info->Abbrevs[i]);
- CurAbbrevs.back()->addRef();
- }
- }
-
- // Get the codesize of this block.
- CurCodeSize.IsFixed = true;
- CurCodeSize.NumBits = ReadVBR(naclbitc::CodeLenWidth);
+ constexpr bool IsFixed = true;
Jim Stichnoth 2016/03/14 22:46:49 I think LLVM is still generally not using constexp
Karl 2016/03/15 20:29:41 Done.
+ NaClBitcodeSelectorAbbrev
+ CodeAbbrev(IsFixed, ReadVBR(naclbitc::CodeLenWidth));
+ BlockScope.push_back(Block(&BitStream->getOrCreateBlockInfo(BlockID),
+ CodeAbbrev));
SkipToFourByteBoundary();
unsigned NumWords = Read(naclbitc::BlockSizeWidth);
if (NumWordsP) *NumWordsP = NumWords;
// Validate that this block is sane.
- if (CurCodeSize.NumBits == 0 || AtEndOfStream())
+ if (BlockScope.back().getCodeAbbrev().NumBits == 0 || AtEndOfStream())
return true;
return false;
@@ -332,7 +306,7 @@ void NaClBitstreamCursor::ReadAbbrevRecord(bool IsLocal,
SkipToByteBoundaryIfAligned();
if (!Abbv->isValid())
ErrHandler->Fatal("Invalid abbreviation specified in bitcode file");
- CurAbbrevs.push_back(Abbv);
+ BlockScope.back().addNewLocalAbbrev(Abbv);
if (Listener) {
Listener->ProcessAbbreviation(Abbv, IsLocal);
// Reset record information of the listener.
@@ -359,16 +333,21 @@ void NaClBitstreamCursor::SkipAbbrevRecord() {
bool NaClBitstreamCursor::ReadBlockInfoBlock(NaClAbbrevListener *Listener) {
// If this is the second stream to get to the block info block, skip it.
- if (BitStream->hasBlockInfoRecords())
+ if (BitStream->HasReadBlockInfoBlock)
return SkipBlock();
+ BitStream->HasReadBlockInfoBlock = true;
+
unsigned NumWords;
if (EnterSubBlock(naclbitc::BLOCKINFO_BLOCK_ID, &NumWords)) return true;
if (Listener) Listener->BeginBlockInfoBlock(NumWords);
NaClBitcodeRecordVector Record;
- NaClBitstreamReader::BlockInfo *CurBlockInfo = 0;
+ Block &CurBlock = BlockScope.back();
+ NaClBitstreamReader::AbbrevList *UpdateAbbrevs =
+ &CurBlock.GlobalAbbrevs->getAbbrevs();
+ bool FoundSetBID = false;
// Read records of the BlockInfo block.
while (1) {
@@ -389,15 +368,19 @@ bool NaClBitstreamCursor::ReadBlockInfoBlock(NaClAbbrevListener *Listener) {
// Read abbrev records, associate them with CurBID.
if (Entry.ID == naclbitc::DEFINE_ABBREV) {
- if (!CurBlockInfo) return true;
ReadAbbrevRecord(false, Listener);
- // ReadAbbrevRecord installs the abbrev in CurAbbrevs. Move it to the
- // appropriate BlockInfo.
- NaClBitCodeAbbrev *Abbv = CurAbbrevs.back();
- CurAbbrevs.pop_back();
- CurBlockInfo->Abbrevs.push_back(Abbv);
- continue;
+ // ReadAbbrevRecord installs as local abbreviation. Move it to
Jim Stichnoth 2016/03/14 22:46:49 s/as/a/ ?
Karl 2016/03/15 20:29:41 Done.
+ // the appropriate BlockInfo if the corresponding SetBID record
Jim Stichnoth 2016/03/14 22:46:49 reflow comment to 80-col
Karl 2016/03/15 20:29:41 Done.
+ // has been found.
+ if (FoundSetBID) {
+ NaClBitstreamReader::AbbrevListVector &LocalAbbrevs =
+ CurBlock.LocalAbbrevs.Abbrevs;
+ NaClBitCodeAbbrev *Abbv = LocalAbbrevs.back();
+ LocalAbbrevs.pop_back();
+ UpdateAbbrevs->push_back(Abbv);
+ continue;
+ }
}
// Read a record.
@@ -408,7 +391,9 @@ bool NaClBitstreamCursor::ReadBlockInfoBlock(NaClAbbrevListener *Listener) {
return true;
case naclbitc::BLOCKINFO_CODE_SETBID:
if (Record.size() < 1) return true;
- CurBlockInfo = &BitStream->getOrCreateBlockInfo((unsigned)Record[0]);
+ FoundSetBID = true;
+ UpdateAbbrevs =
+ &BitStream->getOrCreateBlockInfo((unsigned)Record[0]).getAbbrevs();
if (Listener) {
Listener->Values = Record;
Listener->SetBID();

Powered by Google App Engine
This is Rietveld 408576698