BitcodeReader.h revision d67c632d968157e228cf42b588f8759059730ec0
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 42522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *operator[](unsigned i) const { return getOperand(i); } 43522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 44522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *back() const { return Uses.back(); } 45522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void pop_back() { Uses.pop_back(); --NumOperands; } 46522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner bool empty() const { return NumOperands == 0; } 47198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner void shrinkTo(unsigned N) { 48980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner assert(N <= NumOperands && "Invalid shrinkTo request!"); 49198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner Uses.resize(N); 50198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner NumOperands = N; 51198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner } 52522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner virtual void print(std::ostream&) const {} 53522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 54522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Constant *getConstantFwdRef(unsigned Idx, const Type *Ty); 55a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner Value *getValueFwdRef(unsigned Idx, const Type *Ty); 56a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner 57a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner void AssignValue(Value *V, unsigned Idx) { 58a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner if (Idx == size()) { 59a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner push_back(V); 60a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } else if (Value *OldV = getOperand(Idx)) { 61a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner // If there was a forward reference to this value, replace it. 62a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner setOperand(Idx, V); 63a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner OldV->replaceAllUsesWith(V); 64a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner delete OldV; 65a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } else { 66a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner initVal(Idx, V); 67a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 68a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 69a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner 70a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattnerprivate: 71522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void initVal(unsigned Idx, Value *V) { 72522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner assert(Uses[Idx] == 0 && "Cannot init an already init'd Use!"); 73522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses[Idx].init(V, this); 74522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 75522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner}; 76522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 77caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 78caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerclass BitcodeReader : public ModuleProvider { 79c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner MemoryBuffer *Buffer; 8048f848716e80d01619b239111db48bfac77baad1Chris Lattner BitstreamReader Stream; 8148f848716e80d01619b239111db48bfac77baad1Chris Lattner 82caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *ErrorString; 83caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 84caee0dccffb77a003681345ab3281bcf8684526cChris Lattner std::vector<PATypeHolder> TypeList; 85522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList ValueList; 86e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 8707d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 8848f848716e80d01619b239111db48bfac77baad1Chris Lattner 8948c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// ParamAttrs - The set of parameter attributes by index. Index zero in the 9048c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// file is for null, and is thus not represented here. As such all indices 9148c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner /// are off by one. 9248c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner std::vector<const ParamAttrsList*> ParamAttrs; 9348c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner 94980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// FunctionBBs - While parsing a function body, this is a list of the basic 95980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// blocks for the function. 96980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner std::vector<BasicBlock*> FunctionBBs; 97980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner 9848f848716e80d01619b239111db48bfac77baad1Chris Lattner // When reading the module header, this list is populated with functions that 9948f848716e80d01619b239111db48bfac77baad1Chris Lattner // have bodies later in the file. 10048f848716e80d01619b239111db48bfac77baad1Chris Lattner std::vector<Function*> FunctionsWithBodies; 10148f848716e80d01619b239111db48bfac77baad1Chris Lattner 10248f848716e80d01619b239111db48bfac77baad1Chris Lattner // After the module header has been read, the FunctionsWithBodies list is 10348f848716e80d01619b239111db48bfac77baad1Chris Lattner // reversed. This keeps track of whether we've done this yet. 10448f848716e80d01619b239111db48bfac77baad1Chris Lattner bool HasReversedFunctionsWithBodies; 10548f848716e80d01619b239111db48bfac77baad1Chris Lattner 10648f848716e80d01619b239111db48bfac77baad1Chris Lattner /// DeferredFunctionInfo - When function bodies are initially scanned, this 10748f848716e80d01619b239111db48bfac77baad1Chris Lattner /// map contains info about where to find deferred function body (in the 10848f848716e80d01619b239111db48bfac77baad1Chris Lattner /// stream) and what linkage the original function had. 10948f848716e80d01619b239111db48bfac77baad1Chris Lattner DenseMap<Function*, std::pair<uint64_t, unsigned> > DeferredFunctionInfo; 110caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerpublic: 11148f848716e80d01619b239111db48bfac77baad1Chris Lattner BitcodeReader(MemoryBuffer *buffer) : Buffer(buffer), ErrorString(0) { 11248f848716e80d01619b239111db48bfac77baad1Chris Lattner HasReversedFunctionsWithBodies = false; 11348f848716e80d01619b239111db48bfac77baad1Chris Lattner } 114c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner ~BitcodeReader(); 115caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 116c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner 117c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// releaseMemoryBuffer - This causes the reader to completely forget about 118c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// the memory buffer it contains, which prevents the buffer from being 119c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// destroyed when it is deleted. 120c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner void releaseMemoryBuffer() { 121c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner Buffer = 0; 122c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner } 123caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 12448f848716e80d01619b239111db48bfac77baad1Chris Lattner virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0); 125980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner virtual Module *materializeModule(std::string *ErrInfo = 0); 126d67c632d968157e228cf42b588f8759059730ec0Chris Lattner virtual void dematerializeFunction(Function *F); 127d67c632d968157e228cf42b588f8759059730ec0Chris Lattner 128caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool Error(const char *Str) { 129caee0dccffb77a003681345ab3281bcf8684526cChris Lattner ErrorString = Str; 130caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return true; 131caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 132caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *getErrorString() const { return ErrorString; } 133caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 134caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @brief Main interface to parsing a bitcode buffer. 135caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @returns true if an error occurred. 136c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner bool ParseBitcode(); 137caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerprivate: 138caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const Type *getTypeByID(unsigned ID, bool isTypeTable = false); 139a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner Value *getFnValueByID(unsigned ID, const Type *Ty) { 140a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner return ValueList.getValueFwdRef(ID, Ty); 141a7c49aac984fafa5dfdfcc2762d4d51b26788e38Chris Lattner } 142f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner BasicBlock *getBasicBlock(unsigned ID) const { 143f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner if (ID >= FunctionBBs.size()) return 0; // Invalid ID 144f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner return FunctionBBs[ID]; 145f4c8e5243376af58e52c4a0930d838509bbbea2fChris Lattner } 14648c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner const ParamAttrsList *getParamAttrs(unsigned i) const { 14748c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner if (i-1 < ParamAttrs.size()) 14848c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner return ParamAttrs[i-1]; 14948c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner return 0; 15048c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner } 1517337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner 1527337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// getValueTypePair - Read a value/type pair out of the specified record from 1537337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// slot 'Slot'. Increment Slot past the number of slots used in the record. 1547337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner /// Return true on failure. 1557337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner bool getValueTypePair(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 1567337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner unsigned InstNum, Value *&ResVal) { 1577337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (Slot == Record.size()) return true; 158650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned ValNo = (unsigned)Record[Slot++]; 1597337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (ValNo < InstNum) { 1607337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner // If this is not a forward reference, just return the value we already 1617337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner // have. 1627337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, 0); 1637337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1647337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } else if (Slot == Record.size()) { 1657337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return true; 1667337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 1677337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner 168650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned TypeNo = (unsigned)Record[Slot++]; 1697337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, getTypeByID(TypeNo)); 1707337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1717337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 1727337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner bool getValue(SmallVector<uint64_t, 64> &Record, unsigned &Slot, 1737337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner const Type *Ty, Value *&ResVal) { 1747337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner if (Slot == Record.size()) return true; 175650c938c41adc95e0935c75d7ed4349c46d280d1Jeff Cohen unsigned ValNo = (unsigned)Record[Slot++]; 1767337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner ResVal = getFnValueByID(ValNo, Ty); 1777337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner return ResVal == 0; 1787337ab9e929a4a787f90d37ee0ed8f4cc27170abChris Lattner } 17948c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner 180caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 181866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseModule(const std::string &ModuleID); 18248c85b84c1b66fb6a1b0d2afddf33da5bd82960dChris Lattner bool ParseParamAttrBlock(); 183866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeTable(); 184866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeSymbolTable(); 185866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseValueSymbolTable(); 186866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseConstants(); 187980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool RememberAndSkipFunctionBody(); 188980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool ParseFunctionBody(Function *F); 18907d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner bool ResolveGlobalAndAliasInits(); 190caee0dccffb77a003681345ab3281bcf8684526cChris Lattner}; 191caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 192caee0dccffb77a003681345ab3281bcf8684526cChris Lattner} // End llvm namespace 193caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 194caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#endif 195