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" 2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/StreamingMemoryObject.h" 21de551f91d8816632a76a065084caab9fab6aacffDan Gohman#include <climits> 22f0891be8bdbeeadb39da5575273b6645755fa383Gabor Greif#include <string> 23107d80956d1a7017b132e508defdb5f90e74de5fChris Lattner#include <vector> 24b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 25b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnernamespace llvm { 26d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// This class is used to read from an LLVM bitcode stream, maintaining 2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// information that is global to decoding the entire file. While a file is 2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// being read, multiple cursors can be independently advanced or skipped around 3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// within the file. These are represented by the BitstreamCursor class. 31b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnerclass BitstreamReader { 32962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerpublic: 3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This contains information emitted to BLOCKINFO_BLOCK blocks. These 3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// describe abbreviations that all blocks of the specified ID inherit. 35962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner struct BlockInfo { 36962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner unsigned BlockID; 3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::vector<IntrusiveRefCntPtr<BitCodeAbbrev>> Abbrevs; 38f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner std::string Name; 39170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 40f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner std::vector<std::pair<unsigned, std::string> > RecordNames; 41962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner }; 42962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerprivate: 4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::unique_ptr<MemoryObject> BitcodeBytes; 44170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 45962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner std::vector<BlockInfo> BlockInfoRecords; 46962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This is set to true if we don't care about the block/record name 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// information in the BlockInfo block. Only llvm-bcanalyzer uses this. 490370cc6399022b687f898c9edc5e98482252997cChris Lattner bool IgnoreBlockInfoNames; 509f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper 51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines BitstreamReader(const BitstreamReader&) = delete; 52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void operator=(const BitstreamReader&) = delete; 53962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerpublic: 542ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff BitstreamReader() : IgnoreBlockInfoNames(true) { 55962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner } 56962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitstreamReader(const unsigned char *Start, const unsigned char *End) 5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : IgnoreBlockInfoNames(true) { 59962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner init(Start, End); 60962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner } 61962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines BitstreamReader(std::unique_ptr<MemoryObject> BitcodeBytes) 63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : BitcodeBytes(std::move(BitcodeBytes)), IgnoreBlockInfoNames(true) {} 642ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitstreamReader(BitstreamReader &&Other) { 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines *this = std::move(Other); 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitstreamReader &operator=(BitstreamReader &&Other) { 7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitcodeBytes = std::move(Other.BitcodeBytes); 7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Explicitly swap block info, so that nothing gets destroyed twice. 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::swap(BlockInfoRecords, Other.BlockInfoRecords); 7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines IgnoreBlockInfoNames = Other.IgnoreBlockInfoNames; 7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return *this; 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 77962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner void init(const unsigned char *Start, const unsigned char *End) { 78962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner assert(((End-Start) & 3) == 0 &&"Bitcode stream not a multiple of 4 bytes"); 792ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff BitcodeBytes.reset(getNonStreamedMemoryObject(Start, End)); 80962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner } 81962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MemoryObject &getBitcodeBytes() { return *BitcodeBytes; } 83962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This is called by clients that want block/record name information. 850370cc6399022b687f898c9edc5e98482252997cChris Lattner void CollectBlockInfoNames() { IgnoreBlockInfoNames = false; } 860370cc6399022b687f898c9edc5e98482252997cChris Lattner bool isIgnoringBlockInfoNames() { return IgnoreBlockInfoNames; } 87170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 88962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner //===--------------------------------------------------------------------===// 89962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner // Block Manipulation 90962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner //===--------------------------------------------------------------------===// 91962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 9237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Return true if we've already read and processed the block info block for 9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// this Bitstream. We only process it for the first cursor that walks over 9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// it. 957919b966a8fd8f98346216e79df6f4722693be22Chris Lattner bool hasBlockInfoRecords() const { return !BlockInfoRecords.empty(); } 96170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// If there is block info for the specified ID, return it, otherwise return 9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// null. 99f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner const BlockInfo *getBlockInfo(unsigned BlockID) const { 100962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner // Common case, the most recent entry matches BlockID. 101962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner if (!BlockInfoRecords.empty() && BlockInfoRecords.back().BlockID == BlockID) 102962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner return &BlockInfoRecords.back(); 103962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 104962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner for (unsigned i = 0, e = static_cast<unsigned>(BlockInfoRecords.size()); 105962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner i != e; ++i) 106962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner if (BlockInfoRecords[i].BlockID == BlockID) 107962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner return &BlockInfoRecords[i]; 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 109962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner } 110d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 111962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner BlockInfo &getOrCreateBlockInfo(unsigned BlockID) { 112f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner if (const BlockInfo *BI = getBlockInfo(BlockID)) 113f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner return *const_cast<BlockInfo*>(BI); 114962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 115962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner // Otherwise, add a new record. 116962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner BlockInfoRecords.push_back(BlockInfo()); 117962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner BlockInfoRecords.back().BlockID = BlockID; 118962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner return BlockInfoRecords.back(); 119962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner } 12063246aa04f23767875bfe6f533285915a766b82dChris Lattner 12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Takes block info from the other bitstream reader. 12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// 12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This is a "take" operation because BlockInfo records are non-trivial, and 12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// indeed rather expensive. 12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void takeBlockInfo(BitstreamReader &&Other) { 12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(!hasBlockInfoRecords()); 12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BlockInfoRecords = std::move(Other.BlockInfoRecords); 12837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 12937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 130ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 13137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// When advancing through a bitstream cursor, each advance can discover a few 13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// different kinds of entries: 13363246aa04f23767875bfe6f533285915a766b82dChris Lattnerstruct BitstreamEntry { 13463246aa04f23767875bfe6f533285915a766b82dChris Lattner enum { 13537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Error, // Malformed bitcode was found. 13637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines EndBlock, // We've reached the end of the current block, (or the end of the 13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // file, which is treated like a series of EndBlock records. 13837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SubBlock, // This is the start of a new subblock of a specific ID. 13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Record // This is a record with a specific AbbrevID. 14063246aa04f23767875bfe6f533285915a766b82dChris Lattner } Kind; 141ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 14263246aa04f23767875bfe6f533285915a766b82dChris Lattner unsigned ID; 143962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 14463246aa04f23767875bfe6f533285915a766b82dChris Lattner static BitstreamEntry getError() { 14563246aa04f23767875bfe6f533285915a766b82dChris Lattner BitstreamEntry E; E.Kind = Error; return E; 14663246aa04f23767875bfe6f533285915a766b82dChris Lattner } 14763246aa04f23767875bfe6f533285915a766b82dChris Lattner static BitstreamEntry getEndBlock() { 14863246aa04f23767875bfe6f533285915a766b82dChris Lattner BitstreamEntry E; E.Kind = EndBlock; return E; 14963246aa04f23767875bfe6f533285915a766b82dChris Lattner } 15063246aa04f23767875bfe6f533285915a766b82dChris Lattner static BitstreamEntry getSubBlock(unsigned ID) { 15163246aa04f23767875bfe6f533285915a766b82dChris Lattner BitstreamEntry E; E.Kind = SubBlock; E.ID = ID; return E; 15263246aa04f23767875bfe6f533285915a766b82dChris Lattner } 15363246aa04f23767875bfe6f533285915a766b82dChris Lattner static BitstreamEntry getRecord(unsigned AbbrevID) { 15463246aa04f23767875bfe6f533285915a766b82dChris Lattner BitstreamEntry E; E.Kind = Record; E.ID = AbbrevID; return E; 15563246aa04f23767875bfe6f533285915a766b82dChris Lattner } 156962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner}; 157962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner 15837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// This represents a position within a bitcode file. There may be multiple 15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// independent cursors reading within one bitstream, each maintaining their own 16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// local state. 16163246aa04f23767875bfe6f533285915a766b82dChris Lattner/// 16263246aa04f23767875bfe6f533285915a766b82dChris Lattner/// Unlike iterators, BitstreamCursors are heavy-weight objects that should not 16363246aa04f23767875bfe6f533285915a766b82dChris Lattner/// be passed by value. 164962dde3cef3184f1683d5070c298c9a29509d62eChris Lattnerclass BitstreamCursor { 165962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner BitstreamReader *BitStream; 1662ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff size_t NextChar; 167170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // The size of the bicode. 0 if we don't know it yet. 16937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines size_t Size; 170ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This is the current data we have pulled from the stream but have not 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// returned to the client. This is specifically and intentionally defined to 17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// follow the word size of the host machine for efficiency. We use word_t in 17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// places that are aware of this to make it perfectly explicit what is going 17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// on. 17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines typedef size_t word_t; 177e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner word_t CurWord; 178170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This is the number of bits in CurWord that are valid. This is always from 18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// [0...bits_of(size_t)-1] inclusive. 181b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner unsigned BitsInCurWord; 182170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // This is the declared size of code values used for the current block, in 18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // bits. 185b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner unsigned CurCodeSize; 186170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Abbrevs installed at in this block. 18837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::vector<IntrusiveRefCntPtr<BitCodeAbbrev>> CurAbbrevs; 189170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 190aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner struct Block { 191aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner unsigned PrevCodeSize; 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines std::vector<IntrusiveRefCntPtr<BitCodeAbbrev>> PrevAbbrevs; 193aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner explicit Block(unsigned PCS) : PrevCodeSize(PCS) {} 194aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner }; 195170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This tracks the codesize of parent blocks. 197aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner SmallVector<Block, 8> BlockScope; 198170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 199ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 200b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnerpublic: 20137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitstreamCursor() { init(nullptr); } 202170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines explicit BitstreamCursor(BitstreamReader &R) { init(&R); } 204170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 20537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void init(BitstreamReader *R) { 206962dde3cef3184f1683d5070c298c9a29509d62eChris Lattner freeState(); 207170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 20837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitStream = R; 2092ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff NextChar = 0; 21037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Size = 0; 211b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner BitsInCurWord = 0; 212b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner CurCodeSize = 2; 213b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 214170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 215312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner void freeState(); 216ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 2172ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff bool canSkipToPos(size_t pos) const { 2182ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff // pos can be skipped to if it is a valid address or one byte past the end. 2192ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff return pos == 0 || BitStream->getBitcodeBytes().isValidAddress( 2202ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff static_cast<uint64_t>(pos - 1)); 2212ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff } 2222ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff 2232ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff bool AtEndOfStream() { 22437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (BitsInCurWord != 0) 22537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 22637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Size != 0) 22737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return Size == NextChar; 22837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines fillCurWord(); 22937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return BitsInCurWord == 0; 2309850b57587c5e7e3608ba881e62882e46f79025cChris Lattner } 231170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 23237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Return the number of bits used to encode an abbrev #. 23363246aa04f23767875bfe6f533285915a766b82dChris Lattner unsigned getAbbrevIDWidth() const { return CurCodeSize; } 23463246aa04f23767875bfe6f533285915a766b82dChris Lattner 23537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Return the bit # of the bit we are reading. 236bd40a6d3ee9658f9bfd6ab74893fca5fa75c6de0Chris Lattner uint64_t GetCurrentBitNo() const { 2372ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff return NextChar*CHAR_BIT - BitsInCurWord; 238bd40a6d3ee9658f9bfd6ab74893fca5fa75c6de0Chris Lattner } 239170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 240f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner BitstreamReader *getBitStreamReader() { 241f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner return BitStream; 242f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner } 243f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner const BitstreamReader *getBitStreamReader() const { 244f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner return BitStream; 245f9a3ec86c138177c7d9b3a9d119e6d2247d14bd8Chris Lattner } 246170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 247344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner /// Flags that modify the behavior of advance(). 248344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner enum { 24937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// If this flag is used, the advance() method does not automatically pop 25037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// the block scope when the end of a block is reached. 251099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner AF_DontPopBlockAtEnd = 1, 252099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner 25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// If this flag is used, abbrev entries are returned just like normal 25437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// records. 255099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner AF_DontAutoprocessAbbrevs = 2 256344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner }; 257ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 258ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// Advance the current bitstream, returning the next entry in the stream. 259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines BitstreamEntry advance(unsigned Flags = 0) { 26063246aa04f23767875bfe6f533285915a766b82dChris Lattner while (1) { 26163246aa04f23767875bfe6f533285915a766b82dChris Lattner unsigned Code = ReadCode(); 26263246aa04f23767875bfe6f533285915a766b82dChris Lattner if (Code == bitc::END_BLOCK) { 263344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner // Pop the end of the block unless Flags tells us not to. 264344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner if (!(Flags & AF_DontPopBlockAtEnd) && ReadBlockEnd()) 26563246aa04f23767875bfe6f533285915a766b82dChris Lattner return BitstreamEntry::getError(); 26663246aa04f23767875bfe6f533285915a766b82dChris Lattner return BitstreamEntry::getEndBlock(); 26763246aa04f23767875bfe6f533285915a766b82dChris Lattner } 268ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 26963246aa04f23767875bfe6f533285915a766b82dChris Lattner if (Code == bitc::ENTER_SUBBLOCK) 27063246aa04f23767875bfe6f533285915a766b82dChris Lattner return BitstreamEntry::getSubBlock(ReadSubBlockID()); 271ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 272099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner if (Code == bitc::DEFINE_ABBREV && 273099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner !(Flags & AF_DontAutoprocessAbbrevs)) { 27463246aa04f23767875bfe6f533285915a766b82dChris Lattner // We read and accumulate abbrev's, the client can't do anything with 27563246aa04f23767875bfe6f533285915a766b82dChris Lattner // them anyway. 27663246aa04f23767875bfe6f533285915a766b82dChris Lattner ReadAbbrevRecord(); 27763246aa04f23767875bfe6f533285915a766b82dChris Lattner continue; 27863246aa04f23767875bfe6f533285915a766b82dChris Lattner } 27963246aa04f23767875bfe6f533285915a766b82dChris Lattner 28063246aa04f23767875bfe6f533285915a766b82dChris Lattner return BitstreamEntry::getRecord(Code); 28163246aa04f23767875bfe6f533285915a766b82dChris Lattner } 28263246aa04f23767875bfe6f533285915a766b82dChris Lattner } 28363246aa04f23767875bfe6f533285915a766b82dChris Lattner 28437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This is a convenience function for clients that don't expect any 28537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// subblocks. This just skips over them automatically. 286344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner BitstreamEntry advanceSkippingSubblocks(unsigned Flags = 0) { 28763246aa04f23767875bfe6f533285915a766b82dChris Lattner while (1) { 28863246aa04f23767875bfe6f533285915a766b82dChris Lattner // If we found a normal entry, return it. 289344fc23d23c969043f8f146b17cb7d2f47a98384Chris Lattner BitstreamEntry Entry = advance(Flags); 29063246aa04f23767875bfe6f533285915a766b82dChris Lattner if (Entry.Kind != BitstreamEntry::SubBlock) 29163246aa04f23767875bfe6f533285915a766b82dChris Lattner return Entry; 292ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 29363246aa04f23767875bfe6f533285915a766b82dChris Lattner // If we found a sub-block, just skip over it and check the next entry. 29463246aa04f23767875bfe6f533285915a766b82dChris Lattner if (SkipBlock()) 29563246aa04f23767875bfe6f533285915a766b82dChris Lattner return BitstreamEntry::getError(); 29663246aa04f23767875bfe6f533285915a766b82dChris Lattner } 29763246aa04f23767875bfe6f533285915a766b82dChris Lattner } 298170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 29937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Reset the stream to the specified bit number. 30090a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner void JumpToBit(uint64_t BitNo) { 301ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines size_t ByteNo = size_t(BitNo/8) & ~(sizeof(word_t)-1); 302e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner unsigned WordBitNo = unsigned(BitNo & (sizeof(word_t)*8-1)); 3032ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff assert(canSkipToPos(ByteNo) && "Invalid location"); 304170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 30590a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner // Move the cursor to the right word. 3062ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff NextChar = ByteNo; 30790a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner BitsInCurWord = 0; 308170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 30990a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner // Skip over any bits that are already consumed. 31037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (WordBitNo) 31137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Read(WordBitNo); 31237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 31337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void fillCurWord() { 315ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (Size != 0 && NextChar >= Size) 316ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines report_fatal_error("Unexpected end of file"); 31737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 31837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Read the next word from the stream. 31937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint8_t Array[sizeof(word_t)] = {0}; 32037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 32137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t BytesRead = 32237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitStream->getBitcodeBytes().readBytes(Array, sizeof(Array), NextChar); 32337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 32437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // If we run out of data, stop at the end of the stream. 32537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (BytesRead == 0) { 32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Size = NextChar; 32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return; 328e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner } 32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurWord = 33137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines support::endian::read<word_t, support::little, support::unaligned>( 33237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Array); 33337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines NextChar += BytesRead; 33437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitsInCurWord = BytesRead * 8; 33590a5c7dbc150af336b6e153427f21fb8a1d46d78Chris Lattner } 336170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 33737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines word_t Read(unsigned NumBits) { 33837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines static const unsigned BitsInWord = sizeof(word_t) * 8; 339170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 34037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines assert(NumBits && NumBits <= BitsInWord && 34137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "Cannot return zero or more than BitsInWord bits!"); 34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 34337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f; 344ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 345b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // If the field is fully contained by CurWord, return it quickly. 346b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner if (BitsInCurWord >= NumBits) { 34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines word_t R = CurWord & (~word_t(0) >> (BitsInWord - NumBits)); 34837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Use a mask to avoid undefined behavior. 35037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurWord >>= (NumBits & Mask); 35137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 352b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner BitsInCurWord -= NumBits; 353b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return R; 354b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 355b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 35637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines word_t R = BitsInCurWord ? CurWord : 0; 35737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned BitsLeft = NumBits - BitsInCurWord; 358ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 35937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines fillCurWord(); 360ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 36137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // If we run out of data, stop at the end of the stream. 36237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (BitsLeft > BitsInCurWord) 36337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return 0; 364ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 36537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines word_t R2 = CurWord & (~word_t(0) >> (BitsInWord - BitsLeft)); 366e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner 36737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Use a mask to avoid undefined behavior. 36837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurWord >>= (BitsLeft & Mask); 369d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 37037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BitsInCurWord -= BitsLeft; 371d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 37237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines R |= R2 << (NumBits - BitsLeft); 373d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 374b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return R; 375b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 376d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 377b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner uint32_t ReadVBR(unsigned NumBits) { 378b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner uint32_t Piece = Read(NumBits); 379a0c96a068ca7027644b5f1972f9c388fa542d278Jeff Cohen if ((Piece & (1U << (NumBits-1))) == 0) 380b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return Piece; 381b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 382b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner uint32_t Result = 0; 383b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner unsigned NextBit = 0; 384b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner while (1) { 385b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner Result |= (Piece & ((1U << (NumBits-1))-1)) << NextBit; 386b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 387a0c96a068ca7027644b5f1972f9c388fa542d278Jeff Cohen if ((Piece & (1U << (NumBits-1))) == 0) 388b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return Result; 389d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 390b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner NextBit += NumBits-1; 391b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner Piece = Read(NumBits); 392b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 393b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 394d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 39537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Read a VBR that may have a value up to 64-bits in size. The chunk size of 39637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // the VBR must still be <= 32 bits though. 397b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner uint64_t ReadVBR64(unsigned NumBits) { 398f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner uint32_t Piece = Read(NumBits); 399f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner if ((Piece & (1U << (NumBits-1))) == 0) 400f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner return uint64_t(Piece); 401d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 402b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner uint64_t Result = 0; 403b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner unsigned NextBit = 0; 404b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner while (1) { 405f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner Result |= uint64_t(Piece & ((1U << (NumBits-1))-1)) << NextBit; 406d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 407f5a1edce2370664a439cebdc895c8d559354b0c6Chris Lattner if ((Piece & (1U << (NumBits-1))) == 0) 408b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return Result; 409d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 410b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner NextBit += NumBits-1; 411b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner Piece = Read(NumBits); 412b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 413b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 414b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 415e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattnerprivate: 416fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner void SkipToFourByteBoundary() { 417e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner // If word_t is 64-bits and if we've read less than 32 bits, just dump 418e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner // the bits we have up to the next 32-bit boundary. 419e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner if (sizeof(word_t) > 4 && 420db5e50ddafa3903e9ca9ee4008d6e6fa82f780eaChris Lattner BitsInCurWord >= 32) { 421e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner CurWord >>= BitsInCurWord-32; 422e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner BitsInCurWord = 32; 423e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner return; 424e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner } 425ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 426b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner BitsInCurWord = 0; 427b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 428e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattnerpublic: 429b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 430b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner unsigned ReadCode() { 431b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return Read(CurCodeSize); 432b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 433b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 434d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 435b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // Block header: 436b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // [ENTER_SUBBLOCK, blockid, newcodelen, <align4bytes>, blocklen] 437b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 43837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Having read the ENTER_SUBBLOCK code, read the BlockID for the block. 439b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner unsigned ReadSubBlockID() { 440b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return ReadVBR(bitc::BlockIDWidth); 441b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 442d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 44337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body 44437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// of this block. If the block record is malformed, return true. 445b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner bool SkipBlock() { 446b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // Read and ignore the codelen value. Since we are skipping this block, we 447b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // don't care what code widths are used inside of it. 448b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner ReadVBR(bitc::CodeLenWidth); 449fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner SkipToFourByteBoundary(); 450e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner unsigned NumFourBytes = Read(bitc::BlockSizeWidth); 451d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 452b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // Check that the block wasn't partially defined, and that the offset isn't 453b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // bogus. 454e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner size_t SkipTo = GetCurrentBitNo() + NumFourBytes*4*8; 455e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner if (AtEndOfStream() || !canSkipToPos(SkipTo/8)) 456b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return true; 457d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 458e001f27e5ebc325b5b142f3661d04ba39251e07bChris Lattner JumpToBit(SkipTo); 459b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner return false; 460b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner } 461d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 46237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Having read the ENTER_SUBBLOCK abbrevid, enter the block, and return true 46337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// if the block has an error. 464dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = nullptr); 465ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 466b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner bool ReadBlockEnd() { 467b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner if (BlockScope.empty()) return true; 468d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 469b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // Block tail: 470b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // [END_BLOCK, <align4bytes>] 471fd0543d9be9886398628e411aba8c392b28d17b6Chris Lattner SkipToFourByteBoundary(); 472d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 47363246aa04f23767875bfe6f533285915a766b82dChris Lattner popBlockScope(); 47413faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenek return false; 47513faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenek } 476d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 47713faf5c13c951741e9bdfeabd5f9047f1f28d95bTed Kremenekprivate: 47863246aa04f23767875bfe6f533285915a766b82dChris Lattner 47963246aa04f23767875bfe6f533285915a766b82dChris Lattner void popBlockScope() { 480aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner CurCodeSize = BlockScope.back().PrevCodeSize; 481d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 48237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurAbbrevs = std::move(BlockScope.back().PrevAbbrevs); 483b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner BlockScope.pop_back(); 484d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman } 485d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 486099b636562a83dc9acc6bf36ca32d710ac6d62c9Chris Lattner //===--------------------------------------------------------------------===// 487b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner // Record Processing 488b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner //===--------------------------------------------------------------------===// 489d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman 4903c074f61ed2bd1d8d48c3851d827a06b80d2608bChris Lattnerpublic: 49137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Return the abbreviation for the specified AbbrevId. 492123f3848794b333063b478d38ff12e1bd3969125Chris Lattner const BitCodeAbbrev *getAbbrev(unsigned AbbrevID) { 493ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned AbbrevNo = AbbrevID - bitc::FIRST_APPLICATION_ABBREV; 494ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (AbbrevNo >= CurAbbrevs.size()) 495ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines report_fatal_error("Invalid abbrev number"); 49637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return CurAbbrevs[AbbrevNo].get(); 497123f3848794b333063b478d38ff12e1bd3969125Chris Lattner } 498170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 49937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Read the current record and discard it. 500f9147c41d8101dbd98662d6d7be78278d53f690fChris Lattner void skipRecord(unsigned AbbrevID); 501ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 502194ef24dfedf62642c853a851db4d7e528d27460Chris Lattner unsigned readRecord(unsigned AbbrevID, SmallVectorImpl<uint64_t> &Vals, 503dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef *Blob = nullptr); 504194ef24dfedf62642c853a851db4d7e528d27460Chris Lattner 505aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner //===--------------------------------------------------------------------===// 506aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner // Abbrev Processing 507aea20124338b335ea6ff2730924c223f0db95e04Chris Lattner //===--------------------------------------------------------------------===// 508312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner void ReadAbbrevRecord(); 509ef7964c1b78f57e277e74bda4f38e1143d1363feJoe Abbey 510312c7d9dc126e90ca1f40d30ba9a3ba22ade35c4Chris Lattner bool ReadBlockInfoBlock(); 511b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner}; 512170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 513b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner} // End llvm namespace 514b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner 515b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#endif 516