BitcodeReader.h revision b730e239619a546d93e5926ea92d698ab77ec7f6
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/GVMaterializer.h" 21b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Attributes.h" 22b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/OperandTraits.h" 23b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Type.h" 24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/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; 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen 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; 134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitstreamReader StreamFile; 135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitstreamCursor Stream; 136932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 137932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *ErrorString; 138b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<Type*> TypeList; 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitcodeReaderValueList ValueList; 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BitcodeReaderMDValueList MDValueList; 142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines SmallVector<Instruction *, 64> InstructionList; 143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 146b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 147932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// MAttributes - The set of attributes by index. Index zero in the 148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// file is for null, and is thus not represented here. As such all indices 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// are off by one. 150b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines std::vector<AttributeSet> MAttributes; 151b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 152932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// FunctionBBs - While parsing a function body, this is a list of the basic 153932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// blocks for the function. 154932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<BasicBlock*> FunctionBBs; 155b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // When reading the module header, this list is populated with functions that 157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // have bodies later in the file. 158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::vector<Function*> FunctionsWithBodies; 159932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // When intrinsic functions are encountered which require upgrading they are 161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // stored here with their replacement function. 162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines UpgradedIntrinsicMap UpgradedIntrinsics; 164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines DenseMap<unsigned, unsigned> MDKindMap; 167b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // After the module header has been read, the FunctionsWithBodies list is 169932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // reversed. This keeps track of whether we've done this yet. 170932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool HasReversedFunctionsWithBodies; 171932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 172932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// DeferredFunctionInfo - When function bodies are initially scanned, this 173932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// map contains info about where to find deferred function body in the 174932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// stream. 175932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines DenseMap<Function*, uint64_t> DeferredFunctionInfo; 176b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 177932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These 178932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// are resolved lazily when functions are loaded. 179932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy; 180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; 181932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 182932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// LLVM2_7MetadataDetected - True if metadata produced by LLVM 2.7 or 183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// earlier was detected, in which case we behave slightly differently, 184932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// for compatibility. 185932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// FIXME: Remove in LLVM 3.0. 186932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool LLVM2_7MetadataDetected; 187932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 188932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinespublic: 189932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) 190932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), 191932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ErrorString(0), ValueList(C), MDValueList(C), 192932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVM2_7MetadataDetected(false) { 193932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines HasReversedFunctionsWithBodies = false; 194932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 195932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ~BitcodeReader() { 196932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines FreeState(); 197932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 198b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 199932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void FreeState(); 200b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 201932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer 202932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// when the reader is destroyed. 203932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void setBufferOwned(bool Owned) { BufferOwned = Owned; } 204b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 205932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual bool isMaterializable(const GlobalValue *GV) const; 206932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual bool isDematerializable(const GlobalValue *GV) const; 207932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual bool Materialize(GlobalValue *GV, std::string *ErrInfo = 0); 208932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual bool MaterializeModule(Module *M, std::string *ErrInfo = 0); 209932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines virtual void Dematerialize(GlobalValue *GV); 210932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 211932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool Error(const char *Str) { 212932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ErrorString = Str; 213932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 214932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 215932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *getErrorString() const { return ErrorString; } 216b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 217932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @brief Main interface to parsing a bitcode buffer. 218932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @returns true if an error occurred. 219932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseBitcodeInto(Module *M); 220932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 221932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @brief Cheap mechanism to just extract module triple 222932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// @returns true if an error occurred. 223932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseTriple(std::string &Triple); 224932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesprivate: 225932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Type *getTypeByID(unsigned ID); 226932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Type *getTypeByIDOrNull(unsigned ID); 227932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Value *getFnValueByID(unsigned ID, Type *Ty) { 228932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Ty && Ty->isMetadataTy()) 229932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return MDValueList.getValueFwdRef(ID); 230932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ValueList.getValueFwdRef(ID, Ty); 231932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 232932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines BasicBlock *getBasicBlock(unsigned ID) const { 233932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (ID >= FunctionBBs.size()) return 0; // Invalid ID 234932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return FunctionBBs[ID]; 235932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 236b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines AttributeSet getAttributes(unsigned i) const { 237932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (i-1 < MAttributes.size()) 238932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return MAttributes[i-1]; 239b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines return AttributeSet(); 240932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 241b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 242932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// getValueTypePair - Read a value/type pair out of the specified record from 243932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// slot 'Slot'. Increment Slot past the number of slots used in the record. 244932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /// Return true on failure. 245932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 246932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned InstNum, Value *&ResVal) { 247932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Slot == Record.size()) return true; 248932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned ValNo = (unsigned)Record[Slot++]; 249932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (ValNo < InstNum) { 250932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // If this is not a forward reference, just return the value we already 251932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // have. 252932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResVal = getFnValueByID(ValNo, 0); 253932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ResVal == 0; 254932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } else if (Slot == Record.size()) { 255932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 256932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 257b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 258932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned TypeNo = (unsigned)Record[Slot++]; 259932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 260932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ResVal == 0; 261932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 262932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 263932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Type *Ty, Value *&ResVal) { 264932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Slot == Record.size()) return true; 265932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned ValNo = (unsigned)Record[Slot++]; 266932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ResVal = getFnValueByID(ValNo, Ty); 267932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return ResVal == 0; 268932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 269932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 270932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 271932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseModule(); 272932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseAttributeBlock(); 273932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseTypeTable(); 274932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1 275932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseTypeTableBody(); 276932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 277932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1 278932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseValueSymbolTable(); 279932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseConstants(); 280932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool RememberAndSkipFunctionBody(); 281932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseFunctionBody(Function *F); 282932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ResolveGlobalAndAliasInits(); 283932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseMetadata(); 284932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseMetadataAttachment(); 285932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool ParseModuleTriple(std::string &Triple); 286932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; 287b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines 288932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // End llvm namespace 289932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 290932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif 291