1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===// 2932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// The LLVM Compiler Infrastructure 4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// This file is distributed under the University of Illinois Open Source 6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// License. See LICENSE.TXT for details. 7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// This header defines the BitcodeReader class. 11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#ifndef BITCODE_READER_H 15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define BITCODE_READER_H 16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 17b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/ADT/DenseMap.h" 18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/BitstreamReader.h" 19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/LLVMBitCodes.h" 20b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Attributes.h" 21c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray#include "llvm/IR/GVMaterializer.h" 22b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/OperandTraits.h" 23b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Type.h" 24c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray#include "llvm/IR/ValueHandle.h" 25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <vector> 26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace llvm { 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines class MemoryBuffer; 29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines class LLVMContext; 30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace llvm_2_7 { 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesusing namespace llvm; 35d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// BitcodeReaderValueList Class 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass BitcodeReaderValueList { 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<WeakVH> ValuePtrs; 42b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// ResolveConstants - As we resolve forward-referenced constants, we add 44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// information about them to this vector. This allows us to resolve them in 45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// bulk instead of resolving each reference at a time. See the code in 46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// ResolveConstantForwardRefs for more information about this. 47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// 48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// The key of this vector is the placeholder constant, the value is the slot 49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// number that holds the resolved value. 50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; 51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResolveConstantsTy ResolveConstants; 52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMContext &Context; 53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinespublic: 54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitcodeReaderValueList(LLVMContext &C) : Context(C) {} 55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ~BitcodeReaderValueList() { 56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines assert(ResolveConstants.empty() && "Constants not resolved?"); 57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // vector compatibility methods 60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned size() const { return ValuePtrs.size(); } 61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void resize(unsigned N) { ValuePtrs.resize(N); } 62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void push_back(Value *V) { 63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ValuePtrs.push_back(V); 64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 65b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void clear() { 67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines assert(ResolveConstants.empty() && "Constants not resolved?"); 68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ValuePtrs.clear(); 69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 70b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *operator[](unsigned i) const { 72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines assert(i < ValuePtrs.size()); 73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ValuePtrs[i]; 74932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 75b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *back() const { return ValuePtrs.back(); } 77932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void pop_back() { ValuePtrs.pop_back(); } 78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool empty() const { return ValuePtrs.empty(); } 79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void shrinkTo(unsigned N) { 80932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines assert(N <= size() && "Invalid shrinkTo request!"); 81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ValuePtrs.resize(N); 82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 83b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Constant *getConstantFwdRef(unsigned Idx, Type *Ty); 85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *getValueFwdRef(unsigned Idx, Type *Ty); 86b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void AssignValue(Value *V, unsigned Idx); 88b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// resolves any forward references. 91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void ResolveConstantForwardRefs(); 92932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; 93932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 94932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 95932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 96932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// BitcodeReaderMDValueList Class 97932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 98932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 99932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass BitcodeReaderMDValueList { 100932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<WeakVH> MDValuePtrs; 101b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 102932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMContext &Context; 103932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinespublic: 104932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitcodeReaderMDValueList(LLVMContext& C) : Context(C) {} 105932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 106932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // vector compatibility methods 107932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned size() const { return MDValuePtrs.size(); } 108932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void resize(unsigned N) { MDValuePtrs.resize(N); } 109932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void push_back(Value *V) { MDValuePtrs.push_back(V); } 110932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void clear() { MDValuePtrs.clear(); } 111932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *back() const { return MDValuePtrs.back(); } 112932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void pop_back() { MDValuePtrs.pop_back(); } 113932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool empty() const { return MDValuePtrs.empty(); } 114b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 115932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *operator[](unsigned i) const { 116932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines assert(i < MDValuePtrs.size()); 117932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return MDValuePtrs[i]; 118932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 119b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 120932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void shrinkTo(unsigned N) { 121932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines assert(N <= size() && "Invalid shrinkTo request!"); 122932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines MDValuePtrs.resize(N); 123932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 124932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *getValueFwdRef(unsigned Idx); 126932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void AssignValue(Value *V, unsigned Idx); 127932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; 128932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 129932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass BitcodeReader : public GVMaterializer { 130932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMContext &Context; 131932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Module *TheModule; 132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines MemoryBuffer *Buffer; 133932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool BufferOwned; 134f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::unique_ptr<BitstreamReader> StreamFile; 135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitstreamCursor Stream; 136d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines DataStreamer *LazyStreamer; 137d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines uint64_t NextUnreadBit; 138d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines bool SeenValueSymbolTable; 139d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<Type*> TypeList; 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitcodeReaderValueList ValueList; 142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitcodeReaderMDValueList MDValueList; 143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines SmallVector<Instruction *, 64> InstructionList; 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 147b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// MAttributes - The set of attributes by index. Index zero in the 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// file is for null, and is thus not represented here. As such all indices 150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// are off by one. 151b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines std::vector<AttributeSet> MAttributes; 152b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 153d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines /// \brief The set of attribute groups. 154d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines std::map<unsigned, AttributeSet> MAttributeGroups; 155d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// FunctionBBs - While parsing a function body, this is a list of the basic 157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// blocks for the function. 158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<BasicBlock*> FunctionBBs; 159b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // When reading the module header, this list is populated with functions that 161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // have bodies later in the file. 162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<Function*> FunctionsWithBodies; 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 164d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // When intrinsic functions are encountered which require upgrading they are 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // stored here with their replacement function. 166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 167932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines UpgradedIntrinsicMap UpgradedIntrinsics; 168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 169932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 170932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines DenseMap<unsigned, unsigned> MDKindMap; 171b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 172d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // Several operations happen after the module header has been read, but 173d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // before function bodies are processed. This keeps track of whether 174d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // we've done this yet. 175d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines bool SeenFirstFunctionBody; 176d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 177932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// DeferredFunctionInfo - When function bodies are initially scanned, this 178932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// map contains info about where to find deferred function body in the 179932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// stream. 180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines DenseMap<Function*, uint64_t> DeferredFunctionInfo; 181b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 182932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These 183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// are resolved lazily when functions are loaded. 184932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy; 185932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; 186932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 187932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// LLVM2_7MetadataDetected - True if metadata produced by LLVM 2.7 or 188932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// earlier was detected, in which case we behave slightly differently, 189932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// for compatibility. 190932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// FIXME: Remove in LLVM 3.0. 191932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool LLVM2_7MetadataDetected; 192f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines static const std::error_category &BitcodeErrorCategory(); 193932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 194932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinespublic: 195d724d097437f40a5689464429f948ec41e4a2415Stephen Hines enum ErrorType { 196d724d097437f40a5689464429f948ec41e4a2415Stephen Hines BitcodeStreamInvalidSize, 197d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ConflictingMETADATA_KINDRecords, 198d724d097437f40a5689464429f948ec41e4a2415Stephen Hines CouldNotFindFunctionInStream, 199d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ExpectedConstant, 200d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InsufficientFunctionProtos, 201d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidBitcodeSignature, 202d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidBitcodeWrapperHeader, 203d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidConstantReference, 204d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidID, // A read identifier is not found in the table it should be in. 205d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidInstructionWithNoBB, 206d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidRecord, // A read record doesn't have the expected size or structure 207d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidTypeForValue, // Type read OK, but is invalid for its use 208d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidTYPETable, 209d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidType, // We were unable to read a type 210d724d097437f40a5689464429f948ec41e4a2415Stephen Hines MalformedBlock, // We are unable to advance in the stream. 211d724d097437f40a5689464429f948ec41e4a2415Stephen Hines MalformedGlobalInitializerSet, 212d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidMultipleBlocks, // We found multiple blocks of a kind that should 213d724d097437f40a5689464429f948ec41e4a2415Stephen Hines // have only one 214d724d097437f40a5689464429f948ec41e4a2415Stephen Hines NeverResolvedValueFoundInFunction, 215d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidValue // Invalid version, inst number, attr number, etc 216d724d097437f40a5689464429f948ec41e4a2415Stephen Hines }; 217d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 218f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code Error(ErrorType E) { 219f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines return std::error_code(E, BitcodeErrorCategory()); 220d724d097437f40a5689464429f948ec41e4a2415Stephen Hines } 221d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 222932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) 223932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), 224d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), 225d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ValueList(C), MDValueList(C), 226d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines SeenFirstFunctionBody(false), LLVM2_7MetadataDetected(false) { 227932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 228932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ~BitcodeReader() { 229932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines FreeState(); 230932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 231b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 232932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void FreeState(); 233b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 234932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer 235932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// when the reader is destroyed. 236932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void setBufferOwned(bool Owned) { BufferOwned = Owned; } 237b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 238f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines void releaseBuffer() { 239f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines Buffer = nullptr; 240f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines } 241f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines 242932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual bool isMaterializable(const GlobalValue *GV) const; 243932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual bool isDematerializable(const GlobalValue *GV) const; 244f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines virtual std::error_code Materialize(GlobalValue *GV); 245f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines virtual std::error_code MaterializeModule(Module *M); 246932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual void Dematerialize(GlobalValue *GV); 247932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 248932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @brief Main interface to parsing a bitcode buffer. 249932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @returns true if an error occurred. 250f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseBitcodeInto(Module *M); 251932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 252932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @brief Cheap mechanism to just extract module triple 253932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @returns true if an error occurred. 254f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseTriple(std::string &Triple); 255d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 256d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines static uint64_t decodeSignRotatedValue(uint64_t V); 257d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 258932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesprivate: 259932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Type *getTypeByID(unsigned ID); 260932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Type *getTypeByIDOrNull(unsigned ID); 261932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *getFnValueByID(unsigned ID, Type *Ty) { 262932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Ty && Ty->isMetadataTy()) 263932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return MDValueList.getValueFwdRef(ID); 264932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ValueList.getValueFwdRef(ID, Ty); 265932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 266932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BasicBlock *getBasicBlock(unsigned ID) const { 267932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (ID >= FunctionBBs.size()) return 0; // Invalid ID 268932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return FunctionBBs[ID]; 269932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 270b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines AttributeSet getAttributes(unsigned i) const { 271932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (i-1 < MAttributes.size()) 272932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return MAttributes[i-1]; 273b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines return AttributeSet(); 274932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 275b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 276932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// getValueTypePair - Read a value/type pair out of the specified record from 277932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// slot 'Slot'. Increment Slot past the number of slots used in the record. 278932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// Return true on failure. 279932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 280932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned InstNum, Value *&ResVal) { 281932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Slot == Record.size()) return true; 282932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned ValNo = (unsigned)Record[Slot++]; 283932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (ValNo < InstNum) { 284932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // If this is not a forward reference, just return the value we already 285932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // have. 286932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResVal = getFnValueByID(ValNo, 0); 287932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ResVal == 0; 288932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } else if (Slot == Record.size()) { 289932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 290932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 291b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 292932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned TypeNo = (unsigned)Record[Slot++]; 293932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 294932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ResVal == 0; 295932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 296932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 297932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Type *Ty, Value *&ResVal) { 298932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Slot == Record.size()) return true; 299932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned ValNo = (unsigned)Record[Slot++]; 300932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResVal = getFnValueByID(ValNo, Ty); 301932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ResVal == 0; 302932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 303932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 304d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 305f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseModule(bool Resume); 306f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseAttributeBlock(); 307f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseTypeTable(); 308f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1 309f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseTypeTableBody(); 310f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines 311f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1 312f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseValueSymbolTable(); 313f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseConstants(); 314f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code RememberAndSkipFunctionBody(); 315f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseFunctionBody(Function *F); 316f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code GlobalCleanup(); 317f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ResolveGlobalAndAliasInits(); 318f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseMetadata(); 319f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseMetadataAttachment(); 320f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseModuleTriple(std::string &Triple); 321f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code InitStream(); 322f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code InitStreamFromBuffer(); 323f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code InitLazyStream(); 324932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; 325b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 326d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines} // End llvm_2_7 namespace 327932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 328932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif 329