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