ExecutionEngine.h revision d958a5a9feea7239a73c2068f43f237db550f46e
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
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.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
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>
22683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner#include "llvm/System/Mutex.h"
23fe854034677f59baca1e38075e71f6efca247a03Chris Lattner#include "llvm/ADT/SmallVector.h"
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
279d87eb19be82b28d288e38eab3bbe145060a0701Reid Spencerstruct GenericValue;
28bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant;
29bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function;
303ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattnerclass GlobalVariable;
31b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass GlobalValue;
32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module;
337034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukmanclass ModuleProvider;
34bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData;
35b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass Type;
36683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattnerclass MutexGuard;
37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
38ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerclass ExecutionEngineState {
39ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerprivate:
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;
49ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
50ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerpublic:
51765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  std::map<const GlobalValue*, void *> &
52765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  getGlobalAddressMap(const MutexGuard &locked) {
53ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    return GlobalAddressMap;
54ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  }
55ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
56765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  std::map<void*, const GlobalValue*> &
57765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  getGlobalAddressReverseMap(const MutexGuard& locked) {
58ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    return GlobalAddressReverseMap;
59ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  }
60ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer};
61ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
62ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
63ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerclass ExecutionEngine {
64ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  const TargetData *TD;
65ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  ExecutionEngineState state;
661c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  bool LazyCompilationDisabled;
67d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
681514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattnerprotected:
69fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// Modules - This is a list of ModuleProvider's that we are JIT'ing from.  We
70fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// use a smallvector to optimize for the case where there is only one module.
71fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  SmallVector<ModuleProvider*, 1> Modules;
72fe854034677f59baca1e38075e71f6efca247a03Chris Lattner
73a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson  void setTargetData(const TargetData *td) {
74a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson    TD = td;
75bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
76b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman
77765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  // To avoid having libexecutionengine depend on the JIT and interpreter
78765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  // libraries, the JIT and Interpreter set these functions to ctor pointers
79765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  // at startup time if they are linked in.
80c923435a5953993c046b6259a8c4c0589e00b69fReid Spencer  typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*);
81765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  static EECtorFn JITCtor, InterpCtor;
82d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
83d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// LazyFunctionCreator - If an unknown function is needed, this function
84d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// pointer is invoked to create it. If this returns null, the JIT will abort.
85d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  void* (*LazyFunctionCreator)(const std::string &);
86d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
87bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic:
88765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  /// lock - This lock is protects the ExecutionEngine, JIT, JITResolver and
89765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  /// JITEmitter classes.  It must be held while changing the internal state of
90765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  /// any of those classes.
91ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  sys::Mutex lock; // Used to make this class and subclasses thread-safe
92ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
937034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman  ExecutionEngine(ModuleProvider *P);
947034adbce2fc7e761d745dbf586167380a69ee1aMisha Brukman  ExecutionEngine(Module *M);
95bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  virtual ~ExecutionEngine();
96ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
97a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson  const TargetData *getTargetData() const { return TD; }
98bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
992e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner  /// addModuleProvider - Add a ModuleProvider to the list of modules that we
1002e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner  /// can JIT from.  Note that this takes ownership of the ModuleProvider: when
1012e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner  /// the ExecutionEngine is destroyed, it destroys the MP as well.
1022e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner  void addModuleProvider(ModuleProvider *P) {
1032e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner    Modules.push_back(P);
1042e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner  }
10573d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel
10673d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel  /// removeModuleProvider - Remove a ModuleProvider from the list of modules.
10773d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel  /// Release module from ModuleProvider.
10873d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel  Module* removeModuleProvider(ModuleProvider *P, std::string *ErrInfo = 0);
10973d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel
110fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// FindFunctionNamed - Search all of the active modules to find the one that
111fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// defines FnName.  This is very slow operation and shouldn't be used for
112fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// general code.
113fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  Function *FindFunctionNamed(const char *FnName);
114fe854034677f59baca1e38075e71f6efca247a03Chris Lattner
115ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  /// create - This is the factory method for creating an execution engine which
1168b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner  /// is appropriate for the current machine.  This takes ownership of the
1178b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner  /// module provider.
118726c1ef2bdd72975f41e3188371bb7d6f40401beChris Lattner  static ExecutionEngine *create(ModuleProvider *MP,
119c923435a5953993c046b6259a8c4c0589e00b69fReid Spencer                                 bool ForceInterpreter = false,
120c923435a5953993c046b6259a8c4c0589e00b69fReid Spencer                                 std::string *ErrorStr = 0);
12182d8277ad5862b54341808812bb4016e52347060Brian Gaeke
1228b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner  /// create - This is the factory method for creating an execution engine which
1238b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner  /// is appropriate for the current machine.  This takes ownership of the
1248b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner  /// module.
1258b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner  static ExecutionEngine *create(Module *M);
1268b5295b7bb8bf44f13df7fc8e38069d1218b1f94Chris Lattner
127ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  /// runFunction - Execute the specified function with the specified arguments,
128ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  /// and return the result.
129ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  ///
130ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  virtual GenericValue runFunction(Function *F,
131ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner                                const std::vector<GenericValue> &ArgValues) = 0;
132ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner
1339ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  /// runStaticConstructorsDestructors - This method is used to execute all of
1349ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  /// the static constructors or destructors for a module, depending on the
1359ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  /// value of isDtors.
1369ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  void runStaticConstructorsDestructors(bool isDtors);
1379ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner
1389ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner
139e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  /// runFunctionAsMain - This is a helper function which wraps runFunction to
140e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  /// handle the common task of starting up main with the specified argc, argv,
141e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  /// and envp parameters.
142e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  int runFunctionAsMain(Function *Fn, const std::vector<std::string> &argv,
143e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner                        const char * const * envp);
144e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner
145e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner
146683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// addGlobalMapping - Tell the execution engine that the specified global is
147683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// at the specified location.  This is used internally as functions are JIT'd
148683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// and as global variables are laid out in memory.  It can and should also be
149683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// used by clients of the EE that want to have an LLVM global overlay
150683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// existing data in memory.
151683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void addGlobalMapping(const GlobalValue *GV, void *Addr);
152683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner
1530982d081056f64d7245ba26368d20de33e206ff9Reid Spencer  /// clearAllGlobalMappings - Clear all global mappings and start over again
1540982d081056f64d7245ba26368d20de33e206ff9Reid Spencer  /// use in dynamic compilation scenarios when you want to move globals
155683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void clearAllGlobalMappings();
156683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner
157f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner  /// updateGlobalMapping - Replace an existing mapping for GV with a new
158683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// address.  This updates both maps as required.  If "Addr" is null, the
159683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// entry for the global is removed from the mappings.
160683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void updateGlobalMapping(const GlobalValue *GV, void *Addr);
161683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner
162895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToGlobalIfAvailable - This returns the address of the specified
163683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// global value if it is has already been codegen'd, otherwise it returns
164683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// null.
165895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
166683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void *getPointerToGlobalIfAvailable(const GlobalValue *GV);
16770bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner
168895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToGlobal - This returns the address of the specified global
169895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// value.  This may involve code generation if it's a function.
170895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
171bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void *getPointerToGlobal(const GlobalValue *GV);
172bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
173895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToFunction - The different EE's represent function bodies in
174895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// different ways.  They should each implement this to say what a function
175895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// pointer should look like.
176895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
177fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke  virtual void *getPointerToFunction(Function *F) = 0;
178bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
179895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToFunctionOrStub - If the specified function has been
180895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// code-gen'd, return a pointer to the function.  If not, compile it, or use
181895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// a stub to implement lazy compilation if available.
182895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
18318cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  virtual void *getPointerToFunctionOrStub(Function *F) {
18418cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner    // Default implementation, just codegen the function.
18518cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner    return getPointerToFunction(F);
18618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  }
18718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner
188c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// getGlobalValueAtAddress - Return the LLVM global value object that starts
189c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// at the specified address.
190c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  ///
191c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  const GlobalValue *getGlobalValueAtAddress(void *Addr);
192c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner
193c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner
1942471ae46df8f59a69cc152230f3f39d2e68525c5Reid Spencer  void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr, const Type *Ty);
19529794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  void InitializeMemory(const Constant *Init, void *Addr);
19629794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke
19718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// recompileAndRelinkFunction - This method is used to force a function
198895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// which has already been compiled to be compiled again, possibly
19918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// after it has been modified. Then the entry to the old copy is overwritten
20018cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// with a branch to the new copy. If there was no old copy, this acts
20118cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// just like VM::getPointerToFunction().
20218cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  ///
20318cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  virtual void *recompileAndRelinkFunction(Function *F) = 0;
20418cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner
205e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  /// freeMachineCodeForFunction - Release memory in the ExecutionEngine
206e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  /// corresponding to the machine code emitted to execute this function, useful
207e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  /// for garbage-collecting generated code.
208e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  ///
209e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  virtual void freeMachineCodeForFunction(Function *F) = 0;
210e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman
2111514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  /// getOrEmitGlobalVariable - Return the address of the specified global
2121514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  /// variable, possibly emitting it to memory if needed.  This is used by the
2131514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  /// Emitter.
2141514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  virtual void *getOrEmitGlobalVariable(const GlobalVariable *GV) {
2151514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner    return getPointerToGlobal((GlobalValue*)GV);
2161514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  }
2171c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner
2181c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  /// DisableLazyCompilation - If called, the JIT will abort if lazy compilation
2191c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  // is ever attempted.
2201c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  void DisableLazyCompilation() {
2211c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner    LazyCompilationDisabled = true;
2221c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  }
2231c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  bool isLazyCompilationDisabled() const {
2241c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner    return LazyCompilationDisabled;
2251c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  }
226d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
227d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
228d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// InstallLazyFunctionCreator - If an unknown function is needed, the
229d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// specified function pointer is invoked to create it.  If it returns null,
230d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// the JIT will abort.
231d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  void InstallLazyFunctionCreator(void* (*P)(const std::string &)) {
232d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner    LazyFunctionCreator = P;
233d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  }
2341514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner
23556adf152f6354a9b5609e059050fd2315ad5960cChris Lattnerprotected:
236bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void emitGlobals();
2373ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner
2383ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner  // EmitGlobalVariable - This method emits the specified global variable to the
2393ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner  // address specified in GlobalAddresses, or allocates new memory if it's not
2403ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner  // already in the map.
2411514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  void EmitGlobalVariable(const GlobalVariable *GV);
2423ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner
243bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  GenericValue getConstantValue(const Constant *C);
24447567bdcb5ba3886eaf3fa5f0e0b912a24c12347Reid Spencer  void LoadValueFromMemory(GenericValue &Result, GenericValue *Ptr,
24547567bdcb5ba3886eaf3fa5f0e0b912a24c12347Reid Spencer                           const Type *Ty);
246bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner};
247bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
248d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
249d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
250bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif
251