BitcodeReader.h revision 522b7b104c864da81c19d8b16c43b7a1f6a2fc40
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" 2047f96bf24687b5068aec7166cb8b3ac33ae964aeChris Lattner#include "llvm/Bitcode/LLVMBitCodes.h" 21caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#include <vector> 22caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 23caee0dccffb77a003681345ab3281bcf8684526cChris Lattnernamespace llvm { 24caee0dccffb77a003681345ab3281bcf8684526cChris Lattner class BitstreamReader; 25522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 26522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerclass BitcodeReaderValueList : public User { 27522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner std::vector<Use> Uses; 28522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattnerpublic: 29522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0) {} 30522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 31522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner // vector compatibility methods 32522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner unsigned size() const { return getNumOperands(); } 33522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void push_back(Value *V) { 34522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses.push_back(Use(V, this)); 35522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner OperandList = &Uses[0]; 36522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner ++NumOperands; 37522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 38522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 39522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *operator[](unsigned i) const { return getOperand(i); } 40522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 41522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Value *back() const { return Uses.back(); } 42522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void pop_back() { Uses.pop_back(); --NumOperands; } 43522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner bool empty() const { return NumOperands == 0; } 44522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner virtual void print(std::ostream&) const {} 45522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 46522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Constant *getConstantFwdRef(unsigned Idx, const Type *Ty); 47522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner void initVal(unsigned Idx, Value *V) { 48522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner assert(Uses[Idx] == 0 && "Cannot init an already init'd Use!"); 49522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner Uses[Idx].init(V, this); 50522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner } 51522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner}; 52522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner 53caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 54caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerclass BitcodeReader : public ModuleProvider { 55caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *ErrorString; 56caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 57caee0dccffb77a003681345ab3281bcf8684526cChris Lattner std::vector<PATypeHolder> TypeList; 58522b7b104c864da81c19d8b16c43b7a1f6a2fc40Chris Lattner BitcodeReaderValueList ValueList; 59e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; 60caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerpublic: 61caee0dccffb77a003681345ab3281bcf8684526cChris Lattner virtual ~BitcodeReader() {} 62caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 63caee0dccffb77a003681345ab3281bcf8684526cChris Lattner virtual void FreeState() {} 64caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 65caee0dccffb77a003681345ab3281bcf8684526cChris Lattner virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0) { 66caee0dccffb77a003681345ab3281bcf8684526cChris Lattner // FIXME: TODO 67caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return false; 68caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 69caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 70caee0dccffb77a003681345ab3281bcf8684526cChris Lattner virtual Module *materializeModule(std::string *ErrInfo = 0) { 71caee0dccffb77a003681345ab3281bcf8684526cChris Lattner // FIXME: TODO 72caee0dccffb77a003681345ab3281bcf8684526cChris Lattner //if (ParseAllFunctionBodies(ErrMsg)) 73caee0dccffb77a003681345ab3281bcf8684526cChris Lattner // return 0; 74caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return TheModule; 75caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 76caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 77caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool Error(const char *Str) { 78caee0dccffb77a003681345ab3281bcf8684526cChris Lattner ErrorString = Str; 79caee0dccffb77a003681345ab3281bcf8684526cChris Lattner return true; 80caee0dccffb77a003681345ab3281bcf8684526cChris Lattner } 81caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const char *getErrorString() const { return ErrorString; } 82caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 83caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @brief Main interface to parsing a bitcode buffer. 84caee0dccffb77a003681345ab3281bcf8684526cChris Lattner /// @returns true if an error occurred. 85caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool ParseBitcode(unsigned char *Buf, unsigned Length, 86caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const std::string &ModuleID); 87caee0dccffb77a003681345ab3281bcf8684526cChris Lattnerprivate: 88caee0dccffb77a003681345ab3281bcf8684526cChris Lattner const Type *getTypeByID(unsigned ID, bool isTypeTable = false); 89caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 90caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool ParseModule(BitstreamReader &Stream, const std::string &ModuleID); 91caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool ParseTypeTable(BitstreamReader &Stream); 92caee0dccffb77a003681345ab3281bcf8684526cChris Lattner bool ParseTypeSymbolTable(BitstreamReader &Stream); 930b2482a1ebd07a3b1cec660681add46c927970f2Chris Lattner bool ParseValueSymbolTable(BitstreamReader &Stream); 94e16504eb4ef8f09611cdf6e9a0be9eb886b4ed89Chris Lattner bool ParseConstants(BitstreamReader &Stream); 95caee0dccffb77a003681345ab3281bcf8684526cChris Lattner}; 96caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 97caee0dccffb77a003681345ab3281bcf8684526cChris Lattner} // End llvm namespace 98caee0dccffb77a003681345ab3281bcf8684526cChris Lattner 99caee0dccffb77a003681345ab3281bcf8684526cChris Lattner#endif 100