ExecutionEngine.h revision f5feaf4fe381476b0ea567d7837c64b6590133e9
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 <map> 202e99791a1ed49f11a2825a9a7590742e1ddc110aChris Lattner#include <cassert> 2120aa474f8fbebde588edc101b90e834df28ce4ceAlkis Evlogimenos#include <string> 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 253ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattnerunion GenericValue; 26bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant; 27bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function; 283ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattnerclass GlobalVariable; 29b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass GlobalValue; 30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module; 317034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukmanclass ModuleProvider; 32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData; 33b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass Type; 34cd824d7678785379a4a11fd7e3099cc44b37db41Chris Lattnerclass IntrinsicLowering; 35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 36bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass ExecutionEngine { 37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Module &CurMod; 38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData *TD; 39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 40c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// GlobalAddressMap - A mapping between LLVM global values and their 41c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// actualized version... 42c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner std::map<const GlobalValue*, void *> GlobalAddressMap; 43c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 44c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// GlobalAddressReverseMap - This is the reverse mapping of GlobalAddressMap, 45c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// used to convert raw addresses into the LLVM global value that is emitted 46c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// at the address. This map is not computed unless getGlobalValueAtAddress 47c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// is called at some point. 48c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner std::map<void *, const GlobalValue*> GlobalAddressReverseMap; 491514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattnerprotected: 501514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner ModuleProvider *MP; 51bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 52bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void setTargetData(const TargetData &td) { 53bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner TD = &td; 54bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 55b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman 56bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic: 577034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman ExecutionEngine(ModuleProvider *P); 587034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman ExecutionEngine(Module *M); 59bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner virtual ~ExecutionEngine(); 60bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 61bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Module &getModule() const { return CurMod; } 62bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData &getTargetData() const { return *TD; } 63bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 64ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// create - This is the factory method for creating an execution engine which 65cd824d7678785379a4a11fd7e3099cc44b37db41Chris Lattner /// is appropriate for the current machine. If specified, the 66cd824d7678785379a4a11fd7e3099cc44b37db41Chris Lattner /// IntrinsicLowering implementation should be allocated on the heap. 67cd824d7678785379a4a11fd7e3099cc44b37db41Chris Lattner static ExecutionEngine *create(ModuleProvider *MP, bool ForceInterpreter, 68cd824d7678785379a4a11fd7e3099cc44b37db41Chris Lattner IntrinsicLowering *IL = 0); 6982d8277ad5862b54341808812bb4016e52347060Brian Gaeke 70ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// runFunction - Execute the specified function with the specified arguments, 71ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// and return the result. 72ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner /// 73ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner virtual GenericValue runFunction(Function *F, 74ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner const std::vector<GenericValue> &ArgValues) = 0; 75ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner 76e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner /// runFunctionAsMain - This is a helper function which wraps runFunction to 77e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner /// handle the common task of starting up main with the specified argc, argv, 78e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner /// and envp parameters. 79e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner int runFunctionAsMain(Function *Fn, const std::vector<std::string> &argv, 80e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner const char * const * envp); 81e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner 82e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner 833ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner void addGlobalMapping(const GlobalValue *GV, void *Addr) { 84c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner void *&CurVal = GlobalAddressMap[GV]; 851514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner assert((CurVal == 0 || Addr == 0) && "GlobalMapping already established!"); 86bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner CurVal = Addr; 87c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 88c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner // If we are using the reverse mapping, add it too 89c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner if (!GlobalAddressReverseMap.empty()) { 90c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner const GlobalValue *&V = GlobalAddressReverseMap[Addr]; 91c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner assert((V == 0 || GV == 0) && "GlobalMapping already established!"); 92c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner V = GV; 93c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner } 94bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 95bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 96f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner /// updateGlobalMapping - Replace an existing mapping for GV with a new 97f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner /// address. This updates both maps as required. 98f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner void updateGlobalMapping(const GlobalValue *GV, void *Addr) { 99f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner void *&CurVal = GlobalAddressMap[GV]; 100f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner if (CurVal && !GlobalAddressReverseMap.empty()) 101f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner GlobalAddressReverseMap.erase(CurVal); 102f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner CurVal = Addr; 103f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner 104f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner // If we are using the reverse mapping, add it too 105f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner if (!GlobalAddressReverseMap.empty()) { 106f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner const GlobalValue *&V = GlobalAddressReverseMap[Addr]; 107f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner assert((V == 0 || GV == 0) && "GlobalMapping already established!"); 108f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner V = GV; 109f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner } 110c1d035a8818058461d776fc0ffb9cdbfa4cfccd3Reid Spencer } 111c1d035a8818058461d776fc0ffb9cdbfa4cfccd3Reid Spencer 112895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToGlobalIfAvailable - This returns the address of the specified 113895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// global value if it is available, otherwise it returns null. 114895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 11570bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner void *getPointerToGlobalIfAvailable(const GlobalValue *GV) { 116c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner std::map<const GlobalValue*, void*>::iterator I = GlobalAddressMap.find(GV); 117c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner return I != GlobalAddressMap.end() ? I->second : 0; 11870bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner } 11970bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner 120895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToGlobal - This returns the address of the specified global 121895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// value. This may involve code generation if it's a function. 122895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 123bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void *getPointerToGlobal(const GlobalValue *GV); 124bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 125895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToFunction - The different EE's represent function bodies in 126895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// different ways. They should each implement this to say what a function 127895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// pointer should look like. 128895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 129fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke virtual void *getPointerToFunction(Function *F) = 0; 130bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 131895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// getPointerToFunctionOrStub - If the specified function has been 132895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// code-gen'd, return a pointer to the function. If not, compile it, or use 133895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// a stub to implement lazy compilation if available. 134895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// 13518cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner virtual void *getPointerToFunctionOrStub(Function *F) { 13618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner // Default implementation, just codegen the function. 13718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner return getPointerToFunction(F); 13818cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner } 13918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner 140c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// getGlobalValueAtAddress - Return the LLVM global value object that starts 141c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// at the specified address. 142c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner /// 143c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner const GlobalValue *getGlobalValueAtAddress(void *Addr); 144c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 145c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner 14629794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke void StoreValueToMemory(GenericValue Val, GenericValue *Ptr, const Type *Ty); 14729794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke void InitializeMemory(const Constant *Init, void *Addr); 14829794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke 14918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// recompileAndRelinkFunction - This method is used to force a function 150895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner /// which has already been compiled to be compiled again, possibly 15118cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// after it has been modified. Then the entry to the old copy is overwritten 15218cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// with a branch to the new copy. If there was no old copy, this acts 15318cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// just like VM::getPointerToFunction(). 15418cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner /// 15518cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner virtual void *recompileAndRelinkFunction(Function *F) = 0; 15618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner 157e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// freeMachineCodeForFunction - Release memory in the ExecutionEngine 158e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// corresponding to the machine code emitted to execute this function, useful 159e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// for garbage-collecting generated code. 160e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman /// 161e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman virtual void freeMachineCodeForFunction(Function *F) = 0; 162e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman 1631514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner /// getOrEmitGlobalVariable - Return the address of the specified global 1641514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner /// variable, possibly emitting it to memory if needed. This is used by the 1651514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner /// Emitter. 1661514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner virtual void *getOrEmitGlobalVariable(const GlobalVariable *GV) { 1671514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner return getPointerToGlobal((GlobalValue*)GV); 1681514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner } 1691514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner 17056adf152f6354a9b5609e059050fd2315ad5960cChris Lattnerprotected: 171bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner void emitGlobals(); 1723ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner 1733ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the 1743ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not 1753ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner // already in the map. 1761514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner void EmitGlobalVariable(const GlobalVariable *GV); 1773ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner 178bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GenericValue getConstantValue(const Constant *C); 179f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner GenericValue LoadValueFromMemory(GenericValue *Ptr, const Type *Ty); 180bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}; 181bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 182d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 183d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 184bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif 185