1b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//===- BitstreamReader.h - Low-level bitstream reader interface -*- C++ -*-===//
2b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
3b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//                     The LLVM Compiler Infrastructure
4b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
8b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//===----------------------------------------------------------------------===//
9b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
10b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner// This header defines the BitstreamReader class.  This class can be used to
11b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner// read an arbitrary bitstream, regardless of its contents.
12b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
13b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//===----------------------------------------------------------------------===//
14b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_BITCODE_BITSTREAMREADER_H
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_BITCODE_BITSTREAMREADER_H
17b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
18b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#include "llvm/Bitcode/BitCodes.h"
19b0b527b62cdcbe6e1a5947534fd749b310856a17NAKAMURA Takumi#include "llvm/Support/Endian.h"
20ffa1ff16d77f76ef86b696eeec383b3f7c380397Nick Lewycky#include "llvm/Support/StreamableMemoryObject.h"
21de551f91d8816632a76a065084caab9fab6aacffDan Gohman#include <climits>
22f0891be8bdbeeadb39da5575273b6645755fa383Gabor Greif#include <string>
23107d80956d1a7017b132e508defdb5f90e74de5fChris Lattner#include <vector>
24b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
25b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnernamespace llvm {
26d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
2713faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenek  class Deserializer;
28d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
2963246aa04f23767875bfe6f533285915a766b82dChris Lattner/// BitstreamReader - This class is used to read from an LLVM bitcode stream,
3063246aa04f23767875bfe6f533285915a766b82dChris Lattner/// maintaining information that is global to decoding the entire file.  While
3163246aa04f23767875bfe6f533285915a766b82dChris Lattner/// a file is being read, multiple cursors can be independently advanced or
3263246aa04f23767875bfe6f533285915a766b82dChris Lattner/// skipped around within the file.  These are represented by the
3363246aa04f23767875bfe6f533285915a766b82dChris Lattner/// BitstreamCursor class.
34b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnerclass BitstreamReader {
35962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerpublic:
36962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  /// BlockInfo - This contains information emitted to BLOCKINFO_BLOCK blocks.
37962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  /// These describe abbreviations that all blocks of the specified ID inherit.
38962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  struct BlockInfo {
39962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    unsigned BlockID;
40962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    std::vector<BitCodeAbbrev*> Abbrevs;
41f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner    std::string Name;
42170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
43f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner    std::vector<std::pair<unsigned, std::string> > RecordNames;
44962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  };
45962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerprivate:
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<StreamableMemoryObject> BitcodeBytes;
47170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
48962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  std::vector<BlockInfo> BlockInfoRecords;
49962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
500370cc6399022b687f898c9edc5e98482252997cChris Lattner  /// IgnoreBlockInfoNames - This is set to true if we don't care about the
510370cc6399022b687f898c9edc5e98482252997cChris Lattner  /// block/record name information in the BlockInfo block. Only llvm-bcanalyzer
520370cc6399022b687f898c9edc5e98482252997cChris Lattner  /// uses this.
530370cc6399022b687f898c9edc5e98482252997cChris Lattner  bool IgnoreBlockInfoNames;
549f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper
559f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  BitstreamReader(const BitstreamReader&) LLVM_DELETED_FUNCTION;
569f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper  void operator=(const BitstreamReader&) LLVM_DELETED_FUNCTION;
57962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerpublic:
582ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  BitstreamReader() : IgnoreBlockInfoNames(true) {
59962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
60962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
61962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  BitstreamReader(const unsigned char *Start, const unsigned char *End) {
620370cc6399022b687f898c9edc5e98482252997cChris Lattner    IgnoreBlockInfoNames = true;
63962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    init(Start, End);
64962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
65962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
662ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  BitstreamReader(StreamableMemoryObject *bytes) {
672ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    BitcodeBytes.reset(bytes);
682ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  }
692ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
70962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  void init(const unsigned char *Start, const unsigned char *End) {
71962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    assert(((End-Start) & 3) == 0 &&"Bitcode stream not a multiple of 4 bytes");
722ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    BitcodeBytes.reset(getNonStreamedMemoryObject(Start, End));
73962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
74962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
752ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  StreamableMemoryObject &getBitcodeBytes() { return *BitcodeBytes; }
762ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
77962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  ~BitstreamReader() {
78962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    // Free the BlockInfoRecords.
79962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    while (!BlockInfoRecords.empty()) {
80962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner      BlockInfo &Info = BlockInfoRecords.back();
81962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner      // Free blockinfo abbrev info.
82962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner      for (unsigned i = 0, e = static_cast<unsigned>(Info.Abbrevs.size());
83962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner           i != e; ++i)
84962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner        Info.Abbrevs[i]->dropRef();
85962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner      BlockInfoRecords.pop_back();
86962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    }
87962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
88962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
890370cc6399022b687f898c9edc5e98482252997cChris Lattner  /// CollectBlockInfoNames - This is called by clients that want block/record
900370cc6399022b687f898c9edc5e98482252997cChris Lattner  /// name information.
910370cc6399022b687f898c9edc5e98482252997cChris Lattner  void CollectBlockInfoNames() { IgnoreBlockInfoNames = false; }
920370cc6399022b687f898c9edc5e98482252997cChris Lattner  bool isIgnoringBlockInfoNames() { return IgnoreBlockInfoNames; }
93170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
94962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  //===--------------------------------------------------------------------===//
95962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  // Block Manipulation
96962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  //===--------------------------------------------------------------------===//
97962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
987919b966a8fd8f98346216e79df6f4722693be22Chris Lattner  /// hasBlockInfoRecords - Return true if we've already read and processed the
997919b966a8fd8f98346216e79df6f4722693be22Chris Lattner  /// block info block for this Bitstream.  We only process it for the first
1007919b966a8fd8f98346216e79df6f4722693be22Chris Lattner  /// cursor that walks over it.
1017919b966a8fd8f98346216e79df6f4722693be22Chris Lattner  bool hasBlockInfoRecords() const { return !BlockInfoRecords.empty(); }
102170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
103962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  /// getBlockInfo - If there is block info for the specified ID, return it,
104962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  /// otherwise return null.
105f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner  const BlockInfo *getBlockInfo(unsigned BlockID) const {
106962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    // Common case, the most recent entry matches BlockID.
107962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    if (!BlockInfoRecords.empty() && BlockInfoRecords.back().BlockID == BlockID)
108962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner      return &BlockInfoRecords.back();
109962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
110962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    for (unsigned i = 0, e = static_cast<unsigned>(BlockInfoRecords.size());
111962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner         i != e; ++i)
112962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner      if (BlockInfoRecords[i].BlockID == BlockID)
113962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner        return &BlockInfoRecords[i];
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
115962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
116d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
117962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  BlockInfo &getOrCreateBlockInfo(unsigned BlockID) {
118f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner    if (const BlockInfo *BI = getBlockInfo(BlockID))
119f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner      return *const_cast<BlockInfo*>(BI);
120962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
121962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    // Otherwise, add a new record.
122962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    BlockInfoRecords.push_back(BlockInfo());
123962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    BlockInfoRecords.back().BlockID = BlockID;
124962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    return BlockInfoRecords.back();
125962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
12663246aa04f23767875bfe6f533285915a766b82dChris Lattner};
12763246aa04f23767875bfe6f533285915a766b82dChris Lattner
128ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
12963246aa04f23767875bfe6f533285915a766b82dChris Lattner/// BitstreamEntry - When advancing through a bitstream cursor, each advance can
13063246aa04f23767875bfe6f533285915a766b82dChris Lattner/// discover a few different kinds of entries:
13163246aa04f23767875bfe6f533285915a766b82dChris Lattner///   Error    - Malformed bitcode was found.
13263246aa04f23767875bfe6f533285915a766b82dChris Lattner///   EndBlock - We've reached the end of the current block, (or the end of the
13363246aa04f23767875bfe6f533285915a766b82dChris Lattner///              file, which is treated like a series of EndBlock records.
13463246aa04f23767875bfe6f533285915a766b82dChris Lattner///   SubBlock - This is the start of a new subblock of a specific ID.
13563246aa04f23767875bfe6f533285915a766b82dChris Lattner///   Record   - This is a record with a specific AbbrevID.
13663246aa04f23767875bfe6f533285915a766b82dChris Lattner///
13763246aa04f23767875bfe6f533285915a766b82dChris Lattnerstruct BitstreamEntry {
13863246aa04f23767875bfe6f533285915a766b82dChris Lattner  enum {
13963246aa04f23767875bfe6f533285915a766b82dChris Lattner    Error,
14063246aa04f23767875bfe6f533285915a766b82dChris Lattner    EndBlock,
14163246aa04f23767875bfe6f533285915a766b82dChris Lattner    SubBlock,
14263246aa04f23767875bfe6f533285915a766b82dChris Lattner    Record
14363246aa04f23767875bfe6f533285915a766b82dChris Lattner  } Kind;
144ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
14563246aa04f23767875bfe6f533285915a766b82dChris Lattner  unsigned ID;
146962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
14763246aa04f23767875bfe6f533285915a766b82dChris Lattner  static BitstreamEntry getError() {
14863246aa04f23767875bfe6f533285915a766b82dChris Lattner    BitstreamEntry E; E.Kind = Error; return E;
14963246aa04f23767875bfe6f533285915a766b82dChris Lattner  }
15063246aa04f23767875bfe6f533285915a766b82dChris Lattner  static BitstreamEntry getEndBlock() {
15163246aa04f23767875bfe6f533285915a766b82dChris Lattner    BitstreamEntry E; E.Kind = EndBlock; return E;
15263246aa04f23767875bfe6f533285915a766b82dChris Lattner  }
15363246aa04f23767875bfe6f533285915a766b82dChris Lattner  static BitstreamEntry getSubBlock(unsigned ID) {
15463246aa04f23767875bfe6f533285915a766b82dChris Lattner    BitstreamEntry E; E.Kind = SubBlock; E.ID = ID; return E;
15563246aa04f23767875bfe6f533285915a766b82dChris Lattner  }
15663246aa04f23767875bfe6f533285915a766b82dChris Lattner  static BitstreamEntry getRecord(unsigned AbbrevID) {
15763246aa04f23767875bfe6f533285915a766b82dChris Lattner    BitstreamEntry E; E.Kind = Record; E.ID = AbbrevID; return E;
15863246aa04f23767875bfe6f533285915a766b82dChris Lattner  }
159962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner};
160962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner
16163246aa04f23767875bfe6f533285915a766b82dChris Lattner/// BitstreamCursor - This represents a position within a bitcode file.  There
16263246aa04f23767875bfe6f533285915a766b82dChris Lattner/// may be multiple independent cursors reading within one bitstream, each
16363246aa04f23767875bfe6f533285915a766b82dChris Lattner/// maintaining their own local state.
16463246aa04f23767875bfe6f533285915a766b82dChris Lattner///
16563246aa04f23767875bfe6f533285915a766b82dChris Lattner/// Unlike iterators, BitstreamCursors are heavy-weight objects that should not
16663246aa04f23767875bfe6f533285915a766b82dChris Lattner/// be passed by value.
167962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerclass BitstreamCursor {
168962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  friend class Deserializer;
169962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  BitstreamReader *BitStream;
1702ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  size_t NextChar;
171170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
172ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
173e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  /// CurWord/word_t - This is the current data we have pulled from the stream
174e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  /// but have not returned to the client.  This is specifically and
175e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  /// intentionally defined to follow the word size of the host machine for
176e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  /// efficiency.  We use word_t in places that are aware of this to make it
177e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  /// perfectly explicit what is going on.
178e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  typedef uint32_t word_t;
179e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  word_t CurWord;
180170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
181b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  /// BitsInCurWord - This is the number of bits in CurWord that are valid. This
182e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner  /// is always from [0...31/63] inclusive (depending on word size).
183b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  unsigned BitsInCurWord;
184170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
185b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  // CurCodeSize - This is the declared size of code values used for the current
186b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  // block, in bits.
187b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  unsigned CurCodeSize;
188170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
189aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  /// CurAbbrevs - Abbrevs installed at in this block.
190aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  std::vector<BitCodeAbbrev*> CurAbbrevs;
191170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
192aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  struct Block {
193aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    unsigned PrevCodeSize;
194aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    std::vector<BitCodeAbbrev*> PrevAbbrevs;
195aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    explicit Block(unsigned PCS) : PrevCodeSize(PCS) {}
196aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  };
197170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
198aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  /// BlockScope - This tracks the codesize of parent blocks.
199aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  SmallVector<Block, 8> BlockScope;
200170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
201ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
202b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnerpublic:
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  BitstreamCursor() : BitStream(nullptr), NextChar(0) {}
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  BitstreamCursor(const BitstreamCursor &RHS)
205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      : BitStream(nullptr), NextChar(0) {
2067919b966a8fd8f98346216e79df6f4722693be22Chris Lattner    operator=(RHS);
2077919b966a8fd8f98346216e79df6f4722693be22Chris Lattner  }
208170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
209962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  explicit BitstreamCursor(BitstreamReader &R) : BitStream(&R) {
2102ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    NextChar = 0;
21190a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner    CurWord = 0;
21290a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner    BitsInCurWord = 0;
213962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    CurCodeSize = 2;
21490a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner  }
215170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
216962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  void init(BitstreamReader &R) {
217962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    freeState();
218170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
219962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    BitStream = &R;
2202ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    NextChar = 0;
221b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    CurWord = 0;
222b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    BitsInCurWord = 0;
223b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    CurCodeSize = 2;
224b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
225170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
226962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  ~BitstreamCursor() {
227962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner    freeState();
228962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner  }
229170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
230312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner  void operator=(const BitstreamCursor &RHS);
231170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
232312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner  void freeState();
233ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
2342ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  bool isEndPos(size_t pos) {
2352ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    return BitStream->getBitcodeBytes().isObjectEnd(static_cast<uint64_t>(pos));
2362ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  }
2372ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
2382ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  bool canSkipToPos(size_t pos) const {
2392ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    // pos can be skipped to if it is a valid address or one byte past the end.
2402ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    return pos == 0 || BitStream->getBitcodeBytes().isValidAddress(
2412ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff        static_cast<uint64_t>(pos - 1));
2422ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  }
2432ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
2442ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  uint32_t getWord(size_t pos) {
245312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner    uint8_t buf[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
24649a6a8d8f2994249c81b7914b07015714748a55cBenjamin Kramer    BitStream->getBitcodeBytes().readBytes(pos, sizeof(buf), buf);
247b0b527b62cdcbe6e1a5947534fd749b310856a17NAKAMURA Takumi    return *reinterpret_cast<support::ulittle32_t *>(buf);
2482ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  }
2492ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
2502ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  bool AtEndOfStream() {
2511ca114a66b666f932741d00d74636dc35ea1d466Chris Lattner    return BitsInCurWord == 0 && isEndPos(NextChar);
2529850b57587c5e7e3608ba881e62882e46f79025cChris Lattner  }
253170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
25463246aa04f23767875bfe6f533285915a766b82dChris Lattner  /// getAbbrevIDWidth - Return the number of bits used to encode an abbrev #.
25563246aa04f23767875bfe6f533285915a766b82dChris Lattner  unsigned getAbbrevIDWidth() const { return CurCodeSize; }
25663246aa04f23767875bfe6f533285915a766b82dChris Lattner
257bd40a6d3ee9658f9bfd6ab74893fca5fa75c6de0Chris Lattner  /// GetCurrentBitNo - Return the bit # of the bit we are reading.
258bd40a6d3ee9658f9bfd6ab74893fca5fa75c6de0Chris Lattner  uint64_t GetCurrentBitNo() const {
2592ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    return NextChar*CHAR_BIT - BitsInCurWord;
260bd40a6d3ee9658f9bfd6ab74893fca5fa75c6de0Chris Lattner  }
261170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
262f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner  BitstreamReader *getBitStreamReader() {
263f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner    return BitStream;
264f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner  }
265f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner  const BitstreamReader *getBitStreamReader() const {
266f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner    return BitStream;
267f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner  }
268170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
269344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner  /// Flags that modify the behavior of advance().
270344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner  enum {
271099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    /// AF_DontPopBlockAtEnd - If this flag is used, the advance() method does
272099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    /// not automatically pop the block scope when the end of a block is
273099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    /// reached.
274099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    AF_DontPopBlockAtEnd = 1,
275099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner
276099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    /// AF_DontAutoprocessAbbrevs - If this flag is used, abbrev entries are
277099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    /// returned just like normal records.
278099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner    AF_DontAutoprocessAbbrevs = 2
279344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner  };
280ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
28163246aa04f23767875bfe6f533285915a766b82dChris Lattner  /// advance - Advance the current bitstream, returning the next entry in the
28263246aa04f23767875bfe6f533285915a766b82dChris Lattner  /// stream.
283344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner  BitstreamEntry advance(unsigned Flags = 0) {
28463246aa04f23767875bfe6f533285915a766b82dChris Lattner    while (1) {
28563246aa04f23767875bfe6f533285915a766b82dChris Lattner      unsigned Code = ReadCode();
28663246aa04f23767875bfe6f533285915a766b82dChris Lattner      if (Code == bitc::END_BLOCK) {
287344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner        // Pop the end of the block unless Flags tells us not to.
288344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner        if (!(Flags & AF_DontPopBlockAtEnd) && ReadBlockEnd())
28963246aa04f23767875bfe6f533285915a766b82dChris Lattner          return BitstreamEntry::getError();
29063246aa04f23767875bfe6f533285915a766b82dChris Lattner        return BitstreamEntry::getEndBlock();
29163246aa04f23767875bfe6f533285915a766b82dChris Lattner      }
292ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
29363246aa04f23767875bfe6f533285915a766b82dChris Lattner      if (Code == bitc::ENTER_SUBBLOCK)
29463246aa04f23767875bfe6f533285915a766b82dChris Lattner        return BitstreamEntry::getSubBlock(ReadSubBlockID());
295ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
296099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner      if (Code == bitc::DEFINE_ABBREV &&
297099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner          !(Flags & AF_DontAutoprocessAbbrevs)) {
29863246aa04f23767875bfe6f533285915a766b82dChris Lattner        // We read and accumulate abbrev's, the client can't do anything with
29963246aa04f23767875bfe6f533285915a766b82dChris Lattner        // them anyway.
30063246aa04f23767875bfe6f533285915a766b82dChris Lattner        ReadAbbrevRecord();
30163246aa04f23767875bfe6f533285915a766b82dChris Lattner        continue;
30263246aa04f23767875bfe6f533285915a766b82dChris Lattner      }
30363246aa04f23767875bfe6f533285915a766b82dChris Lattner
30463246aa04f23767875bfe6f533285915a766b82dChris Lattner      return BitstreamEntry::getRecord(Code);
30563246aa04f23767875bfe6f533285915a766b82dChris Lattner    }
30663246aa04f23767875bfe6f533285915a766b82dChris Lattner  }
30763246aa04f23767875bfe6f533285915a766b82dChris Lattner
30863246aa04f23767875bfe6f533285915a766b82dChris Lattner  /// advanceSkippingSubblocks - This is a convenience function for clients that
30963246aa04f23767875bfe6f533285915a766b82dChris Lattner  /// don't expect any subblocks.  This just skips over them automatically.
310344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner  BitstreamEntry advanceSkippingSubblocks(unsigned Flags = 0) {
31163246aa04f23767875bfe6f533285915a766b82dChris Lattner    while (1) {
31263246aa04f23767875bfe6f533285915a766b82dChris Lattner      // If we found a normal entry, return it.
313344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner      BitstreamEntry Entry = advance(Flags);
31463246aa04f23767875bfe6f533285915a766b82dChris Lattner      if (Entry.Kind != BitstreamEntry::SubBlock)
31563246aa04f23767875bfe6f533285915a766b82dChris Lattner        return Entry;
316ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
31763246aa04f23767875bfe6f533285915a766b82dChris Lattner      // If we found a sub-block, just skip over it and check the next entry.
31863246aa04f23767875bfe6f533285915a766b82dChris Lattner      if (SkipBlock())
31963246aa04f23767875bfe6f533285915a766b82dChris Lattner        return BitstreamEntry::getError();
32063246aa04f23767875bfe6f533285915a766b82dChris Lattner    }
32163246aa04f23767875bfe6f533285915a766b82dChris Lattner  }
322170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
32390a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner  /// JumpToBit - Reset the stream to the specified bit number.
32490a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner  void JumpToBit(uint64_t BitNo) {
325e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    uintptr_t ByteNo = uintptr_t(BitNo/8) & ~(sizeof(word_t)-1);
326e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    unsigned WordBitNo = unsigned(BitNo & (sizeof(word_t)*8-1));
3272ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    assert(canSkipToPos(ByteNo) && "Invalid location");
328170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
32990a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner    // Move the cursor to the right word.
3302ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    NextChar = ByteNo;
33190a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner    BitsInCurWord = 0;
3322a2a496aacd53aeb02dbf654f7e7c59de301c8c2Ted Kremenek    CurWord = 0;
333170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
33490a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner    // Skip over any bits that are already consumed.
335e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    if (WordBitNo) {
336db5e50ddafa3903e9ca9ee4008d6e6fa82f780eaChris Lattner      if (sizeof(word_t) > 4)
337e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner        Read64(WordBitNo);
338e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner      else
339e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner        Read(WordBitNo);
340e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    }
34190a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner  }
342170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
343170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
344b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  uint32_t Read(unsigned NumBits) {
345b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner    assert(NumBits && NumBits <= 32 &&
346b24f5b7c0838f22abc6f1ba5de2a17d25293cd17Chris Lattner           "Cannot return zero or more than 32 bits!");
347ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
348b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // If the field is fully contained by CurWord, return it quickly.
349b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    if (BitsInCurWord >= NumBits) {
350e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner      uint32_t R = uint32_t(CurWord) & (~0U >> (32-NumBits));
351b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      CurWord >>= NumBits;
352b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      BitsInCurWord -= NumBits;
353b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      return R;
354b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    }
355b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
356b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // If we run out of data, stop at the end of the stream.
3572ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    if (isEndPos(NextChar)) {
358b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      CurWord = 0;
359b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      BitsInCurWord = 0;
360b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      return 0;
361b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    }
362d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
363e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    uint32_t R = uint32_t(CurWord);
364b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
365b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // Read the next word from the stream.
366519e1475d64d80f4632296318b3a5240d4f70a72Chris Lattner    uint8_t Array[sizeof(word_t)] = {0};
367ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
36849a6a8d8f2994249c81b7914b07015714748a55cBenjamin Kramer    BitStream->getBitcodeBytes().readBytes(NextChar, sizeof(Array), Array);
369ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
370e9288fbe4df5c912f5bb42c33a675b61d45c0a99Chris Lattner    // Handle big-endian byte-swapping if necessary.
371519e1475d64d80f4632296318b3a5240d4f70a72Chris Lattner    support::detail::packed_endian_specific_integral
372519e1475d64d80f4632296318b3a5240d4f70a72Chris Lattner      <word_t, support::little, support::unaligned> EndianValue;
373519e1475d64d80f4632296318b3a5240d4f70a72Chris Lattner    memcpy(&EndianValue, Array, sizeof(Array));
374ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
375519e1475d64d80f4632296318b3a5240d4f70a72Chris Lattner    CurWord = EndianValue;
376e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner
377e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    NextChar += sizeof(word_t);
378d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
379b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // Extract NumBits-BitsInCurWord from what we just read.
380b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    unsigned BitsLeft = NumBits-BitsInCurWord;
381d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
382e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    // Be careful here, BitsLeft is in the range [1..32]/[1..64] inclusive.
383e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    R |= uint32_t((CurWord & (word_t(~0ULL) >> (sizeof(word_t)*8-BitsLeft)))
384e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner                    << BitsInCurWord);
385d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
386e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    // BitsLeft bits have just been used up from CurWord.  BitsLeft is in the
387e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    // range [1..32]/[1..64] so be careful how we shift.
388e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    if (BitsLeft != sizeof(word_t)*8)
389b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      CurWord >>= BitsLeft;
390b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    else
391b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      CurWord = 0;
392e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    BitsInCurWord = sizeof(word_t)*8-BitsLeft;
393b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    return R;
394b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
395d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
396aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  uint64_t Read64(unsigned NumBits) {
397aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    if (NumBits <= 32) return Read(NumBits);
398d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
399aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    uint64_t V = Read(32);
400aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    return V | (uint64_t)Read(NumBits-32) << 32;
401aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  }
402d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
403b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  uint32_t ReadVBR(unsigned NumBits) {
404b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    uint32_t Piece = Read(NumBits);
405a0c96a068ca7027644b5f1972f9c388fa542d278Jeff Cohen    if ((Piece & (1U << (NumBits-1))) == 0)
406b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      return Piece;
407b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
408b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    uint32_t Result = 0;
409b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    unsigned NextBit = 0;
410b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    while (1) {
411b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      Result |= (Piece & ((1U << (NumBits-1))-1)) << NextBit;
412b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
413a0c96a068ca7027644b5f1972f9c388fa542d278Jeff Cohen      if ((Piece & (1U << (NumBits-1))) == 0)
414b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner        return Result;
415d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
416b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      NextBit += NumBits-1;
417b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      Piece = Read(NumBits);
418b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    }
419b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
420d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
421f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner  // ReadVBR64 - Read a VBR that may have a value up to 64-bits in size.  The
422f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner  // chunk size of the VBR must still be <= 32 bits though.
423b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  uint64_t ReadVBR64(unsigned NumBits) {
424f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner    uint32_t Piece = Read(NumBits);
425f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner    if ((Piece & (1U << (NumBits-1))) == 0)
426f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner      return uint64_t(Piece);
427d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
428b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    uint64_t Result = 0;
429b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    unsigned NextBit = 0;
430b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    while (1) {
431f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner      Result |= uint64_t(Piece & ((1U << (NumBits-1))-1)) << NextBit;
432d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
433f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner      if ((Piece & (1U << (NumBits-1))) == 0)
434b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner        return Result;
435d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
436b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      NextBit += NumBits-1;
437b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      Piece = Read(NumBits);
438b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    }
439b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
440b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
441e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattnerprivate:
442fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner  void SkipToFourByteBoundary() {
443e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    // If word_t is 64-bits and if we've read less than 32 bits, just dump
444e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    // the bits we have up to the next 32-bit boundary.
445e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    if (sizeof(word_t) > 4 &&
446db5e50ddafa3903e9ca9ee4008d6e6fa82f780eaChris Lattner        BitsInCurWord >= 32) {
447e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner      CurWord >>= BitsInCurWord-32;
448e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner      BitsInCurWord = 32;
449e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner      return;
450e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    }
451ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
452b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    BitsInCurWord = 0;
453b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    CurWord = 0;
454b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
455e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattnerpublic:
456b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
457b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  unsigned ReadCode() {
458b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    return Read(CurCodeSize);
459b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
460b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
461d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
462b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  // Block header:
463b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  //    [ENTER_SUBBLOCK, blockid, newcodelen, <align4bytes>, blocklen]
464b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
465b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  /// ReadSubBlockID - Having read the ENTER_SUBBLOCK code, read the BlockID for
466b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  /// the block.
467b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  unsigned ReadSubBlockID() {
468b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    return ReadVBR(bitc::BlockIDWidth);
469b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
470d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
471b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  /// SkipBlock - Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip
472b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  /// over the body of this block.  If the block record is malformed, return
473b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  /// true.
474b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  bool SkipBlock() {
475b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // Read and ignore the codelen value.  Since we are skipping this block, we
476b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // don't care what code widths are used inside of it.
477b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    ReadVBR(bitc::CodeLenWidth);
478fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner    SkipToFourByteBoundary();
479e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    unsigned NumFourBytes = Read(bitc::BlockSizeWidth);
480d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
481b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // Check that the block wasn't partially defined, and that the offset isn't
482b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // bogus.
483e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    size_t SkipTo = GetCurrentBitNo() + NumFourBytes*4*8;
484e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    if (AtEndOfStream() || !canSkipToPos(SkipTo/8))
485b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner      return true;
486d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
487e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner    JumpToBit(SkipTo);
488b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    return false;
489b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  }
490d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
49113faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenek  /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter
492d9a3bad4487dee0b9ed1a0f5555dffe605826158Jan Wen Voung  /// the block, and return true if the block has an error.
493dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = nullptr);
494ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
495b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  bool ReadBlockEnd() {
496b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    if (BlockScope.empty()) return true;
497d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
498b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    // Block tail:
499b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    //    [END_BLOCK, <align4bytes>]
500fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner    SkipToFourByteBoundary();
501d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
50263246aa04f23767875bfe6f533285915a766b82dChris Lattner    popBlockScope();
50313faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenek    return false;
50413faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenek  }
505d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
50613faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenekprivate:
50763246aa04f23767875bfe6f533285915a766b82dChris Lattner
50863246aa04f23767875bfe6f533285915a766b82dChris Lattner  void popBlockScope() {
509aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    CurCodeSize = BlockScope.back().PrevCodeSize;
510d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
511aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    // Delete abbrevs from popped scope.
51234cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    for (unsigned i = 0, e = static_cast<unsigned>(CurAbbrevs.size());
51334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng         i != e; ++i)
514299b2d2070165eccea3fb61f7387fa016b847338Chris Lattner      CurAbbrevs[i]->dropRef();
515d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
516aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner    BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
517b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner    BlockScope.pop_back();
518d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman  }
519d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
520099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner  //===--------------------------------------------------------------------===//
521b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  // Record Processing
522b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner  //===--------------------------------------------------------------------===//
523d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
5243c074f61ed2bd1d8d48c3851d827a06b80d2608bChris Lattnerprivate:
525f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner  void readAbbreviatedLiteral(const BitCodeAbbrevOp &Op,
526f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner                              SmallVectorImpl<uint64_t> &Vals);
527f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner  void readAbbreviatedField(const BitCodeAbbrevOp &Op,
528f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner                            SmallVectorImpl<uint64_t> &Vals);
529f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner  void skipAbbreviatedField(const BitCodeAbbrevOp &Op);
530ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
5313c074f61ed2bd1d8d48c3851d827a06b80d2608bChris Lattnerpublic:
532123f3848794b333063b478d38ff12e1bd3969125Chris Lattner
533170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey  /// getAbbrev - Return the abbreviation for the specified AbbrevId.
534123f3848794b333063b478d38ff12e1bd3969125Chris Lattner  const BitCodeAbbrev *getAbbrev(unsigned AbbrevID) {
535123f3848794b333063b478d38ff12e1bd3969125Chris Lattner    unsigned AbbrevNo = AbbrevID-bitc::FIRST_APPLICATION_ABBREV;
536123f3848794b333063b478d38ff12e1bd3969125Chris Lattner    assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
537123f3848794b333063b478d38ff12e1bd3969125Chris Lattner    return CurAbbrevs[AbbrevNo];
538123f3848794b333063b478d38ff12e1bd3969125Chris Lattner  }
539170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
540f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner  /// skipRecord - Read the current record and discard it.
541f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner  void skipRecord(unsigned AbbrevID);
542ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
543194ef24dfedf62642c853a851db4d7e528d27460Chris Lattner  unsigned readRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals,
544dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                      StringRef *Blob = nullptr);
545194ef24dfedf62642c853a851db4d7e528d27460Chris Lattner
546aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  //===--------------------------------------------------------------------===//
547aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  // Abbrev Processing
548aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner  //===--------------------------------------------------------------------===//
549312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner  void ReadAbbrevRecord();
550ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey
551312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner  bool ReadBlockInfoBlock();
552b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner};
553170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
554b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner} // End llvm namespace
555b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
556b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#endif
557