BitcodeReader.h revision c2074caf075818abb6d3689ad924ca09f4a5ba1f
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 17b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/ADT/DenseMap.h" 18c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray#include "llvm/ADT/OwningPtr.h" 193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Bitcode/BitstreamReader.h" 203bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Bitcode/LLVMBitCodes.h" 21b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Attributes.h" 22c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray#include "llvm/IR/GVMaterializer.h" 23b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/OperandTraits.h" 24b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Type.h" 25c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray#include "llvm/IR/ValueHandle.h" 263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include <vector> 273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chiennamespace llvm { 293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien class MemoryBuffer; 303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien class LLVMContext; 31c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien} 32c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 33c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chiennamespace llvm_3_0 { 34c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 35c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienusing namespace llvm; 36c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 373bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 383bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// BitcodeReaderValueList Class 393bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienclass BitcodeReaderValueList { 423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<WeakVH> ValuePtrs; 43c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// ResolveConstants - As we resolve forward-referenced constants, we add 453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// information about them to this vector. This allows us to resolve them in 463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// bulk instead of resolving each reference at a time. See the code in 473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// ResolveConstantForwardRefs for more information about this. 483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// 493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// The key of this vector is the placeholder constant, the value is the slot 503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// number that holds the resolved value. 513bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; 523bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResolveConstantsTy ResolveConstants; 533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien LLVMContext &Context; 543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 553bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderValueList(LLVMContext &C) : Context(C) {} 563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ~BitcodeReaderValueList() { 573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(ResolveConstants.empty() && "Constants not resolved?"); 583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // vector compatibility methods 613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned size() const { return ValuePtrs.size(); } 623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void resize(unsigned N) { ValuePtrs.resize(N); } 633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void push_back(Value *V) { 643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ValuePtrs.push_back(V); 653bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 66c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void clear() { 683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(ResolveConstants.empty() && "Constants not resolved?"); 693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ValuePtrs.clear(); 703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 71c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *operator[](unsigned i) const { 733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(i < ValuePtrs.size()); 743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ValuePtrs[i]; 753bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 76c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *back() const { return ValuePtrs.back(); } 783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void pop_back() { ValuePtrs.pop_back(); } 793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool empty() const { return ValuePtrs.empty(); } 803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void shrinkTo(unsigned N) { 813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(N <= size() && "Invalid shrinkTo request!"); 823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ValuePtrs.resize(N); 833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 84c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Constant *getConstantFwdRef(unsigned Idx, Type *Ty); 863bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getValueFwdRef(unsigned Idx, Type *Ty); 87c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 883bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void AssignValue(Value *V, unsigned Idx); 89c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 903bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// ResolveConstantForwardRefs - Once all constants are read, this method bulk 913bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// resolves any forward references. 923bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void ResolveConstantForwardRefs(); 933bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 943bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 953bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 963bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 973bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien// BitcodeReaderMDValueList Class 983bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien//===----------------------------------------------------------------------===// 993bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1003bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienclass BitcodeReaderMDValueList { 1013bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<WeakVH> MDValuePtrs; 102c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1033bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien LLVMContext &Context; 1043bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 1053bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderMDValueList(LLVMContext& C) : Context(C) {} 1063bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1073bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // vector compatibility methods 1083bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned size() const { return MDValuePtrs.size(); } 1093bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void resize(unsigned N) { MDValuePtrs.resize(N); } 1103bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void push_back(Value *V) { MDValuePtrs.push_back(V); } 1113bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void clear() { MDValuePtrs.clear(); } 1123bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *back() const { return MDValuePtrs.back(); } 1133bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void pop_back() { MDValuePtrs.pop_back(); } 1143bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool empty() const { return MDValuePtrs.empty(); } 115c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1163bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *operator[](unsigned i) const { 1173bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(i < MDValuePtrs.size()); 1183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MDValuePtrs[i]; 1193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 120c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1213bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void shrinkTo(unsigned N) { 1223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien assert(N <= size() && "Invalid shrinkTo request!"); 1233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien MDValuePtrs.resize(N); 1243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 1253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getValueFwdRef(unsigned Idx); 1273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void AssignValue(Value *V, unsigned Idx); 1283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 1293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienclass BitcodeReader : public GVMaterializer { 1313bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien LLVMContext &Context; 1323bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Module *TheModule; 1333bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien MemoryBuffer *Buffer; 1343bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool BufferOwned; 135d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines OwningPtr<BitstreamReader> StreamFile; 1363bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitstreamCursor Stream; 137d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines DataStreamer *LazyStreamer; 138d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines uint64_t NextUnreadBit; 139d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines bool SeenValueSymbolTable; 140c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<Type*> TypeList; 1423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderValueList ValueList; 1433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderMDValueList MDValueList; 1443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien SmallVector<Instruction *, 64> InstructionList; 1453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 1473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 148c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// MAttributes - The set of attributes by index. Index zero in the 1503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// file is for null, and is thus not represented here. As such all indices 1513bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// are off by one. 152b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines std::vector<AttributeSet> MAttributes; 153c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 154d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines /// \brief The set of attribute groups. 155d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines std::map<unsigned, AttributeSet> MAttributeGroups; 156d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 1573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// FunctionBBs - While parsing a function body, this is a list of the basic 1583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// blocks for the function. 1593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<BasicBlock*> FunctionBBs; 160c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // When reading the module header, this list is populated with functions that 1623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // have bodies later in the file. 1633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<Function*> FunctionsWithBodies; 1643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 165c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien // When intrinsic functions are encountered which require upgrading they are 1663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // stored here with their replacement function. 1673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 1683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien UpgradedIntrinsicMap UpgradedIntrinsics; 1693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 1713bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<unsigned, unsigned> MDKindMap; 172c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 173d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // Several operations happen after the module header has been read, but 174d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // before function bodies are processed. This keeps track of whether 175d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines // we've done this yet. 176d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines bool SeenFirstFunctionBody; 177c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// DeferredFunctionInfo - When function bodies are initially scanned, this 1793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// map contains info about where to find deferred function body in the 1803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// stream. 1813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<Function*, uint64_t> DeferredFunctionInfo; 182c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These 1843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// are resolved lazily when functions are loaded. 1853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy; 1863bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; 1873bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 188d724d097437f40a5689464429f948ec41e4a2415Stephen Hines static const error_category &BitcodeErrorCategory(); 189d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 1903bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 191d724d097437f40a5689464429f948ec41e4a2415Stephen Hines enum ErrorType { 192d724d097437f40a5689464429f948ec41e4a2415Stephen Hines BitcodeStreamInvalidSize, 193d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ConflictingMETADATA_KINDRecords, 194d724d097437f40a5689464429f948ec41e4a2415Stephen Hines CouldNotFindFunctionInStream, 195d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ExpectedConstant, 196d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InsufficientFunctionProtos, 197d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidBitcodeSignature, 198d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidBitcodeWrapperHeader, 199d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidConstantReference, 200d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidID, // A read identifier is not found in the table it should be in. 201d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidInstructionWithNoBB, 202d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidRecord, // A read record doesn't have the expected size or structure 203d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidTypeForValue, // Type read OK, but is invalid for its use 204d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidTYPETable, 205d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidType, // We were unable to read a type 206d724d097437f40a5689464429f948ec41e4a2415Stephen Hines MalformedBlock, // We are unable to advance in the stream. 207d724d097437f40a5689464429f948ec41e4a2415Stephen Hines MalformedGlobalInitializerSet, 208d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidMultipleBlocks, // We found multiple blocks of a kind that should 209d724d097437f40a5689464429f948ec41e4a2415Stephen Hines // have only one 210d724d097437f40a5689464429f948ec41e4a2415Stephen Hines NeverResolvedValueFoundInFunction, 211d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidValue // Invalid version, inst number, attr number, etc 212d724d097437f40a5689464429f948ec41e4a2415Stephen Hines }; 213d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 214d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code Error(ErrorType E) { 215d724d097437f40a5689464429f948ec41e4a2415Stephen Hines return error_code(E, BitcodeErrorCategory()); 216d724d097437f40a5689464429f948ec41e4a2415Stephen Hines } 217d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 2183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) 2193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), 220d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), 221d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ValueList(C), MDValueList(C), 222d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines SeenFirstFunctionBody(false) { 2233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ~BitcodeReader() { 2253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien FreeState(); 2263bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 227c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2283bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void FreeState(); 229c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer 2313bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// when the reader is destroyed. 2323bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void setBufferOwned(bool Owned) { BufferOwned = Owned; } 233c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2343bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool isMaterializable(const GlobalValue *GV) const; 2353bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool isDematerializable(const GlobalValue *GV) const; 236d724d097437f40a5689464429f948ec41e4a2415Stephen Hines virtual error_code Materialize(GlobalValue *GV); 237d724d097437f40a5689464429f948ec41e4a2415Stephen Hines virtual error_code MaterializeModule(Module *M); 2383bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual void Dematerialize(GlobalValue *GV); 2393bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @brief Main interface to parsing a bitcode buffer. 2413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @returns true if an error occurred. 242d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseBitcodeInto(Module *M); 2433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @brief Cheap mechanism to just extract module triple 2453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @returns true if an error occurred. 246d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseTriple(std::string &Triple); 247d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 248d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines static uint64_t decodeSignRotatedValue(uint64_t V); 249d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 2503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienprivate: 2513bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *getTypeByID(unsigned ID); 2523bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *getTypeByIDOrNull(unsigned ID); 2533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getFnValueByID(unsigned ID, Type *Ty) { 2543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Ty && Ty->isMetadataTy()) 2553bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MDValueList.getValueFwdRef(ID); 2563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ValueList.getValueFwdRef(ID, Ty); 2573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BasicBlock *getBasicBlock(unsigned ID) const { 2593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (ID >= FunctionBBs.size()) return 0; // Invalid ID 2603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return FunctionBBs[ID]; 2613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 262b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines AttributeSet getAttributes(unsigned i) const { 2633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (i-1 < MAttributes.size()) 2643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MAttributes[i-1]; 265b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines return AttributeSet(); 2663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 267c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// getValueTypePair - Read a value/type pair out of the specified record from 2693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// slot 'Slot'. Increment Slot past the number of slots used in the record. 2703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// Return true on failure. 2713bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned InstNum, Value *&ResVal) { 2733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Slot == Record.size()) return true; 2743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned ValNo = (unsigned)Record[Slot++]; 2753bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (ValNo < InstNum) { 2763bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // If this is not a forward reference, just return the value we already 2773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // have. 2783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, 0); 2793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } else if (Slot == Record.size()) { 2813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return true; 2823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 283c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned TypeNo = (unsigned)Record[Slot++]; 2853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 2863bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2873bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2883bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2893bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *Ty, Value *&ResVal) { 2903bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Slot == Record.size()) return true; 2913bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned ValNo = (unsigned)Record[Slot++]; 2923bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, Ty); 2933bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2943bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2953bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 296c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 297d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseModule(bool Resume); 298d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseAttributeBlock(); 299d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseTypeTable(); 300d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1 301d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseTypeTableBody(); 302d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 303d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1 304d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseValueSymbolTable(); 305d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseConstants(); 306d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code RememberAndSkipFunctionBody(); 307d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseFunctionBody(Function *F); 308d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code GlobalCleanup(); 309d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ResolveGlobalAndAliasInits(); 310d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseMetadata(); 311d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseMetadataAttachment(); 312d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code ParseModuleTriple(std::string &Triple); 313d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code InitStream(); 314d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code InitStreamFromBuffer(); 315d724d097437f40a5689464429f948ec41e4a2415Stephen Hines error_code InitLazyStream(); 3163bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 317c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 318c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien} // End llvm_3_0 namespace 3193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 3203bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#endif 321