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