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