ExecutionEngine.h revision 70bca51f92871c7f9d3eac9ab68292c149fab53c
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===// 2bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 3bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the abstract interface that implements execution support 4bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// for LLVM. 5bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 6bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===// 7bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 8bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#ifndef EXECUTION_ENGINE_H 9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#define EXECUTION_ENGINE_H 10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <vector> 12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <string> 13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <map> 14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant; 15bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Type; 16bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass GlobalValue; 17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function; 18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module; 19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData; 20bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerunion GenericValue; 21bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 22bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass ExecutionEngine { 23bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Module &CurMod; 24bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData *TD; 25bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 26bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerprotected: 27bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // GlobalAddress - A mapping between LLVM global values and their actualized 28bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // version... 29bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner std::map<const GlobalValue*, void *> GlobalAddress; 30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void setTargetData(const TargetData &td) { 32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner TD = &td; 33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner emitGlobals(); 34bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic: 36bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner ExecutionEngine(Module *M) : CurMod(*M) { 37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner assert(M && "Module is null?"); 38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner virtual ~ExecutionEngine(); 40bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Module &getModule() const { return CurMod; } 42bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData &getTargetData() const { return *TD; } 43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 44bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// run - Start execution with the specified function and arguments. 45bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// 46bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner virtual int run(const std::string &FnName, 47bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const std::vector<std::string> &Args) = 0; 48bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 49bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// createJIT - Create an return a new JIT compiler if there is one available 50bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// for the current target. Otherwise it returns null. 51bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// 52bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner static ExecutionEngine *createJIT(Module *M, unsigned Config); 53bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 54bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// createInterpreter - Create a new interpreter object. This can never fail. 55bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// 56bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner static ExecutionEngine *createInterpreter(Module *M, unsigned Config, 57bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner bool DebugMode, bool TraceMode); 58bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 59bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void addGlobalMapping(const Function *F, void *Addr) { 60bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *&CurVal = GlobalAddress[(const GlobalValue*)F]; 61bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner assert(CurVal == 0 && "GlobalMapping already established!"); 62bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner CurVal = Addr; 63bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 64bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 6570bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner // getPointerToGlobalIfAvailable - This returns the address of the specified 6670bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner // global value if it is available, otherwise it returns null. 6770bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner // 6870bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner void *getPointerToGlobalIfAvailable(const GlobalValue *GV) { 6970bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner std::map<const GlobalValue*, void*>::iterator I = GlobalAddress.find(GV); 7070bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner return I != GlobalAddress.end() ? I->second : 0; 7170bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner } 7270bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner 73bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // getPointerToGlobal - This returns the address of the specified global 74bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // value. This may involve code generation if it's a function. 75bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // 76bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *getPointerToGlobal(const GlobalValue *GV); 77bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 78bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // getPointerToFunction - The different EE's represent function bodies in 79bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // different ways. They should each implement this to say what a function 80bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // pointer should look like. 81bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // 82bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner virtual void *getPointerToFunction(const Function *F) = 0; 83bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 84bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerprivate: 85bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void emitGlobals(); 86bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 87bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic: // FIXME: protected: // API shared among subclasses 88bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GenericValue getConstantValue(const Constant *C); 89bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty); 90f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty); 91bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *CreateArgv(const std::vector<std::string> &InputArgv); 92bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void InitializeMemory(const Constant *Init, void *Addr); 93bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}; 94bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 95bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif 96