Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- BitstreamReader.cpp - BitstreamReader implementation ---------------===// | 1 //===- NaClBitstreamReader.cpp --------------------------------------------===// |
| 2 // NaClBitstreamReader implementation | |
| 2 // | 3 // |
| 3 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
| 4 // | 5 // |
| 5 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
| 7 // | 8 // |
|
jvoung (off chromium)
2013/04/29 18:02:08
Should the merge script in native_client/pnacl/scr
Karl
2013/04/29 20:44:37
The problem (as I see it) is that the way I want t
| |
| 8 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
| 9 | 10 |
| 10 #include "llvm/Bitcode/BitstreamReader.h" | 11 #include "llvm/Bitcode/NaCl/NaClBitstreamReader.h" |
| 11 | 12 |
| 12 using namespace llvm; | 13 using namespace llvm; |
| 13 | 14 |
| 14 //===----------------------------------------------------------------------===// | 15 //===----------------------------------------------------------------------===// |
| 15 // BitstreamCursor implementation | 16 // NaClBitstreamCursor implementation |
| 16 //===----------------------------------------------------------------------===// | 17 //===----------------------------------------------------------------------===// |
| 17 | 18 |
| 18 void BitstreamCursor::operator=(const BitstreamCursor &RHS) { | 19 void NaClBitstreamCursor::operator=(const NaClBitstreamCursor &RHS) { |
| 19 freeState(); | 20 freeState(); |
| 20 | 21 |
| 21 BitStream = RHS.BitStream; | 22 BitStream = RHS.BitStream; |
| 22 NextChar = RHS.NextChar; | 23 NextChar = RHS.NextChar; |
| 23 CurWord = RHS.CurWord; | 24 CurWord = RHS.CurWord; |
| 24 BitsInCurWord = RHS.BitsInCurWord; | 25 BitsInCurWord = RHS.BitsInCurWord; |
| 25 CurCodeSize = RHS.CurCodeSize; | 26 CurCodeSize = RHS.CurCodeSize; |
| 26 | 27 |
| 27 // Copy abbreviations, and bump ref counts. | 28 // Copy abbreviations, and bump ref counts. |
| 28 CurAbbrevs = RHS.CurAbbrevs; | 29 CurAbbrevs = RHS.CurAbbrevs; |
| 29 for (size_t i = 0, e = CurAbbrevs.size(); i != e; ++i) | 30 for (size_t i = 0, e = CurAbbrevs.size(); i != e; ++i) |
| 30 CurAbbrevs[i]->addRef(); | 31 CurAbbrevs[i]->addRef(); |
| 31 | 32 |
| 32 // Copy block scope and bump ref counts. | 33 // Copy block scope and bump ref counts. |
| 33 BlockScope = RHS.BlockScope; | 34 BlockScope = RHS.BlockScope; |
| 34 for (size_t S = 0, e = BlockScope.size(); S != e; ++S) { | 35 for (size_t S = 0, e = BlockScope.size(); S != e; ++S) { |
| 35 std::vector<BitCodeAbbrev*> &Abbrevs = BlockScope[S].PrevAbbrevs; | 36 std::vector<BitCodeAbbrev*> &Abbrevs = BlockScope[S].PrevAbbrevs; |
| 36 for (size_t i = 0, e = Abbrevs.size(); i != e; ++i) | 37 for (size_t i = 0, e = Abbrevs.size(); i != e; ++i) |
| 37 Abbrevs[i]->addRef(); | 38 Abbrevs[i]->addRef(); |
| 38 } | 39 } |
| 39 } | 40 } |
| 40 | 41 |
| 41 void BitstreamCursor::freeState() { | 42 void NaClBitstreamCursor::freeState() { |
| 42 // Free all the Abbrevs. | 43 // Free all the Abbrevs. |
| 43 for (size_t i = 0, e = CurAbbrevs.size(); i != e; ++i) | 44 for (size_t i = 0, e = CurAbbrevs.size(); i != e; ++i) |
| 44 CurAbbrevs[i]->dropRef(); | 45 CurAbbrevs[i]->dropRef(); |
| 45 CurAbbrevs.clear(); | 46 CurAbbrevs.clear(); |
| 46 | 47 |
| 47 // Free all the Abbrevs in the block scope. | 48 // Free all the Abbrevs in the block scope. |
| 48 for (size_t S = 0, e = BlockScope.size(); S != e; ++S) { | 49 for (size_t S = 0, e = BlockScope.size(); S != e; ++S) { |
| 49 std::vector<BitCodeAbbrev*> &Abbrevs = BlockScope[S].PrevAbbrevs; | 50 std::vector<BitCodeAbbrev*> &Abbrevs = BlockScope[S].PrevAbbrevs; |
| 50 for (size_t i = 0, e = Abbrevs.size(); i != e; ++i) | 51 for (size_t i = 0, e = Abbrevs.size(); i != e; ++i) |
| 51 Abbrevs[i]->dropRef(); | 52 Abbrevs[i]->dropRef(); |
| 52 } | 53 } |
| 53 BlockScope.clear(); | 54 BlockScope.clear(); |
| 54 } | 55 } |
| 55 | 56 |
| 56 /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter | 57 /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter |
| 57 /// the block, and return true if the block has an error. | 58 /// the block, and return true if the block has an error. |
| 58 bool BitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) { | 59 bool NaClBitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) { |
| 59 // Save the current block's state on BlockScope. | 60 // Save the current block's state on BlockScope. |
| 60 BlockScope.push_back(Block(CurCodeSize)); | 61 BlockScope.push_back(Block(CurCodeSize)); |
| 61 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs); | 62 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs); |
| 62 | 63 |
| 63 // Add the abbrevs specific to this block to the CurAbbrevs list. | 64 // Add the abbrevs specific to this block to the CurAbbrevs list. |
| 64 if (const BitstreamReader::BlockInfo *Info = | 65 if (const NaClBitstreamReader::BlockInfo *Info = |
| 65 BitStream->getBlockInfo(BlockID)) { | 66 BitStream->getBlockInfo(BlockID)) { |
| 66 for (size_t i = 0, e = Info->Abbrevs.size(); i != e; ++i) { | 67 for (size_t i = 0, e = Info->Abbrevs.size(); i != e; ++i) { |
| 67 CurAbbrevs.push_back(Info->Abbrevs[i]); | 68 CurAbbrevs.push_back(Info->Abbrevs[i]); |
| 68 CurAbbrevs.back()->addRef(); | 69 CurAbbrevs.back()->addRef(); |
| 69 } | 70 } |
| 70 } | 71 } |
| 71 | 72 |
| 72 // Get the codesize of this block. | 73 // Get the codesize of this block. |
| 73 CurCodeSize = ReadVBR(bitc::CodeLenWidth); | 74 CurCodeSize = ReadVBR(bitc::CodeLenWidth); |
| 74 SkipToFourByteBoundary(); | 75 SkipToFourByteBoundary(); |
| 75 unsigned NumWords = Read(bitc::BlockSizeWidth); | 76 unsigned NumWords = Read(bitc::BlockSizeWidth); |
| 76 if (NumWordsP) *NumWordsP = NumWords; | 77 if (NumWordsP) *NumWordsP = NumWords; |
| 77 | 78 |
| 78 // Validate that this block is sane. | 79 // Validate that this block is sane. |
| 79 if (CurCodeSize == 0 || AtEndOfStream()) | 80 if (CurCodeSize == 0 || AtEndOfStream()) |
| 80 return true; | 81 return true; |
| 81 | 82 |
| 82 return false; | 83 return false; |
| 83 } | 84 } |
| 84 | 85 |
| 85 void BitstreamCursor::readAbbreviatedLiteral(const BitCodeAbbrevOp &Op, | 86 void NaClBitstreamCursor::readAbbreviatedLiteral( |
| 86 SmallVectorImpl<uint64_t> &Vals) { | 87 const BitCodeAbbrevOp &Op, |
| 88 SmallVectorImpl<uint64_t> &Vals) { | |
| 87 assert(Op.isLiteral() && "Not a literal"); | 89 assert(Op.isLiteral() && "Not a literal"); |
| 88 // If the abbrev specifies the literal value to use, use it. | 90 // If the abbrev specifies the literal value to use, use it. |
| 89 Vals.push_back(Op.getLiteralValue()); | 91 Vals.push_back(Op.getLiteralValue()); |
| 90 } | 92 } |
| 91 | 93 |
| 92 void BitstreamCursor::readAbbreviatedField(const BitCodeAbbrevOp &Op, | 94 void NaClBitstreamCursor::readAbbreviatedField( |
| 93 SmallVectorImpl<uint64_t> &Vals) { | 95 const BitCodeAbbrevOp &Op, |
| 96 SmallVectorImpl<uint64_t> &Vals) { | |
| 94 assert(!Op.isLiteral() && "Use ReadAbbreviatedLiteral for literals!"); | 97 assert(!Op.isLiteral() && "Use ReadAbbreviatedLiteral for literals!"); |
| 95 | 98 |
| 96 // Decode the value as we are commanded. | 99 // Decode the value as we are commanded. |
| 97 switch (Op.getEncoding()) { | 100 switch (Op.getEncoding()) { |
| 98 case BitCodeAbbrevOp::Array: | 101 case BitCodeAbbrevOp::Array: |
| 99 case BitCodeAbbrevOp::Blob: | 102 case BitCodeAbbrevOp::Blob: |
| 100 assert(0 && "Should not reach here"); | 103 assert(0 && "Should not reach here"); |
| 101 case BitCodeAbbrevOp::Fixed: | 104 case BitCodeAbbrevOp::Fixed: |
| 102 Vals.push_back(Read((unsigned)Op.getEncodingData())); | 105 Vals.push_back(Read((unsigned)Op.getEncodingData())); |
| 103 break; | 106 break; |
| 104 case BitCodeAbbrevOp::VBR: | 107 case BitCodeAbbrevOp::VBR: |
| 105 Vals.push_back(ReadVBR64((unsigned)Op.getEncodingData())); | 108 Vals.push_back(ReadVBR64((unsigned)Op.getEncodingData())); |
| 106 break; | 109 break; |
| 107 case BitCodeAbbrevOp::Char6: | 110 case BitCodeAbbrevOp::Char6: |
| 108 Vals.push_back(BitCodeAbbrevOp::DecodeChar6(Read(6))); | 111 Vals.push_back(BitCodeAbbrevOp::DecodeChar6(Read(6))); |
| 109 break; | 112 break; |
| 110 } | 113 } |
| 111 } | 114 } |
| 112 | 115 |
| 113 void BitstreamCursor::skipAbbreviatedField(const BitCodeAbbrevOp &Op) { | 116 void NaClBitstreamCursor::skipAbbreviatedField(const BitCodeAbbrevOp &Op) { |
| 114 assert(!Op.isLiteral() && "Use ReadAbbreviatedLiteral for literals!"); | 117 assert(!Op.isLiteral() && "Use ReadAbbreviatedLiteral for literals!"); |
| 115 | 118 |
| 116 // Decode the value as we are commanded. | 119 // Decode the value as we are commanded. |
| 117 switch (Op.getEncoding()) { | 120 switch (Op.getEncoding()) { |
| 118 case BitCodeAbbrevOp::Array: | 121 case BitCodeAbbrevOp::Array: |
| 119 case BitCodeAbbrevOp::Blob: | 122 case BitCodeAbbrevOp::Blob: |
| 120 assert(0 && "Should not reach here"); | 123 assert(0 && "Should not reach here"); |
| 121 case BitCodeAbbrevOp::Fixed: | 124 case BitCodeAbbrevOp::Fixed: |
| 122 (void)Read((unsigned)Op.getEncodingData()); | 125 (void)Read((unsigned)Op.getEncodingData()); |
| 123 break; | 126 break; |
| 124 case BitCodeAbbrevOp::VBR: | 127 case BitCodeAbbrevOp::VBR: |
| 125 (void)ReadVBR64((unsigned)Op.getEncodingData()); | 128 (void)ReadVBR64((unsigned)Op.getEncodingData()); |
| 126 break; | 129 break; |
| 127 case BitCodeAbbrevOp::Char6: | 130 case BitCodeAbbrevOp::Char6: |
| 128 (void)Read(6); | 131 (void)Read(6); |
| 129 break; | 132 break; |
| 130 } | 133 } |
| 131 } | 134 } |
| 132 | 135 |
| 133 | 136 |
| 134 | 137 |
| 135 /// skipRecord - Read the current record and discard it. | 138 /// skipRecord - Read the current record and discard it. |
| 136 void BitstreamCursor::skipRecord(unsigned AbbrevID) { | 139 void NaClBitstreamCursor::skipRecord(unsigned AbbrevID) { |
| 137 // Skip unabbreviated records by reading past their entries. | 140 // Skip unabbreviated records by reading past their entries. |
| 138 if (AbbrevID == bitc::UNABBREV_RECORD) { | 141 if (AbbrevID == bitc::UNABBREV_RECORD) { |
| 139 unsigned Code = ReadVBR(6); | 142 unsigned Code = ReadVBR(6); |
| 140 (void)Code; | 143 (void)Code; |
| 141 unsigned NumElts = ReadVBR(6); | 144 unsigned NumElts = ReadVBR(6); |
| 142 for (unsigned i = 0; i != NumElts; ++i) | 145 for (unsigned i = 0; i != NumElts; ++i) |
| 143 (void)ReadVBR64(6); | 146 (void)ReadVBR64(6); |
| 144 return; | 147 return; |
| 145 } | 148 } |
| 146 | 149 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 if (!canSkipToPos(NewEnd/8)) { | 187 if (!canSkipToPos(NewEnd/8)) { |
| 185 NextChar = BitStream->getBitcodeBytes().getExtent(); | 188 NextChar = BitStream->getBitcodeBytes().getExtent(); |
| 186 break; | 189 break; |
| 187 } | 190 } |
| 188 | 191 |
| 189 // Skip over the blob. | 192 // Skip over the blob. |
| 190 JumpToBit(NewEnd); | 193 JumpToBit(NewEnd); |
| 191 } | 194 } |
| 192 } | 195 } |
| 193 | 196 |
| 194 unsigned BitstreamCursor::readRecord(unsigned AbbrevID, | 197 unsigned NaClBitstreamCursor::readRecord(unsigned AbbrevID, |
| 195 SmallVectorImpl<uint64_t> &Vals, | 198 SmallVectorImpl<uint64_t> &Vals, |
| 196 StringRef *Blob) { | 199 StringRef *Blob) { |
| 197 if (AbbrevID == bitc::UNABBREV_RECORD) { | 200 if (AbbrevID == bitc::UNABBREV_RECORD) { |
| 198 unsigned Code = ReadVBR(6); | 201 unsigned Code = ReadVBR(6); |
| 199 unsigned NumElts = ReadVBR(6); | 202 unsigned NumElts = ReadVBR(6); |
| 200 for (unsigned i = 0; i != NumElts; ++i) | 203 for (unsigned i = 0; i != NumElts; ++i) |
| 201 Vals.push_back(ReadVBR64(6)); | 204 Vals.push_back(ReadVBR64(6)); |
| 202 return Code; | 205 return Code; |
| 203 } | 206 } |
| 204 | 207 |
| 205 const BitCodeAbbrev *Abbv = getAbbrev(AbbrevID); | 208 const BitCodeAbbrev *Abbv = getAbbrev(AbbrevID); |
| 206 | 209 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 // Skip over tail padding. | 266 // Skip over tail padding. |
| 264 JumpToBit(NewEnd); | 267 JumpToBit(NewEnd); |
| 265 } | 268 } |
| 266 | 269 |
| 267 unsigned Code = (unsigned)Vals[0]; | 270 unsigned Code = (unsigned)Vals[0]; |
| 268 Vals.erase(Vals.begin()); | 271 Vals.erase(Vals.begin()); |
| 269 return Code; | 272 return Code; |
| 270 } | 273 } |
| 271 | 274 |
| 272 | 275 |
| 273 void BitstreamCursor::ReadAbbrevRecord() { | 276 void NaClBitstreamCursor::ReadAbbrevRecord() { |
| 274 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); | 277 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); |
| 275 unsigned NumOpInfo = ReadVBR(5); | 278 unsigned NumOpInfo = ReadVBR(5); |
| 276 for (unsigned i = 0; i != NumOpInfo; ++i) { | 279 for (unsigned i = 0; i != NumOpInfo; ++i) { |
| 277 bool IsLiteral = Read(1) ? true : false; | 280 bool IsLiteral = Read(1) ? true : false; |
| 278 if (IsLiteral) { | 281 if (IsLiteral) { |
| 279 Abbv->Add(BitCodeAbbrevOp(ReadVBR64(8))); | 282 Abbv->Add(BitCodeAbbrevOp(ReadVBR64(8))); |
| 280 continue; | 283 continue; |
| 281 } | 284 } |
| 282 | 285 |
| 283 BitCodeAbbrevOp::Encoding E = (BitCodeAbbrevOp::Encoding)Read(3); | 286 BitCodeAbbrevOp::Encoding E = (BitCodeAbbrevOp::Encoding)Read(3); |
| 284 if (BitCodeAbbrevOp::hasEncodingData(E)) { | 287 if (BitCodeAbbrevOp::hasEncodingData(E)) { |
| 285 unsigned Data = ReadVBR64(5); | 288 unsigned Data = ReadVBR64(5); |
| 286 | 289 |
| 287 // As a special case, handle fixed(0) (i.e., a fixed field with zero bits) | 290 // As a special case, handle fixed(0) (i.e., a fixed field with zero bits) |
| 288 // and vbr(0) as a literal zero. This is decoded the same way, and avoids | 291 // and vbr(0) as a literal zero. This is decoded the same way, and avoids |
| 289 // a slow path in Read() to have to handle reading zero bits. | 292 // a slow path in Read() to have to handle reading zero bits. |
| 290 if ((E == BitCodeAbbrevOp::Fixed || E == BitCodeAbbrevOp::VBR) && | 293 if ((E == BitCodeAbbrevOp::Fixed || E == BitCodeAbbrevOp::VBR) && |
| 291 Data == 0) { | 294 Data == 0) { |
| 292 Abbv->Add(BitCodeAbbrevOp(0)); | 295 Abbv->Add(BitCodeAbbrevOp(0)); |
| 293 continue; | 296 continue; |
| 294 } | 297 } |
| 295 | 298 |
| 296 Abbv->Add(BitCodeAbbrevOp(E, Data)); | 299 Abbv->Add(BitCodeAbbrevOp(E, Data)); |
| 297 } else | 300 } else |
| 298 Abbv->Add(BitCodeAbbrevOp(E)); | 301 Abbv->Add(BitCodeAbbrevOp(E)); |
| 299 } | 302 } |
| 300 CurAbbrevs.push_back(Abbv); | 303 CurAbbrevs.push_back(Abbv); |
| 301 } | 304 } |
| 302 | 305 |
| 303 bool BitstreamCursor::ReadBlockInfoBlock() { | 306 bool NaClBitstreamCursor::ReadBlockInfoBlock() { |
| 304 // If this is the second stream to get to the block info block, skip it. | 307 // If this is the second stream to get to the block info block, skip it. |
| 305 if (BitStream->hasBlockInfoRecords()) | 308 if (BitStream->hasBlockInfoRecords()) |
| 306 return SkipBlock(); | 309 return SkipBlock(); |
| 307 | 310 |
| 308 if (EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) return true; | 311 if (EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) return true; |
| 309 | 312 |
| 310 SmallVector<uint64_t, 64> Record; | 313 SmallVector<uint64_t, 64> Record; |
| 311 BitstreamReader::BlockInfo *CurBlockInfo = 0; | 314 NaClBitstreamReader::BlockInfo *CurBlockInfo = 0; |
| 312 | 315 |
| 313 // Read all the records for this module. | 316 // Read all the records for this module. |
| 314 while (1) { | 317 while (1) { |
| 315 BitstreamEntry Entry = advanceSkippingSubblocks(AF_DontAutoprocessAbbrevs); | 318 BitstreamEntry Entry = advanceSkippingSubblocks(AF_DontAutoprocessAbbrevs); |
| 316 | 319 |
| 317 switch (Entry.Kind) { | 320 switch (Entry.Kind) { |
| 318 case llvm::BitstreamEntry::SubBlock: // Handled for us already. | 321 case llvm::BitstreamEntry::SubBlock: // Handled for us already. |
| 319 case llvm::BitstreamEntry::Error: | 322 case llvm::BitstreamEntry::Error: |
| 320 return true; | 323 return true; |
| 321 case llvm::BitstreamEntry::EndBlock: | 324 case llvm::BitstreamEntry::EndBlock: |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 361 std::string Name; | 364 std::string Name; |
| 362 for (unsigned i = 1, e = Record.size(); i != e; ++i) | 365 for (unsigned i = 1, e = Record.size(); i != e; ++i) |
| 363 Name += (char)Record[i]; | 366 Name += (char)Record[i]; |
| 364 CurBlockInfo->RecordNames.push_back(std::make_pair((unsigned)Record[0], | 367 CurBlockInfo->RecordNames.push_back(std::make_pair((unsigned)Record[0], |
| 365 Name)); | 368 Name)); |
| 366 break; | 369 break; |
| 367 } | 370 } |
| 368 } | 371 } |
| 369 } | 372 } |
| 370 } | 373 } |
| 371 | |
| OLD | NEW |