ExecutionEngine.h revision 6fbcc26f1460eaee4e0eb8b426fc1ff0c7af11be
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===// 26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the abstract interface that implements execution support 11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// for LLVM. 12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===// 14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 15bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#ifndef EXECUTION_ENGINE_H 16bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#define EXECUTION_ENGINE_H 17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <vector> 19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <string> 20bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <map> 212e99791a1ed49f11a2825a9a7590742e1ddc110aChris Lattner#include <cassert> 22bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant; 23bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function; 24b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanunion GenericValue; 25b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass GlobalValue; 26bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module; 277034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukmanclass ModuleProvider; 28bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData; 29b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass Type; 30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass ExecutionEngine { 32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Module &CurMod; 33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData *TD; 34bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerprotected: 36b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman ModuleProvider *MP; 37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // GlobalAddress - A mapping between LLVM global values and their actualized 38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // version... 39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner std::map<const GlobalValue*, void *> GlobalAddress; 40bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void setTargetData(const TargetData &td) { 42bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner TD = &td; 43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 44b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman 45bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic: 467034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman ExecutionEngine(ModuleProvider *P); 477034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman ExecutionEngine(Module *M); 48bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner virtual ~ExecutionEngine(); 49bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 50bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Module &getModule() const { return CurMod; } 51bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData &getTargetData() const { return *TD; } 52bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 5369582b35b6aa4e48cbbad7f6f1193c967da96b25John Criswell /// run - Start execution with the specified function, arguments, and 5469582b35b6aa4e48cbbad7f6f1193c967da96b25John Criswell /// environment. 55bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner /// 5670975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke virtual GenericValue run(Function *F, 5770975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke const std::vector<GenericValue> &ArgValues) = 0; 58bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 59b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman static ExecutionEngine *create(ModuleProvider *MP, bool ForceInterpreter, 60b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman bool TraceMode); 6182d8277ad5862b54341808812bb4016e52347060Brian Gaeke 62bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void addGlobalMapping(const Function *F, void *Addr) { 63bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *&CurVal = GlobalAddress[(const GlobalValue*)F]; 64bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner assert(CurVal == 0 && "GlobalMapping already established!"); 65bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner CurVal = Addr; 66bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 67bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 6870bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner // getPointerToGlobalIfAvailable - This returns the address of the specified 6970bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner // global value if it is available, otherwise it returns null. 7070bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner // 7170bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner void *getPointerToGlobalIfAvailable(const GlobalValue *GV) { 7270bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner std::map<const GlobalValue*, void*>::iterator I = GlobalAddress.find(GV); 7370bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner return I != GlobalAddress.end() ? I->second : 0; 7470bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner } 7570bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner 76bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // getPointerToGlobal - This returns the address of the specified global 77bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // value. This may involve code generation if it's a function. 78bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // 79bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *getPointerToGlobal(const GlobalValue *GV); 80bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 81bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // getPointerToFunction - The different EE's represent function bodies in 82bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // different ways. They should each implement this to say what a function 83bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // pointer should look like. 84bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // 85fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke virtual void *getPointerToFunction(Function *F) = 0; 86bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 8729794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty); 8829794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke void InitializeMemory(const Constant *Init, void *Addr); 8929794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke 9056adf152f6354a9b5609e059050fd2315ad5960cChris Lattnerprotected: 91bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void emitGlobals(); 92bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GenericValue getConstantValue(const Constant *C); 93f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty); 94bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}; 95bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 96bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif 97