BitcodeReader.h revision c7d67a701663191bcdab2416c11b69fae16d49fb
13bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===// 23bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// 33bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// The LLVM Compiler Infrastructure 43bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// 53bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// This file is distributed under the University of Illinois Open Source 63bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// License. See LICENSE.TXT for details. 73bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// 83bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 93bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// 103bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// This header defines the BitcodeReader class. 113bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// 123bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 133bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 143bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#ifndef BITCODE_READER_H 153bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#define BITCODE_READER_H 163bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 173bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/GVMaterializer.h" 183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Attributes.h" 193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Type.h" 203bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/OperandTraits.h" 213bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Bitcode/BitstreamReader.h" 223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Bitcode/LLVMBitCodes.h" 233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Support/ValueHandle.h" 243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/ADT/DenseMap.h" 253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include <vector> 263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chiennamespace llvm { 283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien class MemoryBuffer; 293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien class LLVMContext; 30c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien} 31c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 32c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chiennamespace llvm_3_0 { 33c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 34c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienusing namespace llvm; 35c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 363bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 373bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// BitcodeReaderValueList Class 383bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 393bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienclass BitcodeReaderValueList { 413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<WeakVH> ValuePtrs; 42c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// ResolveConstants - As we resolve forward-referenced constants, we add 443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// information about them to this vector. This allows us to resolve them in 453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// bulk instead of resolving each reference at a time. See the code in 463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// ResolveConstantForwardRefs for more information about this. 473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// 483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// The key of this vector is the placeholder constant, the value is the slot 493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// number that holds the resolved value. 503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; 513bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResolveConstantsTy ResolveConstants; 523bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien LLVMContext &Context; 533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderValueList(LLVMContext &C) : Context(C) {} 553bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ~BitcodeReaderValueList() { 563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(ResolveConstants.empty() && "Constants not resolved?"); 573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // vector compatibility methods 603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned size() const { return ValuePtrs.size(); } 613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void resize(unsigned N) { ValuePtrs.resize(N); } 623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void push_back(Value *V) { 633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ValuePtrs.push_back(V); 643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 65c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void clear() { 673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(ResolveConstants.empty() && "Constants not resolved?"); 683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ValuePtrs.clear(); 693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 70c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 713bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *operator[](unsigned i) const { 723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(i < ValuePtrs.size()); 733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ValuePtrs[i]; 743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 75c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 763bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *back() const { return ValuePtrs.back(); } 773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void pop_back() { ValuePtrs.pop_back(); } 783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool empty() const { return ValuePtrs.empty(); } 793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void shrinkTo(unsigned N) { 803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(N <= size() && "Invalid shrinkTo request!"); 813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ValuePtrs.resize(N); 823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 83c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Constant *getConstantFwdRef(unsigned Idx, Type *Ty); 853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getValueFwdRef(unsigned Idx, Type *Ty); 86c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 873bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void AssignValue(Value *V, unsigned Idx); 88c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 893bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 903bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// resolves any forward references. 913bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void ResolveConstantForwardRefs(); 923bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 933bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 943bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 953bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 963bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// BitcodeReaderMDValueList Class 973bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 983bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 993bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienclass BitcodeReaderMDValueList { 1003bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<WeakVH> MDValuePtrs; 101c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1023bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien LLVMContext &Context; 1033bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 1043bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderMDValueList(LLVMContext& C) : Context(C) {} 1053bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1063bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // vector compatibility methods 1073bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned size() const { return MDValuePtrs.size(); } 1083bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void resize(unsigned N) { MDValuePtrs.resize(N); } 1093bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void push_back(Value *V) { MDValuePtrs.push_back(V); } 1103bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void clear() { MDValuePtrs.clear(); } 1113bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *back() const { return MDValuePtrs.back(); } 1123bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void pop_back() { MDValuePtrs.pop_back(); } 1133bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool empty() const { return MDValuePtrs.empty(); } 114c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1153bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *operator[](unsigned i) const { 1163bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(i < MDValuePtrs.size()); 1173bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MDValuePtrs[i]; 1183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 119c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1203bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void shrinkTo(unsigned N) { 1213bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(N <= size() && "Invalid shrinkTo request!"); 1223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien MDValuePtrs.resize(N); 1233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 1243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getValueFwdRef(unsigned Idx); 1263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void AssignValue(Value *V, unsigned Idx); 1273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 1283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienclass BitcodeReader : public GVMaterializer { 1303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien LLVMContext &Context; 1313bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Module *TheModule; 1323bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien MemoryBuffer *Buffer; 1333bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool BufferOwned; 1343bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitstreamReader StreamFile; 1353bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitstreamCursor Stream; 136c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1373bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien const char *ErrorString; 138c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1393bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<Type*> TypeList; 1403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderValueList ValueList; 1413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderMDValueList MDValueList; 1423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien SmallVector<Instruction *, 64> InstructionList; 1433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 1453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 146c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// MAttributes - The set of attributes by index. Index zero in the 1483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// file is for null, and is thus not represented here. As such all indices 1493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// are off by one. 1503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<AttrListPtr> MAttributes; 151c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1523bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// FunctionBBs - While parsing a function body, this is a list of the basic 1533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// blocks for the function. 1543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<BasicBlock*> FunctionBBs; 155c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // When reading the module header, this list is populated with functions that 1573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // have bodies later in the file. 1583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<Function*> FunctionsWithBodies; 1593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 160c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien // When intrinsic functions are encountered which require upgrading they are 1613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // stored here with their replacement function. 1623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 1633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien UpgradedIntrinsicMap UpgradedIntrinsics; 1643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1653bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 1663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<unsigned, unsigned> MDKindMap; 167c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 168c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien // After the module header has been read, the FunctionsWithBodies list is 1693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // reversed. This keeps track of whether we've done this yet. 1703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool HasReversedFunctionsWithBodies; 171c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// DeferredFunctionInfo - When function bodies are initially scanned, this 1733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// map contains info about where to find deferred function body in the 1743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// stream. 1753bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<Function*, uint64_t> DeferredFunctionInfo; 176c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These 1783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// are resolved lazily when functions are loaded. 1793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy; 1803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; 1813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 1833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) 1843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), 1853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ErrorString(0), ValueList(C), MDValueList(C) { 1863bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien HasReversedFunctionsWithBodies = false; 1873bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 1883bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ~BitcodeReader() { 1893bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien FreeState(); 1903bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 191c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1923bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void FreeState(); 193c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1943bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer 1953bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// when the reader is destroyed. 1963bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void setBufferOwned(bool Owned) { BufferOwned = Owned; } 197c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1983bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool isMaterializable(const GlobalValue *GV) const; 1993bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool isDematerializable(const GlobalValue *GV) const; 2003bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool Materialize(GlobalValue *GV, std::string *ErrInfo = 0); 2013bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool MaterializeModule(Module *M, std::string *ErrInfo = 0); 2023bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual void Dematerialize(GlobalValue *GV); 2033bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2043bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool Error(const char *Str) { 2053bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ErrorString = Str; 2063bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return true; 2073bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2083bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien const char *getErrorString() const { return ErrorString; } 209c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2103bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @brief Main interface to parsing a bitcode buffer. 2113bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @returns true if an error occurred. 2123bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseBitcodeInto(Module *M); 2133bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2143bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @brief Cheap mechanism to just extract module triple 2153bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @returns true if an error occurred. 2163bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseTriple(std::string &Triple); 2173bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienprivate: 2183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *getTypeByID(unsigned ID); 2193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *getTypeByIDOrNull(unsigned ID); 2203bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getFnValueByID(unsigned ID, Type *Ty) { 2213bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Ty && Ty->isMetadataTy()) 2223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MDValueList.getValueFwdRef(ID); 2233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ValueList.getValueFwdRef(ID, Ty); 2243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BasicBlock *getBasicBlock(unsigned ID) const { 2263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (ID >= FunctionBBs.size()) return 0; // Invalid ID 2273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return FunctionBBs[ID]; 2283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien AttrListPtr getAttributes(unsigned i) const { 2303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (i-1 < MAttributes.size()) 2313bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MAttributes[i-1]; 2323bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return AttrListPtr(); 2333bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 234c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2353bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// getValueTypePair - Read a value/type pair out of the specified record from 2363bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// slot 'Slot'. Increment Slot past the number of slots used in the record. 2373bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// Return true on failure. 2383bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2393bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned InstNum, Value *&ResVal) { 2403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Slot == Record.size()) return true; 2413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned ValNo = (unsigned)Record[Slot++]; 2423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (ValNo < InstNum) { 2433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // If this is not a forward reference, just return the value we already 2443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // have. 2453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, 0); 2463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } else if (Slot == Record.size()) { 2483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return true; 2493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 250c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2513bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned TypeNo = (unsigned)Record[Slot++]; 2523bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 2533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2553bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *Ty, Value *&ResVal) { 2573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Slot == Record.size()) return true; 2583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned ValNo = (unsigned)Record[Slot++]; 2593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, Ty); 2603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 263c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseModule(); 2653bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseAttributeBlock(); 2663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseTypeTable(); 2673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1 2683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseTypeTableBody(); 2693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1 2713bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseValueSymbolTable(); 2723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseConstants(); 2733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool RememberAndSkipFunctionBody(); 2743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseFunctionBody(Function *F); 2753bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ResolveGlobalAndAliasInits(); 2763bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseMetadata(); 2773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseMetadataAttachment(); 2783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool ParseModuleTriple(std::string &Triple); 2793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 280c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 281c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien} // End llvm_3_0 namespace 2823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#endif 284