Chromium Code Reviews| Index: lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
| diff --git a/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
| index bd43d0b390e8edad754de9a8a8d7b6ad184a89d3..e93be2a5ce856177a04b5fdd746549960e0339f9 100644 |
| --- a/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
| +++ b/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
| @@ -49,8 +49,7 @@ Fatal(const std::string &ErrorMessage) const { |
| // the error occurred. |
| std::string Buffer; |
| raw_string_ostream StrBuf(Buffer); |
| - naclbitc::ErrorAt(StrBuf, naclbitc::Fatal, Cursor.GetCurrentBitNo()) |
| - << ErrorMessage; |
| + naclbitc::ErrorAt(StrBuf, naclbitc::Fatal, getCurrentBitNo()) << ErrorMessage; |
| report_fatal_error(StrBuf.str()); |
| } |
| @@ -74,8 +73,7 @@ bool NaClBitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) { |
| const bool IsFixed = true; |
| NaClBitcodeSelectorAbbrev |
| CodeAbbrev(IsFixed, ReadVBR(naclbitc::CodeLenWidth)); |
| - BlockScope.push_back(Block(&BitStream->getOrCreateBlockInfo(BlockID), |
| - CodeAbbrev)); |
| + BlockScope.push_back(Block(&BitStream->getBlockInfo(BlockID), CodeAbbrev)); |
| SkipToFourByteBoundary(); |
| unsigned NumWords = Read(naclbitc::BlockSizeWidth); |
| if (NumWordsP) *NumWordsP = NumWords; |
| @@ -330,13 +328,47 @@ void NaClBitstreamCursor::SkipAbbrevRecord() { |
| SkipToByteBoundaryIfAligned(); |
| } |
| +namespace { |
| + |
| +unsigned ValidBlockIDs[] = { |
| + naclbitc::BLOCKINFO_BLOCK_ID, |
| + naclbitc::CONSTANTS_BLOCK_ID, |
| + naclbitc::FUNCTION_BLOCK_ID, |
| + naclbitc::GLOBALVAR_BLOCK_ID, |
| + naclbitc::MODULE_BLOCK_ID, |
| + naclbitc::TOP_LEVEL_BLOCKID, |
| + naclbitc::TYPE_BLOCK_ID_NEW, |
| + naclbitc::VALUE_SYMTAB_BLOCK_ID |
| +}; |
| + |
| +const size_t InfosBucketSize = 23; |
|
Jim Stichnoth
2016/03/29 19:47:18
Can you explain this magic constant?
Karl
2016/03/29 20:10:47
Not worth it. Removing the magic.
|
| + |
| +} // end of anonymous namespace |
| + |
| +NaClBitstreamReader::BlockInfoRecordsMap:: |
| +BlockInfoRecordsMap() : Infos(InfosBucketSize), IsFrozen(false) { |
| + for (size_t BlockID : ValidBlockIDs) |
| + Infos.emplace(BlockID, BlockInfo(BlockID)); |
| +} |
| + |
| +NaClBitstreamReader::BlockInfoRecordsMap::UpdateLock:: |
| +UpdateLock(BlockInfoRecordsMap &BlockInfoRecords) |
| + : BlockInfoRecords(BlockInfoRecords), Lock(BlockInfoRecords.Lock) |
| +{} |
| + |
| +NaClBitstreamReader::BlockInfoRecordsMap::UpdateLock:: |
| +~UpdateLock() { |
| + if (BlockInfoRecords.freeze()) |
| + report_fatal_error("Global abbreviations block frozen while building."); |
| +} |
| + |
| bool NaClBitstreamCursor::ReadBlockInfoBlock(NaClAbbrevListener *Listener) { |
| - // If this is the second stream to get to the block info block, skip it. |
| - if (BitStream->HasReadBlockInfoBlock) |
| + // If this is the second read of the block info block, skip it. |
| + if (BitStream->BlockInfoRecords->isFrozen()) |
| return SkipBlock(); |
| - BitStream->HasReadBlockInfoBlock = true; |
| - |
| + NaClBitstreamReader::BlockInfoRecordsMap::UpdateLock |
| + Lock(*BitStream->BlockInfoRecords); |
| unsigned NumWords; |
| if (EnterSubBlock(naclbitc::BLOCKINFO_BLOCK_ID, &NumWords)) return true; |
| @@ -387,7 +419,7 @@ bool NaClBitstreamCursor::ReadBlockInfoBlock(NaClAbbrevListener *Listener) { |
| if (Record.size() < 1) return true; |
| FoundSetBID = true; |
| UpdateAbbrevs = |
| - &BitStream->getOrCreateBlockInfo((unsigned)Record[0]).getAbbrevs(); |
| + &BitStream->getBlockInfo((unsigned)Record[0]).getAbbrevs(); |
| if (Listener) { |
| Listener->Values = Record; |
| Listener->SetBID(); |