1312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner//===- BitstreamReader.cpp - BitstreamReader implementation ---------------===// 2312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// 3312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// The LLVM Compiler Infrastructure 4312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// 5312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// This file is distributed under the University of Illinois Open Source 6312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// License. See LICENSE.TXT for details. 7312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// 8312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner//===----------------------------------------------------------------------===// 9312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 10312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner#include "llvm/Bitcode/BitstreamReader.h" 11312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 12312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattnerusing namespace llvm; 13312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 14312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner//===----------------------------------------------------------------------===// 15312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner// BitstreamCursor implementation 16312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner//===----------------------------------------------------------------------===// 17312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 18312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattnervoid BitstreamCursor::freeState() { 19312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Free all the Abbrevs. 20312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner CurAbbrevs.clear(); 21acb6194f93440425776cdd730a2726fd95499505Joe Abbey 22312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Free all the Abbrevs in the block scope. 23312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner BlockScope.clear(); 24312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner} 25312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 26312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner/// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter 27312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner/// the block, and return true if the block has an error. 28312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattnerbool BitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) { 29312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Save the current block's state on BlockScope. 30312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner BlockScope.push_back(Block(CurCodeSize)); 31312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner BlockScope.back().PrevAbbrevs.swap(CurAbbrevs); 32acb6194f93440425776cdd730a2726fd95499505Joe Abbey 33312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Add the abbrevs specific to this block to the CurAbbrevs list. 34312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (const BitstreamReader::BlockInfo *Info = 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getBitStreamReader()->getBlockInfo(BlockID)) { 3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurAbbrevs.insert(CurAbbrevs.end(), Info->Abbrevs.begin(), 3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Info->Abbrevs.end()); 38312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 39acb6194f93440425776cdd730a2726fd95499505Joe Abbey 40312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Get the codesize of this block. 41312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner CurCodeSize = ReadVBR(bitc::CodeLenWidth); 426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // We can't read more than MaxChunkSize at a time 436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (CurCodeSize > MaxChunkSize) 446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return true; 456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 46fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner SkipToFourByteBoundary(); 47312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner unsigned NumWords = Read(bitc::BlockSizeWidth); 48312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (NumWordsP) *NumWordsP = NumWords; 49acb6194f93440425776cdd730a2726fd95499505Joe Abbey 50312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Validate that this block is sane. 516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return CurCodeSize == 0 || AtEndOfStream(); 52312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner} 53312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic uint64_t readAbbreviatedField(BitstreamCursor &Cursor, 5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const BitCodeAbbrevOp &Op) { 5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!Op.isLiteral() && "Not to be used with literals!"); 57acb6194f93440425776cdd730a2726fd95499505Joe Abbey 58f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Decode the value as we are commanded. 59f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner switch (Op.getEncoding()) { 60f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Array: 61f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Blob: 62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines llvm_unreachable("Should not reach here"); 63f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Fixed: 646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return Cursor.Read((unsigned)Op.getEncodingData()); 66f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::VBR: 676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return Cursor.ReadVBR64((unsigned)Op.getEncodingData()); 69f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Char6: 7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return BitCodeAbbrevOp::DecodeChar6(Cursor.Read(6)); 71f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm_unreachable("invalid abbreviation encoding"); 73f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner} 74f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic void skipAbbreviatedField(BitstreamCursor &Cursor, 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const BitCodeAbbrevOp &Op) { 7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!Op.isLiteral() && "Not to be used with literals!"); 78acb6194f93440425776cdd730a2726fd95499505Joe Abbey 79f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Decode the value as we are commanded. 80f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner switch (Op.getEncoding()) { 81f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Array: 82f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Blob: 83c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines llvm_unreachable("Should not reach here"); 84f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Fixed: 856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 8637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Cursor.Read((unsigned)Op.getEncodingData()); 87f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner break; 88f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::VBR: 896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Cursor.ReadVBR64((unsigned)Op.getEncodingData()); 91f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner break; 92f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner case BitCodeAbbrevOp::Char6: 9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Cursor.Read(6); 94f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner break; 95f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 96f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner} 97f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner 98f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner 99f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner 100f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner/// skipRecord - Read the current record and discard it. 101f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattnervoid BitstreamCursor::skipRecord(unsigned AbbrevID) { 102f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Skip unabbreviated records by reading past their entries. 103f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner if (AbbrevID == bitc::UNABBREV_RECORD) { 104f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner unsigned Code = ReadVBR(6); 105f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner (void)Code; 106f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner unsigned NumElts = ReadVBR(6); 107f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner for (unsigned i = 0; i != NumElts; ++i) 108f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner (void)ReadVBR64(6); 109f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner return; 110f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 111f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner 112f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner const BitCodeAbbrev *Abbv = getAbbrev(AbbrevID); 113acb6194f93440425776cdd730a2726fd95499505Joe Abbey 114f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) { 115f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i); 116f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner if (Op.isLiteral()) 117f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner continue; 118acb6194f93440425776cdd730a2726fd95499505Joe Abbey 119f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner if (Op.getEncoding() != BitCodeAbbrevOp::Array && 120f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner Op.getEncoding() != BitCodeAbbrevOp::Blob) { 12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines skipAbbreviatedField(*this, Op); 122f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner continue; 123f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 124acb6194f93440425776cdd730a2726fd95499505Joe Abbey 125f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner if (Op.getEncoding() == BitCodeAbbrevOp::Array) { 126f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Array case. Read the number of elements as a vbr6. 127f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner unsigned NumElts = ReadVBR(6); 128acb6194f93440425776cdd730a2726fd95499505Joe Abbey 129f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Get the element encoding. 130f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner assert(i+2 == e && "array op not second to last?"); 131f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i); 132acb6194f93440425776cdd730a2726fd95499505Joe Abbey 133f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Read all the elements. 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Decode the value as we are commanded. 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar switch (EltEnc.getEncoding()) { 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar default: 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error("Array element type can't be an Array or a Blob"); 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case BitCodeAbbrevOp::Fixed: 139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert((unsigned)Op.getEncodingData() <= MaxChunkSize); 140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (; NumElts; --NumElts) 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Read((unsigned)EltEnc.getEncodingData()); 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case BitCodeAbbrevOp::VBR: 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert((unsigned)Op.getEncodingData() <= MaxChunkSize); 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (; NumElts; --NumElts) 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ReadVBR64((unsigned)EltEnc.getEncodingData()); 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case BitCodeAbbrevOp::Char6: 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (; NumElts; --NumElts) 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Read(6); 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 153f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner continue; 154f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 155acb6194f93440425776cdd730a2726fd95499505Joe Abbey 156f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner assert(Op.getEncoding() == BitCodeAbbrevOp::Blob); 157f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Blob case. Read the number of bytes as a vbr6. 158f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner unsigned NumElts = ReadVBR(6); 159fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner SkipToFourByteBoundary(); // 32-bit alignment 160acb6194f93440425776cdd730a2726fd95499505Joe Abbey 161f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Figure out where the end of this blob will be including tail padding. 16247543a8a66fb9451126f134808b55853aca57e1cChris Lattner size_t NewEnd = GetCurrentBitNo()+((NumElts+3)&~3)*8; 163acb6194f93440425776cdd730a2726fd95499505Joe Abbey 164f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // If this would read off the end of the bitcode file, just set the 165f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // record to empty and return. 16647543a8a66fb9451126f134808b55853aca57e1cChris Lattner if (!canSkipToPos(NewEnd/8)) { 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar skipToEnd(); 168f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner break; 169f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 170acb6194f93440425776cdd730a2726fd95499505Joe Abbey 171f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner // Skip over the blob. 17247543a8a66fb9451126f134808b55853aca57e1cChris Lattner JumpToBit(NewEnd); 173f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner } 174f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner} 175312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 176194ef24dfedf62642c853a851db4d7e528d27460Chris Lattnerunsigned BitstreamCursor::readRecord(unsigned AbbrevID, 177312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner SmallVectorImpl<uint64_t> &Vals, 178194ef24dfedf62642c853a851db4d7e528d27460Chris Lattner StringRef *Blob) { 179312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (AbbrevID == bitc::UNABBREV_RECORD) { 180312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner unsigned Code = ReadVBR(6); 181312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner unsigned NumElts = ReadVBR(6); 182312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner for (unsigned i = 0; i != NumElts; ++i) 183312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Vals.push_back(ReadVBR64(6)); 184312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner return Code; 185312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 186acb6194f93440425776cdd730a2726fd95499505Joe Abbey 187312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner const BitCodeAbbrev *Abbv = getAbbrev(AbbrevID); 188acb6194f93440425776cdd730a2726fd95499505Joe Abbey 1891197e38f3338b8db76f0fa38c2687c65b2bcea5cJordan Rose // Read the record code first. 1901197e38f3338b8db76f0fa38c2687c65b2bcea5cJordan Rose assert(Abbv->getNumOperandInfos() != 0 && "no record code in abbreviation?"); 1911197e38f3338b8db76f0fa38c2687c65b2bcea5cJordan Rose const BitCodeAbbrevOp &CodeOp = Abbv->getOperandInfo(0); 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Code; 1931197e38f3338b8db76f0fa38c2687c65b2bcea5cJordan Rose if (CodeOp.isLiteral()) 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Code = CodeOp.getLiteralValue(); 195ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines else { 196ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (CodeOp.getEncoding() == BitCodeAbbrevOp::Array || 197ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CodeOp.getEncoding() == BitCodeAbbrevOp::Blob) 198ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines report_fatal_error("Abbreviation starts with an Array or a Blob"); 19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Code = readAbbreviatedField(*this, CodeOp); 200ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 2011197e38f3338b8db76f0fa38c2687c65b2bcea5cJordan Rose 2021197e38f3338b8db76f0fa38c2687c65b2bcea5cJordan Rose for (unsigned i = 1, e = Abbv->getNumOperandInfos(); i != e; ++i) { 203312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i); 204312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (Op.isLiteral()) { 20537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Vals.push_back(Op.getLiteralValue()); 206312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner continue; 207312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 208acb6194f93440425776cdd730a2726fd95499505Joe Abbey 209312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (Op.getEncoding() != BitCodeAbbrevOp::Array && 210312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Op.getEncoding() != BitCodeAbbrevOp::Blob) { 21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Vals.push_back(readAbbreviatedField(*this, Op)); 212312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner continue; 213312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 214acb6194f93440425776cdd730a2726fd95499505Joe Abbey 215312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (Op.getEncoding() == BitCodeAbbrevOp::Array) { 216312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Array case. Read the number of elements as a vbr6. 217312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner unsigned NumElts = ReadVBR(6); 218acb6194f93440425776cdd730a2726fd95499505Joe Abbey 219312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Get the element encoding. 2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (i + 2 != e) 2216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar report_fatal_error("Array op not second to last"); 222312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i); 2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!EltEnc.isEncoding()) 2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar report_fatal_error( 2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "Array element type has to be an encoding of a type"); 226acb6194f93440425776cdd730a2726fd95499505Joe Abbey 227312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Read all the elements. 228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar switch (EltEnc.getEncoding()) { 229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar default: 230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error("Array element type can't be an Array or a Blob"); 231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case BitCodeAbbrevOp::Fixed: 232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (; NumElts; --NumElts) 233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Vals.push_back(Read((unsigned)EltEnc.getEncodingData())); 234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; 235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case BitCodeAbbrevOp::VBR: 236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (; NumElts; --NumElts) 237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Vals.push_back(ReadVBR64((unsigned)EltEnc.getEncodingData())); 238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; 239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case BitCodeAbbrevOp::Char6: 240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (; NumElts; --NumElts) 241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Vals.push_back(BitCodeAbbrevOp::DecodeChar6(Read(6))); 242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 243312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner continue; 244312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 245acb6194f93440425776cdd730a2726fd95499505Joe Abbey 246312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner assert(Op.getEncoding() == BitCodeAbbrevOp::Blob); 247312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Blob case. Read the number of bytes as a vbr6. 248312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner unsigned NumElts = ReadVBR(6); 249fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner SkipToFourByteBoundary(); // 32-bit alignment 250acb6194f93440425776cdd730a2726fd95499505Joe Abbey 251312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Figure out where the end of this blob will be including tail padding. 25247543a8a66fb9451126f134808b55853aca57e1cChris Lattner size_t CurBitPos = GetCurrentBitNo(); 25347543a8a66fb9451126f134808b55853aca57e1cChris Lattner size_t NewEnd = CurBitPos+((NumElts+3)&~3)*8; 254acb6194f93440425776cdd730a2726fd95499505Joe Abbey 255312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // If this would read off the end of the bitcode file, just set the 256312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // record to empty and return. 25747543a8a66fb9451126f134808b55853aca57e1cChris Lattner if (!canSkipToPos(NewEnd/8)) { 258312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Vals.append(NumElts, 0); 259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar skipToEnd(); 260312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner break; 261312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 262acb6194f93440425776cdd730a2726fd95499505Joe Abbey 263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Otherwise, inform the streamer that we need these bytes in memory. Skip 264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // over tail padding first, in case jumping to NewEnd invalidates the Blob 265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // pointer. 266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar JumpToBit(NewEnd); 267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const char *Ptr = (const char *)getPointerToBit(CurBitPos, NumElts); 268acb6194f93440425776cdd730a2726fd95499505Joe Abbey 26969582cf6c46456ad542df5aa09c47700c9525645Chris Lattner // If we can return a reference to the data, do so to avoid copying it. 270194ef24dfedf62642c853a851db4d7e528d27460Chris Lattner if (Blob) { 27169582cf6c46456ad542df5aa09c47700c9525645Chris Lattner *Blob = StringRef(Ptr, NumElts); 272312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } else { 27369582cf6c46456ad542df5aa09c47700c9525645Chris Lattner // Otherwise, unpack into Vals with zero extension. 27447543a8a66fb9451126f134808b55853aca57e1cChris Lattner for (; NumElts; --NumElts) 27569582cf6c46456ad542df5aa09c47700c9525645Chris Lattner Vals.push_back((unsigned char)*Ptr++); 276312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 277312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 278acb6194f93440425776cdd730a2726fd95499505Joe Abbey 279312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner return Code; 280312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner} 281312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 282312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 283312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattnervoid BitstreamCursor::ReadAbbrevRecord() { 284312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 285312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner unsigned NumOpInfo = ReadVBR(5); 286312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner for (unsigned i = 0; i != NumOpInfo; ++i) { 2874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar bool IsLiteral = Read(1); 288312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (IsLiteral) { 289312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Abbv->Add(BitCodeAbbrevOp(ReadVBR64(8))); 290312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner continue; 291312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 292acb6194f93440425776cdd730a2726fd95499505Joe Abbey 293312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner BitCodeAbbrevOp::Encoding E = (BitCodeAbbrevOp::Encoding)Read(3); 294b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner if (BitCodeAbbrevOp::hasEncodingData(E)) { 295ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines uint64_t Data = ReadVBR64(5); 296b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner 297b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner // As a special case, handle fixed(0) (i.e., a fixed field with zero bits) 298b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner // and vbr(0) as a literal zero. This is decoded the same way, and avoids 299b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner // a slow path in Read() to have to handle reading zero bits. 300b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner if ((E == BitCodeAbbrevOp::Fixed || E == BitCodeAbbrevOp::VBR) && 301b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner Data == 0) { 302b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner Abbv->Add(BitCodeAbbrevOp(0)); 303b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner continue; 304b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner } 305ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 3066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if ((E == BitCodeAbbrevOp::Fixed || E == BitCodeAbbrevOp::VBR) && 3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Data > MaxChunkSize) 3086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar report_fatal_error( 3096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "Fixed or VBR abbrev record with size > MaxChunkData"); 3106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 311b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner Abbv->Add(BitCodeAbbrevOp(E, Data)); 312b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner } else 313312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Abbv->Add(BitCodeAbbrevOp(E)); 314312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 3156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Abbv->getNumOperandInfos() == 0) 3176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar report_fatal_error("Abbrev record with no operands"); 318312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner CurAbbrevs.push_back(Abbv); 319312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner} 320312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 321312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattnerbool BitstreamCursor::ReadBlockInfoBlock() { 322312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // If this is the second stream to get to the block info block, skip it. 323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getBitStreamReader()->hasBlockInfoRecords()) 324312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner return SkipBlock(); 325acb6194f93440425776cdd730a2726fd95499505Joe Abbey 326312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) return true; 327acb6194f93440425776cdd730a2726fd95499505Joe Abbey 328312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner SmallVector<uint64_t, 64> Record; 329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines BitstreamReader::BlockInfo *CurBlockInfo = nullptr; 330acb6194f93440425776cdd730a2726fd95499505Joe Abbey 331312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Read all the records for this module. 332312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner while (1) { 3335a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner BitstreamEntry Entry = advanceSkippingSubblocks(AF_DontAutoprocessAbbrevs); 334acb6194f93440425776cdd730a2726fd95499505Joe Abbey 3355a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner switch (Entry.Kind) { 3365a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 3375a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner case llvm::BitstreamEntry::Error: 3385a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner return true; 3395a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner case llvm::BitstreamEntry::EndBlock: 3405a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner return false; 3415a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner case llvm::BitstreamEntry::Record: 3425a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner // The interesting case. 3435a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner break; 3445a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner } 3455a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner 346312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Read abbrev records, associate them with CurBID. 3475a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner if (Entry.ID == bitc::DEFINE_ABBREV) { 348312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (!CurBlockInfo) return true; 349312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner ReadAbbrevRecord(); 350acb6194f93440425776cdd730a2726fd95499505Joe Abbey 351312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // ReadAbbrevRecord installs the abbrev in CurAbbrevs. Move it to the 352312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // appropriate BlockInfo. 35337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurBlockInfo->Abbrevs.push_back(std::move(CurAbbrevs.back())); 354312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner CurAbbrevs.pop_back(); 355312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner continue; 356312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 357acb6194f93440425776cdd730a2726fd95499505Joe Abbey 358312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner // Read a record. 359312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Record.clear(); 3605a4251c767adb7a47ad7a53719398ee1342cc400Chris Lattner switch (readRecord(Entry.ID, Record)) { 361312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner default: break; // Default behavior, ignore unknown content. 362312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner case bitc::BLOCKINFO_CODE_SETBID: 363312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (Record.size() < 1) return true; 364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CurBlockInfo = 365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar &getBitStreamReader()->getOrCreateBlockInfo((unsigned)Record[0]); 366312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner break; 367312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner case bitc::BLOCKINFO_CODE_BLOCKNAME: { 368312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (!CurBlockInfo) return true; 369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getBitStreamReader()->isIgnoringBlockInfoNames()) 370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; // Ignore name. 371312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner std::string Name; 372312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner for (unsigned i = 0, e = Record.size(); i != e; ++i) 373312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Name += (char)Record[i]; 374312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner CurBlockInfo->Name = Name; 375312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner break; 376312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 377312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner case bitc::BLOCKINFO_CODE_SETRECORDNAME: { 378312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner if (!CurBlockInfo) return true; 379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getBitStreamReader()->isIgnoringBlockInfoNames()) 380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar break; // Ignore name. 381312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner std::string Name; 382312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner for (unsigned i = 1, e = Record.size(); i != e; ++i) 383312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Name += (char)Record[i]; 384312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner CurBlockInfo->RecordNames.push_back(std::make_pair((unsigned)Record[0], 385312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner Name)); 386312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner break; 387312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 388312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 389312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner } 390312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner} 391312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner 392