BitcodeReader.h revision 980e5aad4cfaa32e13b297f4201eb1088ca96cc4
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; 27522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 28522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerclass BitcodeReaderValueList : public User { 29522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner std::vector<Use> Uses; 30522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerpublic: 31522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0) {} 32522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 33522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner // vector compatibility methods 34522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner unsigned size() const { return getNumOperands(); } 35522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void push_back(Value *V) { 36522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses.push_back(Use(V, this)); 37522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner OperandList = &Uses[0]; 38522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner ++NumOperands; 39522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 40522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 41522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *operator[](unsigned i) const { return getOperand(i); } 42522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 43522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *back() const { return Uses.back(); } 44522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void pop_back() { Uses.pop_back(); --NumOperands; } 45522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner bool empty() const { return NumOperands == 0; } 46198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner void shrinkTo(unsigned N) { 47980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner assert(N <= NumOperands && "Invalid shrinkTo request!"); 48198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner Uses.resize(N); 49198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner NumOperands = N; 50198f34ac359c48018c6e1f784cf3770ead63b253Chris Lattner } 51522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner virtual void print(std::ostream&) const {} 52522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 53522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Constant *getConstantFwdRef(unsigned Idx, const Type *Ty); 54522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void initVal(unsigned Idx, Value *V) { 55522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner assert(Uses[Idx] == 0 && "Cannot init an already init'd Use!"); 56522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses[Idx].init(V, this); 57522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 58522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner}; 59522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 60caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 61caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerclass BitcodeReader : public ModuleProvider { 62c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner MemoryBuffer *Buffer; 6348f848716e80d01619b239111db48bfac77baad1Chris Lattner BitstreamReader Stream; 6448f848716e80d01619b239111db48bfac77baad1Chris Lattner 65caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *ErrorString; 66caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 67caee0dccffb77a003681345ab3281bcf8684526cChris Lattner std::vector<PATypeHolder> TypeList; 68522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList ValueList; 69e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 7007d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; 7148f848716e80d01619b239111db48bfac77baad1Chris Lattner 72980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// FunctionBBs - While parsing a function body, this is a list of the basic 73980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner /// blocks for the function. 74980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner std::vector<BasicBlock*> FunctionBBs; 75980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner 7648f848716e80d01619b239111db48bfac77baad1Chris Lattner // When reading the module header, this list is populated with functions that 7748f848716e80d01619b239111db48bfac77baad1Chris Lattner // have bodies later in the file. 7848f848716e80d01619b239111db48bfac77baad1Chris Lattner std::vector<Function*> FunctionsWithBodies; 7948f848716e80d01619b239111db48bfac77baad1Chris Lattner 8048f848716e80d01619b239111db48bfac77baad1Chris Lattner // After the module header has been read, the FunctionsWithBodies list is 8148f848716e80d01619b239111db48bfac77baad1Chris Lattner // reversed. This keeps track of whether we've done this yet. 8248f848716e80d01619b239111db48bfac77baad1Chris Lattner bool HasReversedFunctionsWithBodies; 8348f848716e80d01619b239111db48bfac77baad1Chris Lattner 8448f848716e80d01619b239111db48bfac77baad1Chris Lattner /// DeferredFunctionInfo - When function bodies are initially scanned, this 8548f848716e80d01619b239111db48bfac77baad1Chris Lattner /// map contains info about where to find deferred function body (in the 8648f848716e80d01619b239111db48bfac77baad1Chris Lattner /// stream) and what linkage the original function had. 8748f848716e80d01619b239111db48bfac77baad1Chris Lattner DenseMap<Function*, std::pair<uint64_t, unsigned> > DeferredFunctionInfo; 88caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerpublic: 8948f848716e80d01619b239111db48bfac77baad1Chris Lattner BitcodeReader(MemoryBuffer *buffer) : Buffer(buffer), ErrorString(0) { 9048f848716e80d01619b239111db48bfac77baad1Chris Lattner HasReversedFunctionsWithBodies = false; 9148f848716e80d01619b239111db48bfac77baad1Chris Lattner } 92c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner ~BitcodeReader(); 93caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 94c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner 95c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// releaseMemoryBuffer - This causes the reader to completely forget about 96c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// the memory buffer it contains, which prevents the buffer from being 97c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner /// destroyed when it is deleted. 98c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner void releaseMemoryBuffer() { 99c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner Buffer = 0; 100c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner } 101caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 10248f848716e80d01619b239111db48bfac77baad1Chris Lattner virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0); 103980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner virtual Module *materializeModule(std::string *ErrInfo = 0); 104caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 105caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool Error(const char *Str) { 106caee0dccffb77a003681345ab3281bcf8684526cChris Lattner ErrorString = Str; 107caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return true; 108caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 109caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *getErrorString() const { return ErrorString; } 110caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 111caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @brief Main interface to parsing a bitcode buffer. 112caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @returns true if an error occurred. 113c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner bool ParseBitcode(); 114caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerprivate: 115caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const Type *getTypeByID(unsigned ID, bool isTypeTable = false); 116caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 117866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseModule(const std::string &ModuleID); 118866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeTable(); 119866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseTypeSymbolTable(); 120866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseValueSymbolTable(); 121866971474ced63f725bd3dbf10fdb9e3badb7d9eChris Lattner bool ParseConstants(); 122980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool RememberAndSkipFunctionBody(); 123980e5aad4cfaa32e13b297f4201eb1088ca96cc4Chris Lattner bool ParseFunctionBody(Function *F); 12407d98b4afbdcbb4eed048400d9116de1ec83e866Chris Lattner bool ResolveGlobalAndAliasInits(); 125caee0dccffb77a003681345ab3281bcf8684526cChris Lattner}; 126caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 127caee0dccffb77a003681345ab3281bcf8684526cChris Lattner} // End llvm namespace 128caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 129caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#endif 130