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