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" 183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#include "llvm/Bitcode/BitstreamReader.h" 193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#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" 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; 134f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::unique_ptr<BitstreamReader> StreamFile; 1353bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitstreamCursor Stream; 136d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines DataStreamer *LazyStreamer; 137d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines uint64_t NextUnreadBit; 138d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines bool SeenValueSymbolTable; 139c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1403bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<Type*> TypeList; 1413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderValueList ValueList; 1423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BitcodeReaderMDValueList MDValueList; 1433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien SmallVector<Instruction *, 64> InstructionList; 1443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1453bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 1463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 147c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// MAttributes - The set of attributes by index. Index zero in the 1493bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// file is for null, and is thus not represented here. As such all indices 1503bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// are off by one. 151b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines std::vector<AttributeSet> MAttributes; 152c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 153d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines /// \brief The set of attribute groups. 154d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines std::map<unsigned, AttributeSet> MAttributeGroups; 155d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 1563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// FunctionBBs - While parsing a function body, this is a list of the basic 1573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// blocks for the function. 1583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<BasicBlock*> FunctionBBs; 159c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // When reading the module header, this list is populated with functions that 1613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // have bodies later in the file. 1623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien std::vector<Function*> FunctionsWithBodies; 1633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 164c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien // When intrinsic functions are encountered which require upgrading they are 1653bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // stored here with their replacement function. 1663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 1673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien UpgradedIntrinsicMap UpgradedIntrinsics; 1683bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 1693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 1703bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<unsigned, unsigned> MDKindMap; 171c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 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; 176c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// DeferredFunctionInfo - When function bodies are initially scanned, this 1783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// map contains info about where to find deferred function body in the 1793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// stream. 1803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<Function*, uint64_t> DeferredFunctionInfo; 181c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 1823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These 1833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// are resolved lazily when functions are loaded. 1843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy; 1853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs; 1863bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 187f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines static const std::error_category &BitcodeErrorCategory(); 188d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 1893bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienpublic: 190d724d097437f40a5689464429f948ec41e4a2415Stephen Hines enum ErrorType { 191d724d097437f40a5689464429f948ec41e4a2415Stephen Hines BitcodeStreamInvalidSize, 192d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ConflictingMETADATA_KINDRecords, 193d724d097437f40a5689464429f948ec41e4a2415Stephen Hines CouldNotFindFunctionInStream, 194d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ExpectedConstant, 195d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InsufficientFunctionProtos, 196d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidBitcodeSignature, 197d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidBitcodeWrapperHeader, 198d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidConstantReference, 199d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidID, // A read identifier is not found in the table it should be in. 200d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidInstructionWithNoBB, 201d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidRecord, // A read record doesn't have the expected size or structure 202d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidTypeForValue, // Type read OK, but is invalid for its use 203d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidTYPETable, 204d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidType, // We were unable to read a type 205d724d097437f40a5689464429f948ec41e4a2415Stephen Hines MalformedBlock, // We are unable to advance in the stream. 206d724d097437f40a5689464429f948ec41e4a2415Stephen Hines MalformedGlobalInitializerSet, 207d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidMultipleBlocks, // We found multiple blocks of a kind that should 208d724d097437f40a5689464429f948ec41e4a2415Stephen Hines // have only one 209d724d097437f40a5689464429f948ec41e4a2415Stephen Hines NeverResolvedValueFoundInFunction, 210d724d097437f40a5689464429f948ec41e4a2415Stephen Hines InvalidValue // Invalid version, inst number, attr number, etc 211d724d097437f40a5689464429f948ec41e4a2415Stephen Hines }; 212d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 213f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code Error(ErrorType E) { 214f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines return std::error_code(E, BitcodeErrorCategory()); 215d724d097437f40a5689464429f948ec41e4a2415Stephen Hines } 216d724d097437f40a5689464429f948ec41e4a2415Stephen Hines 2173bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) 2183bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), 219d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), 220d724d097437f40a5689464429f948ec41e4a2415Stephen Hines ValueList(C), MDValueList(C), 221d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines SeenFirstFunctionBody(false) { 2223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ~BitcodeReader() { 2243bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien FreeState(); 2253bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 226c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2273bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void FreeState(); 228c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2293bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer 2303bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// when the reader is destroyed. 2313bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien void setBufferOwned(bool Owned) { BufferOwned = Owned; } 232c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 233f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines void releaseBuffer() { 234f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines Buffer = nullptr; 235f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines } 236f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines 2373bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool isMaterializable(const GlobalValue *GV) const; 2383bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual bool isDematerializable(const GlobalValue *GV) const; 239f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines virtual std::error_code Materialize(GlobalValue *GV); 240f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines virtual std::error_code MaterializeModule(Module *M); 2413bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien virtual void Dematerialize(GlobalValue *GV); 2423bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2433bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @brief Main interface to parsing a bitcode buffer. 2443bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @returns true if an error occurred. 245f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseBitcodeInto(Module *M); 2463bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 2473bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @brief Cheap mechanism to just extract module triple 2483bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// @returns true if an error occurred. 249f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseTriple(std::string &Triple); 250d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 251d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines static uint64_t decodeSignRotatedValue(uint64_t V); 252d9216ebb9c114242b713cd4dad33b3a83eb86761Stephen Hines 2533bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chienprivate: 2543bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *getTypeByID(unsigned ID); 2553bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *getTypeByIDOrNull(unsigned ID); 2563bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Value *getFnValueByID(unsigned ID, Type *Ty) { 2573bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Ty && Ty->isMetadataTy()) 2583bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MDValueList.getValueFwdRef(ID); 2593bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ValueList.getValueFwdRef(ID, Ty); 2603bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2613bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien BasicBlock *getBasicBlock(unsigned ID) const { 2623bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (ID >= FunctionBBs.size()) return 0; // Invalid ID 2633bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return FunctionBBs[ID]; 2643bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 265b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines AttributeSet getAttributes(unsigned i) const { 2663bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (i-1 < MAttributes.size()) 2673bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return MAttributes[i-1]; 268b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines return AttributeSet(); 2693bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 270c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2713bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// getValueTypePair - Read a value/type pair out of the specified record from 2723bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// slot 'Slot'. Increment Slot past the number of slots used in the record. 2733bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien /// Return true on failure. 2743bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2753bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned InstNum, Value *&ResVal) { 2763bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Slot == Record.size()) return true; 2773bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned ValNo = (unsigned)Record[Slot++]; 2783bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (ValNo < InstNum) { 2793bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // If this is not a forward reference, just return the value we already 2803bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien // have. 2813bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, 0); 2823bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2833bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } else if (Slot == Record.size()) { 2843bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return true; 2853bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 286c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 2873bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned TypeNo = (unsigned)Record[Slot++]; 2883bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 2893bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2903bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2913bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 2923bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien Type *Ty, Value *&ResVal) { 2933bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien if (Slot == Record.size()) return true; 2943bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien unsigned ValNo = (unsigned)Record[Slot++]; 2953bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien ResVal = getFnValueByID(ValNo, Ty); 2963bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien return ResVal == 0; 2973bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien } 2983bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 299c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 300f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseModule(bool Resume); 301f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseAttributeBlock(); 302f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseTypeTable(); 303f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1 304f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseTypeTableBody(); 305f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines 306f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1 307f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseValueSymbolTable(); 308f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseConstants(); 309f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code RememberAndSkipFunctionBody(); 310f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseFunctionBody(Function *F); 311f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code GlobalCleanup(); 312f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ResolveGlobalAndAliasInits(); 313f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseMetadata(); 314f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseMetadataAttachment(); 315f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code ParseModuleTriple(std::string &Triple); 316f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code InitStream(); 317f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code InitStreamFromBuffer(); 318f21590eae009b4f596d7e448d0b8e142c46fc382Stephen Hines std::error_code InitLazyStream(); 3193bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien}; 320c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 321c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien} // End llvm_3_0 namespace 3223bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien 3233bdc2a8fde18e9e82a1e6ccef1c7379ef57bca35Logan Chien#endif 324