1*e0308279SFrancis Visoiu Mistrih //===- BitstreamReader.cpp - BitstreamReader implementation ---------------===// 2*e0308279SFrancis Visoiu Mistrih // 3*e0308279SFrancis Visoiu Mistrih // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e0308279SFrancis Visoiu Mistrih // See https://llvm.org/LICENSE.txt for license information. 5*e0308279SFrancis Visoiu Mistrih // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e0308279SFrancis Visoiu Mistrih // 7*e0308279SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 8*e0308279SFrancis Visoiu Mistrih 9*e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamReader.h" 10*e0308279SFrancis Visoiu Mistrih #include "llvm/ADT/StringRef.h" 11*e0308279SFrancis Visoiu Mistrih #include <cassert> 12*e0308279SFrancis Visoiu Mistrih #include <string> 13*e0308279SFrancis Visoiu Mistrih 14*e0308279SFrancis Visoiu Mistrih using namespace llvm; 15*e0308279SFrancis Visoiu Mistrih 16*e0308279SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 17*e0308279SFrancis Visoiu Mistrih // BitstreamCursor implementation 18*e0308279SFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 19*e0308279SFrancis Visoiu Mistrih 20*e0308279SFrancis Visoiu Mistrih /// Having read the ENTER_SUBBLOCK abbrevid, enter the block. 21*e0308279SFrancis Visoiu Mistrih Error BitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) { 22*e0308279SFrancis Visoiu Mistrih // Save the current block's state on BlockScope. 23*e0308279SFrancis Visoiu Mistrih BlockScope.push_back(Block(CurCodeSize)); 24*e0308279SFrancis Visoiu Mistrih BlockScope.back().PrevAbbrevs.swap(CurAbbrevs); 25*e0308279SFrancis Visoiu Mistrih 26*e0308279SFrancis Visoiu Mistrih // Add the abbrevs specific to this block to the CurAbbrevs list. 27*e0308279SFrancis Visoiu Mistrih if (BlockInfo) { 28*e0308279SFrancis Visoiu Mistrih if (const BitstreamBlockInfo::BlockInfo *Info = 29*e0308279SFrancis Visoiu Mistrih BlockInfo->getBlockInfo(BlockID)) { 30*e0308279SFrancis Visoiu Mistrih CurAbbrevs.insert(CurAbbrevs.end(), Info->Abbrevs.begin(), 31*e0308279SFrancis Visoiu Mistrih Info->Abbrevs.end()); 32*e0308279SFrancis Visoiu Mistrih } 33*e0308279SFrancis Visoiu Mistrih } 34*e0308279SFrancis Visoiu Mistrih 35*e0308279SFrancis Visoiu Mistrih // Get the codesize of this block. 36*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeVBR = ReadVBR(bitc::CodeLenWidth); 37*e0308279SFrancis Visoiu Mistrih if (!MaybeVBR) 38*e0308279SFrancis Visoiu Mistrih return MaybeVBR.takeError(); 39*e0308279SFrancis Visoiu Mistrih CurCodeSize = MaybeVBR.get(); 40*e0308279SFrancis Visoiu Mistrih 41*e0308279SFrancis Visoiu Mistrih if (CurCodeSize > MaxChunkSize) 42*e0308279SFrancis Visoiu Mistrih return llvm::createStringError( 43*e0308279SFrancis Visoiu Mistrih std::errc::illegal_byte_sequence, 44*e0308279SFrancis Visoiu Mistrih "can't read more than %zu at a time, trying to read %u", +MaxChunkSize, 45*e0308279SFrancis Visoiu Mistrih CurCodeSize); 46*e0308279SFrancis Visoiu Mistrih 47*e0308279SFrancis Visoiu Mistrih SkipToFourByteBoundary(); 48*e0308279SFrancis Visoiu Mistrih Expected<word_t> MaybeNum = Read(bitc::BlockSizeWidth); 49*e0308279SFrancis Visoiu Mistrih if (!MaybeNum) 50*e0308279SFrancis Visoiu Mistrih return MaybeNum.takeError(); 51*e0308279SFrancis Visoiu Mistrih word_t NumWords = MaybeNum.get(); 52*e0308279SFrancis Visoiu Mistrih if (NumWordsP) 53*e0308279SFrancis Visoiu Mistrih *NumWordsP = NumWords; 54*e0308279SFrancis Visoiu Mistrih 55*e0308279SFrancis Visoiu Mistrih if (CurCodeSize == 0) 56*e0308279SFrancis Visoiu Mistrih return llvm::createStringError( 57*e0308279SFrancis Visoiu Mistrih std::errc::illegal_byte_sequence, 58*e0308279SFrancis Visoiu Mistrih "can't enter sub-block: current code size is 0"); 59*e0308279SFrancis Visoiu Mistrih if (AtEndOfStream()) 60*e0308279SFrancis Visoiu Mistrih return llvm::createStringError( 61*e0308279SFrancis Visoiu Mistrih std::errc::illegal_byte_sequence, 62*e0308279SFrancis Visoiu Mistrih "can't enter sub block: already at end of stream"); 63*e0308279SFrancis Visoiu Mistrih 64*e0308279SFrancis Visoiu Mistrih return Error::success(); 65*e0308279SFrancis Visoiu Mistrih } 66*e0308279SFrancis Visoiu Mistrih 67*e0308279SFrancis Visoiu Mistrih static Expected<uint64_t> readAbbreviatedField(BitstreamCursor &Cursor, 68*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &Op) { 69*e0308279SFrancis Visoiu Mistrih assert(!Op.isLiteral() && "Not to be used with literals!"); 70*e0308279SFrancis Visoiu Mistrih 71*e0308279SFrancis Visoiu Mistrih // Decode the value as we are commanded. 72*e0308279SFrancis Visoiu Mistrih switch (Op.getEncoding()) { 73*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Array: 74*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Blob: 75*e0308279SFrancis Visoiu Mistrih llvm_unreachable("Should not reach here"); 76*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Fixed: 77*e0308279SFrancis Visoiu Mistrih assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 78*e0308279SFrancis Visoiu Mistrih return Cursor.Read((unsigned)Op.getEncodingData()); 79*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::VBR: 80*e0308279SFrancis Visoiu Mistrih assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 81*e0308279SFrancis Visoiu Mistrih return Cursor.ReadVBR64((unsigned)Op.getEncodingData()); 82*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Char6: 83*e0308279SFrancis Visoiu Mistrih if (Expected<unsigned> Res = Cursor.Read(6)) 84*e0308279SFrancis Visoiu Mistrih return BitCodeAbbrevOp::DecodeChar6(Res.get()); 85*e0308279SFrancis Visoiu Mistrih else 86*e0308279SFrancis Visoiu Mistrih return Res.takeError(); 87*e0308279SFrancis Visoiu Mistrih } 88*e0308279SFrancis Visoiu Mistrih llvm_unreachable("invalid abbreviation encoding"); 89*e0308279SFrancis Visoiu Mistrih } 90*e0308279SFrancis Visoiu Mistrih 91*e0308279SFrancis Visoiu Mistrih static Error skipAbbreviatedField(BitstreamCursor &Cursor, 92*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &Op) { 93*e0308279SFrancis Visoiu Mistrih assert(!Op.isLiteral() && "Not to be used with literals!"); 94*e0308279SFrancis Visoiu Mistrih 95*e0308279SFrancis Visoiu Mistrih // Decode the value as we are commanded. 96*e0308279SFrancis Visoiu Mistrih switch (Op.getEncoding()) { 97*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Array: 98*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Blob: 99*e0308279SFrancis Visoiu Mistrih llvm_unreachable("Should not reach here"); 100*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Fixed: 101*e0308279SFrancis Visoiu Mistrih assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 102*e0308279SFrancis Visoiu Mistrih if (Expected<unsigned> Res = Cursor.Read((unsigned)Op.getEncodingData())) 103*e0308279SFrancis Visoiu Mistrih break; 104*e0308279SFrancis Visoiu Mistrih else 105*e0308279SFrancis Visoiu Mistrih return Res.takeError(); 106*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::VBR: 107*e0308279SFrancis Visoiu Mistrih assert((unsigned)Op.getEncodingData() <= Cursor.MaxChunkSize); 108*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> Res = 109*e0308279SFrancis Visoiu Mistrih Cursor.ReadVBR64((unsigned)Op.getEncodingData())) 110*e0308279SFrancis Visoiu Mistrih break; 111*e0308279SFrancis Visoiu Mistrih else 112*e0308279SFrancis Visoiu Mistrih return Res.takeError(); 113*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Char6: 114*e0308279SFrancis Visoiu Mistrih if (Expected<unsigned> Res = Cursor.Read(6)) 115*e0308279SFrancis Visoiu Mistrih break; 116*e0308279SFrancis Visoiu Mistrih else 117*e0308279SFrancis Visoiu Mistrih return Res.takeError(); 118*e0308279SFrancis Visoiu Mistrih } 119*e0308279SFrancis Visoiu Mistrih return ErrorSuccess(); 120*e0308279SFrancis Visoiu Mistrih } 121*e0308279SFrancis Visoiu Mistrih 122*e0308279SFrancis Visoiu Mistrih /// skipRecord - Read the current record and discard it. 123*e0308279SFrancis Visoiu Mistrih Expected<unsigned> BitstreamCursor::skipRecord(unsigned AbbrevID) { 124*e0308279SFrancis Visoiu Mistrih // Skip unabbreviated records by reading past their entries. 125*e0308279SFrancis Visoiu Mistrih if (AbbrevID == bitc::UNABBREV_RECORD) { 126*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeCode = ReadVBR(6); 127*e0308279SFrancis Visoiu Mistrih if (!MaybeCode) 128*e0308279SFrancis Visoiu Mistrih return MaybeCode.takeError(); 129*e0308279SFrancis Visoiu Mistrih unsigned Code = MaybeCode.get(); 130*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeVBR = ReadVBR(6); 131*e0308279SFrancis Visoiu Mistrih if (!MaybeVBR) 132*e0308279SFrancis Visoiu Mistrih return MaybeVBR.get(); 133*e0308279SFrancis Visoiu Mistrih unsigned NumElts = MaybeVBR.get(); 134*e0308279SFrancis Visoiu Mistrih for (unsigned i = 0; i != NumElts; ++i) 135*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> Res = ReadVBR64(6)) 136*e0308279SFrancis Visoiu Mistrih ; // Skip! 137*e0308279SFrancis Visoiu Mistrih else 138*e0308279SFrancis Visoiu Mistrih return Res.takeError(); 139*e0308279SFrancis Visoiu Mistrih return Code; 140*e0308279SFrancis Visoiu Mistrih } 141*e0308279SFrancis Visoiu Mistrih 142*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrev *Abbv = getAbbrev(AbbrevID); 143*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &CodeOp = Abbv->getOperandInfo(0); 144*e0308279SFrancis Visoiu Mistrih unsigned Code; 145*e0308279SFrancis Visoiu Mistrih if (CodeOp.isLiteral()) 146*e0308279SFrancis Visoiu Mistrih Code = CodeOp.getLiteralValue(); 147*e0308279SFrancis Visoiu Mistrih else { 148*e0308279SFrancis Visoiu Mistrih if (CodeOp.getEncoding() == BitCodeAbbrevOp::Array || 149*e0308279SFrancis Visoiu Mistrih CodeOp.getEncoding() == BitCodeAbbrevOp::Blob) 150*e0308279SFrancis Visoiu Mistrih return llvm::createStringError( 151*e0308279SFrancis Visoiu Mistrih std::errc::illegal_byte_sequence, 152*e0308279SFrancis Visoiu Mistrih "Abbreviation starts with an Array or a Blob"); 153*e0308279SFrancis Visoiu Mistrih Expected<uint64_t> MaybeCode = readAbbreviatedField(*this, CodeOp); 154*e0308279SFrancis Visoiu Mistrih if (!MaybeCode) 155*e0308279SFrancis Visoiu Mistrih return MaybeCode.takeError(); 156*e0308279SFrancis Visoiu Mistrih Code = MaybeCode.get(); 157*e0308279SFrancis Visoiu Mistrih } 158*e0308279SFrancis Visoiu Mistrih 159*e0308279SFrancis Visoiu Mistrih for (unsigned i = 1, e = Abbv->getNumOperandInfos(); i < e; ++i) { 160*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i); 161*e0308279SFrancis Visoiu Mistrih if (Op.isLiteral()) 162*e0308279SFrancis Visoiu Mistrih continue; 163*e0308279SFrancis Visoiu Mistrih 164*e0308279SFrancis Visoiu Mistrih if (Op.getEncoding() != BitCodeAbbrevOp::Array && 165*e0308279SFrancis Visoiu Mistrih Op.getEncoding() != BitCodeAbbrevOp::Blob) { 166*e0308279SFrancis Visoiu Mistrih if (Error Err = skipAbbreviatedField(*this, Op)) 167*e0308279SFrancis Visoiu Mistrih return std::move(Err); 168*e0308279SFrancis Visoiu Mistrih continue; 169*e0308279SFrancis Visoiu Mistrih } 170*e0308279SFrancis Visoiu Mistrih 171*e0308279SFrancis Visoiu Mistrih if (Op.getEncoding() == BitCodeAbbrevOp::Array) { 172*e0308279SFrancis Visoiu Mistrih // Array case. Read the number of elements as a vbr6. 173*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeNum = ReadVBR(6); 174*e0308279SFrancis Visoiu Mistrih if (!MaybeNum) 175*e0308279SFrancis Visoiu Mistrih return MaybeNum.takeError(); 176*e0308279SFrancis Visoiu Mistrih unsigned NumElts = MaybeNum.get(); 177*e0308279SFrancis Visoiu Mistrih 178*e0308279SFrancis Visoiu Mistrih // Get the element encoding. 179*e0308279SFrancis Visoiu Mistrih assert(i+2 == e && "array op not second to last?"); 180*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i); 181*e0308279SFrancis Visoiu Mistrih 182*e0308279SFrancis Visoiu Mistrih // Read all the elements. 183*e0308279SFrancis Visoiu Mistrih // Decode the value as we are commanded. 184*e0308279SFrancis Visoiu Mistrih switch (EltEnc.getEncoding()) { 185*e0308279SFrancis Visoiu Mistrih default: 186*e0308279SFrancis Visoiu Mistrih report_fatal_error("Array element type can't be an Array or a Blob"); 187*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Fixed: 188*e0308279SFrancis Visoiu Mistrih assert((unsigned)EltEnc.getEncodingData() <= MaxChunkSize); 189*e0308279SFrancis Visoiu Mistrih if (Error Err = JumpToBit(GetCurrentBitNo() + 190*e0308279SFrancis Visoiu Mistrih NumElts * EltEnc.getEncodingData())) 191*e0308279SFrancis Visoiu Mistrih return std::move(Err); 192*e0308279SFrancis Visoiu Mistrih break; 193*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::VBR: 194*e0308279SFrancis Visoiu Mistrih assert((unsigned)EltEnc.getEncodingData() <= MaxChunkSize); 195*e0308279SFrancis Visoiu Mistrih for (; NumElts; --NumElts) 196*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> Res = 197*e0308279SFrancis Visoiu Mistrih ReadVBR64((unsigned)EltEnc.getEncodingData())) 198*e0308279SFrancis Visoiu Mistrih ; // Skip! 199*e0308279SFrancis Visoiu Mistrih else 200*e0308279SFrancis Visoiu Mistrih return Res.takeError(); 201*e0308279SFrancis Visoiu Mistrih break; 202*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Char6: 203*e0308279SFrancis Visoiu Mistrih if (Error Err = JumpToBit(GetCurrentBitNo() + NumElts * 6)) 204*e0308279SFrancis Visoiu Mistrih return std::move(Err); 205*e0308279SFrancis Visoiu Mistrih break; 206*e0308279SFrancis Visoiu Mistrih } 207*e0308279SFrancis Visoiu Mistrih continue; 208*e0308279SFrancis Visoiu Mistrih } 209*e0308279SFrancis Visoiu Mistrih 210*e0308279SFrancis Visoiu Mistrih assert(Op.getEncoding() == BitCodeAbbrevOp::Blob); 211*e0308279SFrancis Visoiu Mistrih // Blob case. Read the number of bytes as a vbr6. 212*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeNum = ReadVBR(6); 213*e0308279SFrancis Visoiu Mistrih if (!MaybeNum) 214*e0308279SFrancis Visoiu Mistrih return MaybeNum.takeError(); 215*e0308279SFrancis Visoiu Mistrih unsigned NumElts = MaybeNum.get(); 216*e0308279SFrancis Visoiu Mistrih SkipToFourByteBoundary(); // 32-bit alignment 217*e0308279SFrancis Visoiu Mistrih 218*e0308279SFrancis Visoiu Mistrih // Figure out where the end of this blob will be including tail padding. 219*e0308279SFrancis Visoiu Mistrih size_t NewEnd = GetCurrentBitNo()+((NumElts+3)&~3)*8; 220*e0308279SFrancis Visoiu Mistrih 221*e0308279SFrancis Visoiu Mistrih // If this would read off the end of the bitcode file, just set the 222*e0308279SFrancis Visoiu Mistrih // record to empty and return. 223*e0308279SFrancis Visoiu Mistrih if (!canSkipToPos(NewEnd/8)) { 224*e0308279SFrancis Visoiu Mistrih skipToEnd(); 225*e0308279SFrancis Visoiu Mistrih break; 226*e0308279SFrancis Visoiu Mistrih } 227*e0308279SFrancis Visoiu Mistrih 228*e0308279SFrancis Visoiu Mistrih // Skip over the blob. 229*e0308279SFrancis Visoiu Mistrih if (Error Err = JumpToBit(NewEnd)) 230*e0308279SFrancis Visoiu Mistrih return std::move(Err); 231*e0308279SFrancis Visoiu Mistrih } 232*e0308279SFrancis Visoiu Mistrih return Code; 233*e0308279SFrancis Visoiu Mistrih } 234*e0308279SFrancis Visoiu Mistrih 235*e0308279SFrancis Visoiu Mistrih Expected<unsigned> BitstreamCursor::readRecord(unsigned AbbrevID, 236*e0308279SFrancis Visoiu Mistrih SmallVectorImpl<uint64_t> &Vals, 237*e0308279SFrancis Visoiu Mistrih StringRef *Blob) { 238*e0308279SFrancis Visoiu Mistrih if (AbbrevID == bitc::UNABBREV_RECORD) { 239*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeCode = ReadVBR(6); 240*e0308279SFrancis Visoiu Mistrih if (!MaybeCode) 241*e0308279SFrancis Visoiu Mistrih return MaybeCode.takeError(); 242*e0308279SFrancis Visoiu Mistrih uint32_t Code = MaybeCode.get(); 243*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeNumElts = ReadVBR(6); 244*e0308279SFrancis Visoiu Mistrih if (!MaybeNumElts) 245*e0308279SFrancis Visoiu Mistrih return MaybeNumElts.takeError(); 246*e0308279SFrancis Visoiu Mistrih uint32_t NumElts = MaybeNumElts.get(); 247*e0308279SFrancis Visoiu Mistrih 248*e0308279SFrancis Visoiu Mistrih for (unsigned i = 0; i != NumElts; ++i) 249*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> MaybeVal = ReadVBR64(6)) 250*e0308279SFrancis Visoiu Mistrih Vals.push_back(MaybeVal.get()); 251*e0308279SFrancis Visoiu Mistrih else 252*e0308279SFrancis Visoiu Mistrih return MaybeVal.takeError(); 253*e0308279SFrancis Visoiu Mistrih return Code; 254*e0308279SFrancis Visoiu Mistrih } 255*e0308279SFrancis Visoiu Mistrih 256*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrev *Abbv = getAbbrev(AbbrevID); 257*e0308279SFrancis Visoiu Mistrih 258*e0308279SFrancis Visoiu Mistrih // Read the record code first. 259*e0308279SFrancis Visoiu Mistrih assert(Abbv->getNumOperandInfos() != 0 && "no record code in abbreviation?"); 260*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &CodeOp = Abbv->getOperandInfo(0); 261*e0308279SFrancis Visoiu Mistrih unsigned Code; 262*e0308279SFrancis Visoiu Mistrih if (CodeOp.isLiteral()) 263*e0308279SFrancis Visoiu Mistrih Code = CodeOp.getLiteralValue(); 264*e0308279SFrancis Visoiu Mistrih else { 265*e0308279SFrancis Visoiu Mistrih if (CodeOp.getEncoding() == BitCodeAbbrevOp::Array || 266*e0308279SFrancis Visoiu Mistrih CodeOp.getEncoding() == BitCodeAbbrevOp::Blob) 267*e0308279SFrancis Visoiu Mistrih report_fatal_error("Abbreviation starts with an Array or a Blob"); 268*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> MaybeCode = readAbbreviatedField(*this, CodeOp)) 269*e0308279SFrancis Visoiu Mistrih Code = MaybeCode.get(); 270*e0308279SFrancis Visoiu Mistrih else 271*e0308279SFrancis Visoiu Mistrih return MaybeCode.takeError(); 272*e0308279SFrancis Visoiu Mistrih } 273*e0308279SFrancis Visoiu Mistrih 274*e0308279SFrancis Visoiu Mistrih for (unsigned i = 1, e = Abbv->getNumOperandInfos(); i != e; ++i) { 275*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i); 276*e0308279SFrancis Visoiu Mistrih if (Op.isLiteral()) { 277*e0308279SFrancis Visoiu Mistrih Vals.push_back(Op.getLiteralValue()); 278*e0308279SFrancis Visoiu Mistrih continue; 279*e0308279SFrancis Visoiu Mistrih } 280*e0308279SFrancis Visoiu Mistrih 281*e0308279SFrancis Visoiu Mistrih if (Op.getEncoding() != BitCodeAbbrevOp::Array && 282*e0308279SFrancis Visoiu Mistrih Op.getEncoding() != BitCodeAbbrevOp::Blob) { 283*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> MaybeVal = readAbbreviatedField(*this, Op)) 284*e0308279SFrancis Visoiu Mistrih Vals.push_back(MaybeVal.get()); 285*e0308279SFrancis Visoiu Mistrih else 286*e0308279SFrancis Visoiu Mistrih return MaybeVal.takeError(); 287*e0308279SFrancis Visoiu Mistrih continue; 288*e0308279SFrancis Visoiu Mistrih } 289*e0308279SFrancis Visoiu Mistrih 290*e0308279SFrancis Visoiu Mistrih if (Op.getEncoding() == BitCodeAbbrevOp::Array) { 291*e0308279SFrancis Visoiu Mistrih // Array case. Read the number of elements as a vbr6. 292*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeNumElts = ReadVBR(6); 293*e0308279SFrancis Visoiu Mistrih if (!MaybeNumElts) 294*e0308279SFrancis Visoiu Mistrih return MaybeNumElts.takeError(); 295*e0308279SFrancis Visoiu Mistrih uint32_t NumElts = MaybeNumElts.get(); 296*e0308279SFrancis Visoiu Mistrih 297*e0308279SFrancis Visoiu Mistrih // Get the element encoding. 298*e0308279SFrancis Visoiu Mistrih if (i + 2 != e) 299*e0308279SFrancis Visoiu Mistrih report_fatal_error("Array op not second to last"); 300*e0308279SFrancis Visoiu Mistrih const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i); 301*e0308279SFrancis Visoiu Mistrih if (!EltEnc.isEncoding()) 302*e0308279SFrancis Visoiu Mistrih report_fatal_error( 303*e0308279SFrancis Visoiu Mistrih "Array element type has to be an encoding of a type"); 304*e0308279SFrancis Visoiu Mistrih 305*e0308279SFrancis Visoiu Mistrih // Read all the elements. 306*e0308279SFrancis Visoiu Mistrih switch (EltEnc.getEncoding()) { 307*e0308279SFrancis Visoiu Mistrih default: 308*e0308279SFrancis Visoiu Mistrih report_fatal_error("Array element type can't be an Array or a Blob"); 309*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Fixed: 310*e0308279SFrancis Visoiu Mistrih for (; NumElts; --NumElts) 311*e0308279SFrancis Visoiu Mistrih if (Expected<SimpleBitstreamCursor::word_t> MaybeVal = 312*e0308279SFrancis Visoiu Mistrih Read((unsigned)EltEnc.getEncodingData())) 313*e0308279SFrancis Visoiu Mistrih Vals.push_back(MaybeVal.get()); 314*e0308279SFrancis Visoiu Mistrih else 315*e0308279SFrancis Visoiu Mistrih return MaybeVal.takeError(); 316*e0308279SFrancis Visoiu Mistrih break; 317*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::VBR: 318*e0308279SFrancis Visoiu Mistrih for (; NumElts; --NumElts) 319*e0308279SFrancis Visoiu Mistrih if (Expected<uint64_t> MaybeVal = 320*e0308279SFrancis Visoiu Mistrih ReadVBR64((unsigned)EltEnc.getEncodingData())) 321*e0308279SFrancis Visoiu Mistrih Vals.push_back(MaybeVal.get()); 322*e0308279SFrancis Visoiu Mistrih else 323*e0308279SFrancis Visoiu Mistrih return MaybeVal.takeError(); 324*e0308279SFrancis Visoiu Mistrih break; 325*e0308279SFrancis Visoiu Mistrih case BitCodeAbbrevOp::Char6: 326*e0308279SFrancis Visoiu Mistrih for (; NumElts; --NumElts) 327*e0308279SFrancis Visoiu Mistrih if (Expected<SimpleBitstreamCursor::word_t> MaybeVal = Read(6)) 328*e0308279SFrancis Visoiu Mistrih Vals.push_back(BitCodeAbbrevOp::DecodeChar6(MaybeVal.get())); 329*e0308279SFrancis Visoiu Mistrih else 330*e0308279SFrancis Visoiu Mistrih return MaybeVal.takeError(); 331*e0308279SFrancis Visoiu Mistrih } 332*e0308279SFrancis Visoiu Mistrih continue; 333*e0308279SFrancis Visoiu Mistrih } 334*e0308279SFrancis Visoiu Mistrih 335*e0308279SFrancis Visoiu Mistrih assert(Op.getEncoding() == BitCodeAbbrevOp::Blob); 336*e0308279SFrancis Visoiu Mistrih // Blob case. Read the number of bytes as a vbr6. 337*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeNumElts = ReadVBR(6); 338*e0308279SFrancis Visoiu Mistrih if (!MaybeNumElts) 339*e0308279SFrancis Visoiu Mistrih return MaybeNumElts.takeError(); 340*e0308279SFrancis Visoiu Mistrih uint32_t NumElts = MaybeNumElts.get(); 341*e0308279SFrancis Visoiu Mistrih SkipToFourByteBoundary(); // 32-bit alignment 342*e0308279SFrancis Visoiu Mistrih 343*e0308279SFrancis Visoiu Mistrih // Figure out where the end of this blob will be including tail padding. 344*e0308279SFrancis Visoiu Mistrih size_t CurBitPos = GetCurrentBitNo(); 345*e0308279SFrancis Visoiu Mistrih size_t NewEnd = CurBitPos+((NumElts+3)&~3)*8; 346*e0308279SFrancis Visoiu Mistrih 347*e0308279SFrancis Visoiu Mistrih // If this would read off the end of the bitcode file, just set the 348*e0308279SFrancis Visoiu Mistrih // record to empty and return. 349*e0308279SFrancis Visoiu Mistrih if (!canSkipToPos(NewEnd/8)) { 350*e0308279SFrancis Visoiu Mistrih Vals.append(NumElts, 0); 351*e0308279SFrancis Visoiu Mistrih skipToEnd(); 352*e0308279SFrancis Visoiu Mistrih break; 353*e0308279SFrancis Visoiu Mistrih } 354*e0308279SFrancis Visoiu Mistrih 355*e0308279SFrancis Visoiu Mistrih // Otherwise, inform the streamer that we need these bytes in memory. Skip 356*e0308279SFrancis Visoiu Mistrih // over tail padding first, in case jumping to NewEnd invalidates the Blob 357*e0308279SFrancis Visoiu Mistrih // pointer. 358*e0308279SFrancis Visoiu Mistrih if (Error Err = JumpToBit(NewEnd)) 359*e0308279SFrancis Visoiu Mistrih return std::move(Err); 360*e0308279SFrancis Visoiu Mistrih const char *Ptr = (const char *)getPointerToBit(CurBitPos, NumElts); 361*e0308279SFrancis Visoiu Mistrih 362*e0308279SFrancis Visoiu Mistrih // If we can return a reference to the data, do so to avoid copying it. 363*e0308279SFrancis Visoiu Mistrih if (Blob) { 364*e0308279SFrancis Visoiu Mistrih *Blob = StringRef(Ptr, NumElts); 365*e0308279SFrancis Visoiu Mistrih } else { 366*e0308279SFrancis Visoiu Mistrih // Otherwise, unpack into Vals with zero extension. 367*e0308279SFrancis Visoiu Mistrih for (; NumElts; --NumElts) 368*e0308279SFrancis Visoiu Mistrih Vals.push_back((unsigned char)*Ptr++); 369*e0308279SFrancis Visoiu Mistrih } 370*e0308279SFrancis Visoiu Mistrih } 371*e0308279SFrancis Visoiu Mistrih 372*e0308279SFrancis Visoiu Mistrih return Code; 373*e0308279SFrancis Visoiu Mistrih } 374*e0308279SFrancis Visoiu Mistrih 375*e0308279SFrancis Visoiu Mistrih Error BitstreamCursor::ReadAbbrevRecord() { 376*e0308279SFrancis Visoiu Mistrih auto Abbv = std::make_shared<BitCodeAbbrev>(); 377*e0308279SFrancis Visoiu Mistrih Expected<uint32_t> MaybeNumOpInfo = ReadVBR(5); 378*e0308279SFrancis Visoiu Mistrih if (!MaybeNumOpInfo) 379*e0308279SFrancis Visoiu Mistrih return MaybeNumOpInfo.takeError(); 380*e0308279SFrancis Visoiu Mistrih unsigned NumOpInfo = MaybeNumOpInfo.get(); 381*e0308279SFrancis Visoiu Mistrih for (unsigned i = 0; i != NumOpInfo; ++i) { 382*e0308279SFrancis Visoiu Mistrih Expected<word_t> MaybeIsLiteral = Read(1); 383*e0308279SFrancis Visoiu Mistrih if (!MaybeIsLiteral) 384*e0308279SFrancis Visoiu Mistrih return MaybeIsLiteral.takeError(); 385*e0308279SFrancis Visoiu Mistrih bool IsLiteral = MaybeIsLiteral.get(); 386*e0308279SFrancis Visoiu Mistrih if (IsLiteral) { 387*e0308279SFrancis Visoiu Mistrih Expected<uint64_t> MaybeOp = ReadVBR64(8); 388*e0308279SFrancis Visoiu Mistrih if (!MaybeOp) 389*e0308279SFrancis Visoiu Mistrih return MaybeOp.takeError(); 390*e0308279SFrancis Visoiu Mistrih Abbv->Add(BitCodeAbbrevOp(MaybeOp.get())); 391*e0308279SFrancis Visoiu Mistrih continue; 392*e0308279SFrancis Visoiu Mistrih } 393*e0308279SFrancis Visoiu Mistrih 394*e0308279SFrancis Visoiu Mistrih Expected<word_t> MaybeEncoding = Read(3); 395*e0308279SFrancis Visoiu Mistrih if (!MaybeEncoding) 396*e0308279SFrancis Visoiu Mistrih return MaybeEncoding.takeError(); 397*e0308279SFrancis Visoiu Mistrih BitCodeAbbrevOp::Encoding E = 398*e0308279SFrancis Visoiu Mistrih (BitCodeAbbrevOp::Encoding)MaybeEncoding.get(); 399*e0308279SFrancis Visoiu Mistrih if (BitCodeAbbrevOp::hasEncodingData(E)) { 400*e0308279SFrancis Visoiu Mistrih Expected<uint64_t> MaybeData = ReadVBR64(5); 401*e0308279SFrancis Visoiu Mistrih if (!MaybeData) 402*e0308279SFrancis Visoiu Mistrih return MaybeData.takeError(); 403*e0308279SFrancis Visoiu Mistrih uint64_t Data = MaybeData.get(); 404*e0308279SFrancis Visoiu Mistrih 405*e0308279SFrancis Visoiu Mistrih // As a special case, handle fixed(0) (i.e., a fixed field with zero bits) 406*e0308279SFrancis Visoiu Mistrih // and vbr(0) as a literal zero. This is decoded the same way, and avoids 407*e0308279SFrancis Visoiu Mistrih // a slow path in Read() to have to handle reading zero bits. 408*e0308279SFrancis Visoiu Mistrih if ((E == BitCodeAbbrevOp::Fixed || E == BitCodeAbbrevOp::VBR) && 409*e0308279SFrancis Visoiu Mistrih Data == 0) { 410*e0308279SFrancis Visoiu Mistrih Abbv->Add(BitCodeAbbrevOp(0)); 411*e0308279SFrancis Visoiu Mistrih continue; 412*e0308279SFrancis Visoiu Mistrih } 413*e0308279SFrancis Visoiu Mistrih 414*e0308279SFrancis Visoiu Mistrih if ((E == BitCodeAbbrevOp::Fixed || E == BitCodeAbbrevOp::VBR) && 415*e0308279SFrancis Visoiu Mistrih Data > MaxChunkSize) 416*e0308279SFrancis Visoiu Mistrih report_fatal_error( 417*e0308279SFrancis Visoiu Mistrih "Fixed or VBR abbrev record with size > MaxChunkData"); 418*e0308279SFrancis Visoiu Mistrih 419*e0308279SFrancis Visoiu Mistrih Abbv->Add(BitCodeAbbrevOp(E, Data)); 420*e0308279SFrancis Visoiu Mistrih } else 421*e0308279SFrancis Visoiu Mistrih Abbv->Add(BitCodeAbbrevOp(E)); 422*e0308279SFrancis Visoiu Mistrih } 423*e0308279SFrancis Visoiu Mistrih 424*e0308279SFrancis Visoiu Mistrih if (Abbv->getNumOperandInfos() == 0) 425*e0308279SFrancis Visoiu Mistrih report_fatal_error("Abbrev record with no operands"); 426*e0308279SFrancis Visoiu Mistrih CurAbbrevs.push_back(std::move(Abbv)); 427*e0308279SFrancis Visoiu Mistrih 428*e0308279SFrancis Visoiu Mistrih return Error::success(); 429*e0308279SFrancis Visoiu Mistrih } 430*e0308279SFrancis Visoiu Mistrih 431*e0308279SFrancis Visoiu Mistrih Expected<Optional<BitstreamBlockInfo>> 432*e0308279SFrancis Visoiu Mistrih BitstreamCursor::ReadBlockInfoBlock(bool ReadBlockInfoNames) { 433*e0308279SFrancis Visoiu Mistrih if (llvm::Error Err = EnterSubBlock(bitc::BLOCKINFO_BLOCK_ID)) 434*e0308279SFrancis Visoiu Mistrih return std::move(Err); 435*e0308279SFrancis Visoiu Mistrih 436*e0308279SFrancis Visoiu Mistrih BitstreamBlockInfo NewBlockInfo; 437*e0308279SFrancis Visoiu Mistrih 438*e0308279SFrancis Visoiu Mistrih SmallVector<uint64_t, 64> Record; 439*e0308279SFrancis Visoiu Mistrih BitstreamBlockInfo::BlockInfo *CurBlockInfo = nullptr; 440*e0308279SFrancis Visoiu Mistrih 441*e0308279SFrancis Visoiu Mistrih // Read all the records for this module. 442*e0308279SFrancis Visoiu Mistrih while (true) { 443*e0308279SFrancis Visoiu Mistrih Expected<BitstreamEntry> MaybeEntry = 444*e0308279SFrancis Visoiu Mistrih advanceSkippingSubblocks(AF_DontAutoprocessAbbrevs); 445*e0308279SFrancis Visoiu Mistrih if (!MaybeEntry) 446*e0308279SFrancis Visoiu Mistrih return MaybeEntry.takeError(); 447*e0308279SFrancis Visoiu Mistrih BitstreamEntry Entry = MaybeEntry.get(); 448*e0308279SFrancis Visoiu Mistrih 449*e0308279SFrancis Visoiu Mistrih switch (Entry.Kind) { 450*e0308279SFrancis Visoiu Mistrih case llvm::BitstreamEntry::SubBlock: // Handled for us already. 451*e0308279SFrancis Visoiu Mistrih case llvm::BitstreamEntry::Error: 452*e0308279SFrancis Visoiu Mistrih return None; 453*e0308279SFrancis Visoiu Mistrih case llvm::BitstreamEntry::EndBlock: 454*e0308279SFrancis Visoiu Mistrih return std::move(NewBlockInfo); 455*e0308279SFrancis Visoiu Mistrih case llvm::BitstreamEntry::Record: 456*e0308279SFrancis Visoiu Mistrih // The interesting case. 457*e0308279SFrancis Visoiu Mistrih break; 458*e0308279SFrancis Visoiu Mistrih } 459*e0308279SFrancis Visoiu Mistrih 460*e0308279SFrancis Visoiu Mistrih // Read abbrev records, associate them with CurBID. 461*e0308279SFrancis Visoiu Mistrih if (Entry.ID == bitc::DEFINE_ABBREV) { 462*e0308279SFrancis Visoiu Mistrih if (!CurBlockInfo) return None; 463*e0308279SFrancis Visoiu Mistrih if (Error Err = ReadAbbrevRecord()) 464*e0308279SFrancis Visoiu Mistrih return std::move(Err); 465*e0308279SFrancis Visoiu Mistrih 466*e0308279SFrancis Visoiu Mistrih // ReadAbbrevRecord installs the abbrev in CurAbbrevs. Move it to the 467*e0308279SFrancis Visoiu Mistrih // appropriate BlockInfo. 468*e0308279SFrancis Visoiu Mistrih CurBlockInfo->Abbrevs.push_back(std::move(CurAbbrevs.back())); 469*e0308279SFrancis Visoiu Mistrih CurAbbrevs.pop_back(); 470*e0308279SFrancis Visoiu Mistrih continue; 471*e0308279SFrancis Visoiu Mistrih } 472*e0308279SFrancis Visoiu Mistrih 473*e0308279SFrancis Visoiu Mistrih // Read a record. 474*e0308279SFrancis Visoiu Mistrih Record.clear(); 475*e0308279SFrancis Visoiu Mistrih Expected<unsigned> MaybeBlockInfo = readRecord(Entry.ID, Record); 476*e0308279SFrancis Visoiu Mistrih if (!MaybeBlockInfo) 477*e0308279SFrancis Visoiu Mistrih return MaybeBlockInfo.takeError(); 478*e0308279SFrancis Visoiu Mistrih switch (MaybeBlockInfo.get()) { 479*e0308279SFrancis Visoiu Mistrih default: 480*e0308279SFrancis Visoiu Mistrih break; // Default behavior, ignore unknown content. 481*e0308279SFrancis Visoiu Mistrih case bitc::BLOCKINFO_CODE_SETBID: 482*e0308279SFrancis Visoiu Mistrih if (Record.size() < 1) 483*e0308279SFrancis Visoiu Mistrih return None; 484*e0308279SFrancis Visoiu Mistrih CurBlockInfo = &NewBlockInfo.getOrCreateBlockInfo((unsigned)Record[0]); 485*e0308279SFrancis Visoiu Mistrih break; 486*e0308279SFrancis Visoiu Mistrih case bitc::BLOCKINFO_CODE_BLOCKNAME: { 487*e0308279SFrancis Visoiu Mistrih if (!CurBlockInfo) 488*e0308279SFrancis Visoiu Mistrih return None; 489*e0308279SFrancis Visoiu Mistrih if (!ReadBlockInfoNames) 490*e0308279SFrancis Visoiu Mistrih break; // Ignore name. 491*e0308279SFrancis Visoiu Mistrih std::string Name; 492*e0308279SFrancis Visoiu Mistrih for (unsigned i = 0, e = Record.size(); i != e; ++i) 493*e0308279SFrancis Visoiu Mistrih Name += (char)Record[i]; 494*e0308279SFrancis Visoiu Mistrih CurBlockInfo->Name = Name; 495*e0308279SFrancis Visoiu Mistrih break; 496*e0308279SFrancis Visoiu Mistrih } 497*e0308279SFrancis Visoiu Mistrih case bitc::BLOCKINFO_CODE_SETRECORDNAME: { 498*e0308279SFrancis Visoiu Mistrih if (!CurBlockInfo) return None; 499*e0308279SFrancis Visoiu Mistrih if (!ReadBlockInfoNames) 500*e0308279SFrancis Visoiu Mistrih break; // Ignore name. 501*e0308279SFrancis Visoiu Mistrih std::string Name; 502*e0308279SFrancis Visoiu Mistrih for (unsigned i = 1, e = Record.size(); i != e; ++i) 503*e0308279SFrancis Visoiu Mistrih Name += (char)Record[i]; 504*e0308279SFrancis Visoiu Mistrih CurBlockInfo->RecordNames.push_back(std::make_pair((unsigned)Record[0], 505*e0308279SFrancis Visoiu Mistrih Name)); 506*e0308279SFrancis Visoiu Mistrih break; 507*e0308279SFrancis Visoiu Mistrih } 508*e0308279SFrancis Visoiu Mistrih } 509*e0308279SFrancis Visoiu Mistrih } 510*e0308279SFrancis Visoiu Mistrih } 511