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..87e8de4bec75aefc80e400576bc40857b4285f39 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,49 @@ 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; |
+ |
+} // end of anonymous namespace |
John
2016/03/29 16:27:10
is this annotation part of the llvm coding style?
Karl
2016/03/29 20:10:47
There is a similar comment at the beginning of the
|
+ |
+NaClBitstreamReader::BlockInfoRecordsMap:: |
+BlockInfoRecordsMap() : Infos(InfosBucketSize), IsFrozen(false) { |
+ for (size_t i = 0; i < array_lengthof(ValidBlockIDs); ++i) { |
John
2016/03/29 16:27:10
you can use for each loops for static array !!!! (
Karl
2016/03/29 20:10:47
Done.
|
+ unsigned BlockID = ValidBlockIDs[i]; |
+ 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 +421,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(); |