BitcodeReader.h revision 6994040a952e5fb27605eb3cf29ed86c4e59cf62
1caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===// 2caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 3caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// The LLVM Compiler Infrastructure 4caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 5caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// This file was developed by Chris Lattner and is distributed under 6caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 7caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 8caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===----------------------------------------------------------------------===// 9caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 10caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// This header defines the BitcodeReader class. 11caee0dccffb77a003681345ab3281bcf8684526cChris Lattner// 12caee0dccffb77a003681345ab3281bcf8684526cChris Lattner//===----------------------------------------------------------------------===// 13caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 14caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#ifndef BITCODE_READER_H 15caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#define BITCODE_READER_H 16caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 17caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#include "llvm/ModuleProvider.h" 18522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner#include "llvm/Type.h" 19522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner#include "llvm/User.h" 2048f848716e80d01619b239111db48bfac77baad1Chris Lattner#include "llvm/Bitcode/BitstreamReader.h" 2147f96bf24687b5068aec7166cb8b3ac33ae964aeChris Lattner#include "llvm/Bitcode/LLVMBitCodes.h" 2248f848716e80d01619b239111db48bfac77baad1Chris Lattner#include "llvm/ADT/DenseMap.h" 23caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#include <vector> 24caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 25caee0dccffb77a003681345ab3281bcf8684526cChris Lattnernamespace llvm { 26c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner class MemoryBuffer; 2748c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner class ParamAttrsList; 28522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 29522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerclass BitcodeReaderValueList : public User { 30522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner std::vector<Use> Uses; 31522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerpublic: 32522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0) {} 33522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 34522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner // vector compatibility methods 35522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner unsigned size() const { return getNumOperands(); } 36522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void push_back(Value *V) { 37522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses.push_back(Use(V, this)); 38522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner OperandList = &Uses[0]; 39522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner ++NumOperands; 40522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 41522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 42b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner void clear() { 43b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner std::vector<Use>().swap(Uses); 44b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner } 45b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner 46522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *operator[](unsigned i) const { return getOperand(i); } 47522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 48522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *back() const { return Uses.back(); } 49522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void pop_back() { Uses.pop_back(); --NumOperands; } 50522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner bool empty() const { return NumOperands == 0; } 51198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner void shrinkTo(unsigned N) { 52980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner assert(N <= NumOperands && "Invalid shrinkTo request!"); 53198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner Uses.resize(N); 54198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner NumOperands = N; 55198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner } 56522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner virtual void print(std::ostream&) const {} 57522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 58522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Constant *getConstantFwdRef(unsigned Idx, const Type *Ty); 59a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner Value *getValueFwdRef(unsigned Idx, const Type *Ty); 60a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner 61a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner void AssignValue(Value *V, unsigned Idx) { 62a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner if (Idx == size()) { 63a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner push_back(V); 64a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } else if (Value *OldV = getOperand(Idx)) { 65a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner // If there was a forward reference to this value, replace it. 66a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner setOperand(Idx, V); 67a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner OldV->replaceAllUsesWith(V); 68a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner delete OldV; 69a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } else { 70a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner initVal(Idx, V); 71a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 72a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 73a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner 74a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattnerprivate: 75522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void initVal(unsigned Idx, Value *V) { 76522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner assert(Uses[Idx] == 0 && "Cannot init an already init'd Use!"); 77522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses[Idx].init(V, this); 78522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 79522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner}; 80522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 81caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 82caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerclass BitcodeReader : public ModuleProvider { 83c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner MemoryBuffer *Buffer; 8448f848716e80d01619b239111db48bfac77baad1Chris Lattner BitstreamReader Stream; 8548f848716e80d01619b239111db48bfac77baad1Chris Lattner 86caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *ErrorString; 87caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 88caee0dccffb77a003681345ab3281bcf8684526cChris Lattner std::vector<PATypeHolder> TypeList; 89522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList ValueList; 90e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 9107d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 9248f848716e80d01619b239111db48bfac77baad1Chris Lattner 9348c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// ParamAttrs - The set of parameter attributes by index. Index zero in the 9448c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// file is for null, and is thus not represented here. As such all indices 9548c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// are off by one. 9648c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner std::vector<const ParamAttrsList*> ParamAttrs; 9748c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner 98980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// FunctionBBs - While parsing a function body, this is a list of the basic 99980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// blocks for the function. 100980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner std::vector<BasicBlock*> FunctionBBs; 101980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner 10248f848716e80d01619b239111db48bfac77baad1Chris Lattner // When reading the module header, this list is populated with functions that 10348f848716e80d01619b239111db48bfac77baad1Chris Lattner // have bodies later in the file. 10448f848716e80d01619b239111db48bfac77baad1Chris Lattner std::vector<Function*> FunctionsWithBodies; 1056994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth 1066994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // When intrinsic functions are encountered which require upgrading they are 1076994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // stored here with their replacement function. 1086994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth typedef std::vector<std::pair<Function*, Function*> > UpgradedIntrinsicMap; 1096994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth UpgradedIntrinsicMap UpgradedIntrinsics; 11048f848716e80d01619b239111db48bfac77baad1Chris Lattner 11148f848716e80d01619b239111db48bfac77baad1Chris Lattner // After the module header has been read, the FunctionsWithBodies list is 11248f848716e80d01619b239111db48bfac77baad1Chris Lattner // reversed. This keeps track of whether we've done this yet. 11348f848716e80d01619b239111db48bfac77baad1Chris Lattner bool HasReversedFunctionsWithBodies; 11448f848716e80d01619b239111db48bfac77baad1Chris Lattner 11548f848716e80d01619b239111db48bfac77baad1Chris Lattner /// DeferredFunctionInfo - When function bodies are initially scanned, this 11648f848716e80d01619b239111db48bfac77baad1Chris Lattner /// map contains info about where to find deferred function body (in the 11748f848716e80d01619b239111db48bfac77baad1Chris Lattner /// stream) and what linkage the original function had. 11848f848716e80d01619b239111db48bfac77baad1Chris Lattner DenseMap<Function*, std::pair<uint64_t, unsigned> > DeferredFunctionInfo; 119caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerpublic: 12048f848716e80d01619b239111db48bfac77baad1Chris Lattner BitcodeReader(MemoryBuffer *buffer) : Buffer(buffer), ErrorString(0) { 12148f848716e80d01619b239111db48bfac77baad1Chris Lattner HasReversedFunctionsWithBodies = false; 12248f848716e80d01619b239111db48bfac77baad1Chris Lattner } 123b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner ~BitcodeReader() { 124b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner FreeState(); 125b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner } 126caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 127b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner void FreeState(); 128c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner 129c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// releaseMemoryBuffer - This causes the reader to completely forget about 130c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// the memory buffer it contains, which prevents the buffer from being 131c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// destroyed when it is deleted. 132c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner void releaseMemoryBuffer() { 133c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner Buffer = 0; 134c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner } 135caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 13648f848716e80d01619b239111db48bfac77baad1Chris Lattner virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0); 137980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner virtual Module *materializeModule(std::string *ErrInfo = 0); 138d67c632d968157e228cf42b588f8759059730ec0Chris Lattner virtual void dematerializeFunction(Function *F); 139b348bb81253a1105d23ab1a1771f8d2a6546aa1bChris Lattner virtual Module *releaseModule(std::string *ErrInfo = 0); 140d67c632d968157e228cf42b588f8759059730ec0Chris Lattner 141caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool Error(const char *Str) { 142caee0dccffb77a003681345ab3281bcf8684526cChris Lattner ErrorString = Str; 143caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return true; 144caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 145caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *getErrorString() const { return ErrorString; } 146caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 147caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @brief Main interface to parsing a bitcode buffer. 148caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @returns true if an error occurred. 149c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner bool ParseBitcode(); 150caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerprivate: 151caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const Type *getTypeByID(unsigned ID, bool isTypeTable = false); 152a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner Value *getFnValueByID(unsigned ID, const Type *Ty) { 153a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner return ValueList.getValueFwdRef(ID, Ty); 154a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 155f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner BasicBlock *getBasicBlock(unsigned ID) const { 156f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner if (ID >= FunctionBBs.size()) return 0; // Invalid ID 157f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner return FunctionBBs[ID]; 158f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner } 15948c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner const ParamAttrsList *getParamAttrs(unsigned i) const { 16048c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner if (i-1 < ParamAttrs.size()) 16148c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner return ParamAttrs[i-1]; 16248c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner return 0; 16348c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner } 1647337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner 1657337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// getValueTypePair - Read a value/type pair out of the specified record from 1667337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// slot 'Slot'. Increment Slot past the number of slots used in the record. 1677337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// Return true on failure. 1687337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 1697337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner unsigned InstNum, Value *&ResVal) { 1707337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (Slot == Record.size()) return true; 171650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned ValNo = (unsigned)Record[Slot++]; 1727337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (ValNo < InstNum) { 1737337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner // If this is not a forward reference, just return the value we already 1747337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner // have. 1757337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, 0); 1767337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1777337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } else if (Slot == Record.size()) { 1787337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return true; 1797337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 1807337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner 181650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned TypeNo = (unsigned)Record[Slot++]; 1827337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 1837337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1847337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 1857337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 1867337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner const Type *Ty, Value *&ResVal) { 1877337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (Slot == Record.size()) return true; 188650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned ValNo = (unsigned)Record[Slot++]; 1897337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, Ty); 1907337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1917337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 19248c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner 193caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 194866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseModule(const std::string &ModuleID); 19548c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner bool ParseParamAttrBlock(); 196866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeTable(); 197866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeSymbolTable(); 198866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseValueSymbolTable(); 199866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseConstants(); 200980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool RememberAndSkipFunctionBody(); 201980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool ParseFunctionBody(Function *F); 20207d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner bool ResolveGlobalAndAliasInits(); 203caee0dccffb77a003681345ab3281bcf8684526cChris Lattner}; 204caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 205caee0dccffb77a003681345ab3281bcf8684526cChris Lattner} // End llvm namespace 206caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 207caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#endif 208