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