ExecutionEngine.h revision 4688261c20735f5ead2f08695acdeb727db31894
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// 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
159f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner#ifndef LLVM_EXECUTION_ENGINE_H
169f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner#define LLVM_EXECUTION_ENGINE_H
17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <vector>
19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include <map>
2020aa474f8fbebde588edc101b90e834df28ce4ceAlkis Evlogimenos#include <string>
21fe854034677f59baca1e38075e71f6efca247a03Chris Lattner#include "llvm/ADT/SmallVector.h"
224688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin#include "llvm/ADT/StringRef.h"
2323e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin#include "llvm/ADT/ValueMap.h"
244c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin#include "llvm/Support/ValueHandle.h"
2598a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/System/Mutex.h"
2698a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h"
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
309d87eb19be82b28d288e38eab3bbe145060a0701Reid Spencerstruct GenericValue;
31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Constant;
324c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskinclass ExecutionEngine;
33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Function;
343ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattnerclass GlobalVariable;
35b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass GlobalValue;
36df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass JITEventListener;
37df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass JITMemoryManager;
38df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass MachineCodeInfo;
39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass Module;
40df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskinclass MutexGuard;
41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerclass TargetData;
42b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukmanclass Type;
43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
44ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerclass ExecutionEngineState {
454c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskinpublic:
4623e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  struct AddressMapConfig : public ValueMapConfig<const GlobalValue*> {
4723e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin    typedef ExecutionEngineState *ExtraData;
4823e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin    static sys::Mutex *getMutex(ExecutionEngineState *EES);
4923e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin    static void onDelete(ExecutionEngineState *EES, const GlobalValue *Old);
5023e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin    static void onRAUW(ExecutionEngineState *, const GlobalValue *,
5123e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin                       const GlobalValue *);
524c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  };
534c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin
5423e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  typedef ValueMap<const GlobalValue *, void *, AddressMapConfig>
5523e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin      GlobalAddressMapTy;
5623e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin
57ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerprivate:
584c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  ExecutionEngine &EE;
594c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin
60c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// GlobalAddressMap - A mapping between LLVM global values and their
61c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// actualized version...
6223e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  GlobalAddressMapTy GlobalAddressMap;
63c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner
64c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// GlobalAddressReverseMap - This is the reverse mapping of GlobalAddressMap,
65c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// used to convert raw addresses into the LLVM global value that is emitted
66c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// at the address.  This map is not computed unless getGlobalValueAtAddress
67c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// is called at some point.
680d5bd59553375dc85ac04c81ef48ef74c9e7193eJeffrey Yasskin  std::map<void *, AssertingVH<const GlobalValue> > GlobalAddressReverseMap;
69ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
70ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerpublic:
7123e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  ExecutionEngineState(ExecutionEngine &EE);
724c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin
7323e5fcfec4640955fec41dc8348f467adf1a3e56Jeffrey Yasskin  GlobalAddressMapTy &
7413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  getGlobalAddressMap(const MutexGuard &) {
75ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    return GlobalAddressMap;
76ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  }
77ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
780d5bd59553375dc85ac04c81ef48ef74c9e7193eJeffrey Yasskin  std::map<void*, AssertingVH<const GlobalValue> > &
7913d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  getGlobalAddressReverseMap(const MutexGuard &) {
80ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer    return GlobalAddressReverseMap;
81ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  }
82c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin
83c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin  // Returns the address ToUnmap was mapped to.
84c89d27a440370455336202b2a8f25eb9c73e67bcJeffrey Yasskin  void *RemoveMapping(const MutexGuard &, const GlobalValue *ToUnmap);
85ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer};
86ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
87ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
88ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencerclass ExecutionEngine {
89ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  const TargetData *TD;
904c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  ExecutionEngineState EEState;
91dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  bool CompilingLazily;
92446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng  bool GVCompilationDisabled;
93e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  bool SymbolSearchingDisabled;
94d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
954b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  friend class EngineBuilder;  // To allow access to JITCtor and InterpCtor.
964b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
971514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattnerprotected:
98f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// Modules - This is a list of Modules that we are JIT'ing from.  We use a
99f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// smallvector to optimize for the case where there is only one module.
100f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  SmallVector<Module*, 1> Modules;
101fe854034677f59baca1e38075e71f6efca247a03Chris Lattner
102a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson  void setTargetData(const TargetData *td) {
103a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson    TD = td;
104bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
10546fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray
10646fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray  /// getMemoryforGV - Allocate memory for a global variable.
10746fa139e26be6ebc00be2fb45820c2560dd22a32Nicolas Geoffray  virtual char* getMemoryForGV(const GlobalVariable* GV);
108b6c54ed8f50a351989993a5ef88507abc6d63e2dMisha Brukman
109765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  // To avoid having libexecutionengine depend on the JIT and interpreter
110765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  // libraries, the JIT and Interpreter set these functions to ctor pointers
111765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  // at startup time if they are linked in.
1124688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  static ExecutionEngine *(*JITCtor)(
1134688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    Module *M,
1144688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    std::string *ErrorStr,
1154688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    JITMemoryManager *JMM,
1164688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    CodeGenOpt::Level OptLevel,
1174688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    bool GVsWithCode,
1184688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    CodeModel::Model CMM,
1194688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    StringRef MArch,
1204688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    StringRef MCPU,
1214688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    const SmallVectorImpl<std::string>& MAttrs);
122f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  static ExecutionEngine *(*InterpCtor)(Module *M,
1234b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner                                        std::string *ErrorStr);
124d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
125d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// LazyFunctionCreator - If an unknown function is needed, this function
126d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// pointer is invoked to create it. If this returns null, the JIT will abort.
127d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  void* (*LazyFunctionCreator)(const std::string &);
128d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner
129afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  /// ExceptionTableRegister - If Exception Handling is set, the JIT will
130afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  /// register dwarf tables with this function
131afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  typedef void (*EERegisterFn)(void*);
132afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  static EERegisterFn ExceptionTableRegister;
133afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray
134bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerpublic:
135765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  /// lock - This lock is protects the ExecutionEngine, JIT, JITResolver and
136765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  /// JITEmitter classes.  It must be held while changing the internal state of
137765c93cefda367d8e5a8e0afcd610a7e15bbd987Chris Lattner  /// any of those classes.
138ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer  sys::Mutex lock; // Used to make this class and subclasses thread-safe
139ee448630bdf7eb6037fe2c50518d32010c433ca3Reid Spencer
140f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  //===--------------------------------------------------------------------===//
1419f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  //  ExecutionEngine Startup
142f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  //===--------------------------------------------------------------------===//
143ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
1449f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  virtual ~ExecutionEngine();
145bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
1469f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  /// create - This is the factory method for creating an execution engine which
1479f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  /// is appropriate for the current machine.  This takes ownership of the
148f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// module.
149f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  static ExecutionEngine *create(Module *M,
1509f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner                                 bool ForceInterpreter = false,
151502f20b17ede40de84503010b7699b328a4f2867Evan Cheng                                 std::string *ErrorStr = 0,
15298a366d547772010e94609e4584489b3e5ce0043Bill Wendling                                 CodeGenOpt::Level OptLevel =
153489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                   CodeGenOpt::Default,
154489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // Allocating globals with code breaks
155489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // freeMachineCodeForFunction and is probably
156489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // unsafe and bad for performance.  However,
157489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // we have clients who depend on this
158489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // behavior, so we must support it.
159489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // Eventually, when we're willing to break
160489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // some backwards compatability, this flag
161489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // should be flipped to false, so that by
162489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 // default freeMachineCodeForFunction works.
163489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                 bool GVsWithCode = true);
164489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin
16534c9433004cabd4760987dce4804a91c84908219Chris Lattner  /// createJIT - This is the factory method for creating a JIT for the current
16634c9433004cabd4760987dce4804a91c84908219Chris Lattner  /// machine, it does not fall back to the interpreter.  This takes ownership
167f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// of the Module and JITMemoryManager if successful.
1681d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar  ///
1691d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar  /// Clients should make sure to initialize targets prior to calling this
1701d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar  /// function.
171f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  static ExecutionEngine *createJIT(Module *M,
17234c9433004cabd4760987dce4804a91c84908219Chris Lattner                                    std::string *ErrorStr = 0,
173502f20b17ede40de84503010b7699b328a4f2867Evan Cheng                                    JITMemoryManager *JMM = 0,
17498a366d547772010e94609e4584489b3e5ce0043Bill Wendling                                    CodeGenOpt::Level OptLevel =
175489393d7b92107cc3de17d8dbe7dd11ab7395fdcJeffrey Yasskin                                      CodeGenOpt::Default,
17688b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher                                    bool GVsWithCode = true,
17788b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher				    CodeModel::Model CMM =
17888b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher				      CodeModel::Default);
17998a366d547772010e94609e4584489b3e5ce0043Bill Wendling
180f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// addModule - Add a Module to the list of modules that we can JIT from.
181f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// Note that this takes ownership of the Module: when the ExecutionEngine is
182f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// destroyed, it destroys the Module as well.
183f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  virtual void addModule(Module *M) {
184f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    Modules.push_back(M);
1852e40ae4de67ba37d02281d51e7dfd629205e1e30Chris Lattner  }
1869f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner
1879f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  //===----------------------------------------------------------------------===//
1889f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner
1899f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner  const TargetData *getTargetData() const { return TD; }
1909f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner
19173d0e211a39650fc7562e0f15ed21440dde2243aDevang Patel
192f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// removeModule - Remove a Module from the list of modules.  Returns true if
193f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// M is found.
194f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  virtual bool removeModule(Module *M);
19560789e419e04c260e36af9a1add5ad316313e490Nate Begeman
196fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// FindFunctionNamed - Search all of the active modules to find the one that
197fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// defines FnName.  This is very slow operation and shouldn't be used for
198fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  /// general code.
199fe854034677f59baca1e38075e71f6efca247a03Chris Lattner  Function *FindFunctionNamed(const char *FnName);
200fe854034677f59baca1e38075e71f6efca247a03Chris Lattner
201ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  /// runFunction - Execute the specified function with the specified arguments,
202ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  /// and return the result.
203ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  ///
204ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner  virtual GenericValue runFunction(Function *F,
205ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner                                const std::vector<GenericValue> &ArgValues) = 0;
206ff65e36be0f4fbe776ee6bb39b7ab14ebe3895ebChris Lattner
2079ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  /// runStaticConstructorsDestructors - This method is used to execute all of
20818314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng  /// the static constructors or destructors for a program, depending on the
2099ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  /// value of isDtors.
2109ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner  void runStaticConstructorsDestructors(bool isDtors);
21118314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng  /// runStaticConstructorsDestructors - This method is used to execute all of
21218314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng  /// the static constructors or destructors for a module, depending on the
21318314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng  /// value of isDtors.
21418314dc741ab7dc4db02b199af77f43bd8551fd2Evan Cheng  void runStaticConstructorsDestructors(Module *module, bool isDtors);
2159ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner
2169ca6cdaee91fddcd3ea57dedcd624c14c7a40f65Chris Lattner
217e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  /// runFunctionAsMain - This is a helper function which wraps runFunction to
218e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  /// handle the common task of starting up main with the specified argc, argv,
219e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  /// and envp parameters.
220e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner  int runFunctionAsMain(Function *Fn, const std::vector<std::string> &argv,
221e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner                        const char * const * envp);
222e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner
223e5dbbf2bddf7fc28d9f63a5e978af12184c80adaChris Lattner
224683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// addGlobalMapping - Tell the execution engine that the specified global is
225683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// at the specified location.  This is used internally as functions are JIT'd
226683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// and as global variables are laid out in memory.  It can and should also be
227683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// used by clients of the EE that want to have an LLVM global overlay
2284c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// existing data in memory.  Mappings are automatically removed when their
2294c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// GlobalValue is destroyed.
230683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void addGlobalMapping(const GlobalValue *GV, void *Addr);
231683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner
2320982d081056f64d7245ba26368d20de33e206ff9Reid Spencer  /// clearAllGlobalMappings - Clear all global mappings and start over again
2330982d081056f64d7245ba26368d20de33e206ff9Reid Spencer  /// use in dynamic compilation scenarios when you want to move globals
234683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void clearAllGlobalMappings();
235683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner
236f049e07eb8930214941c72f8e4409df394de1567Nate Begeman  /// clearGlobalMappingsFromModule - Clear all global mappings that came from a
237f049e07eb8930214941c72f8e4409df394de1567Nate Begeman  /// particular module, because it has been removed from the JIT.
238f049e07eb8930214941c72f8e4409df394de1567Nate Begeman  void clearGlobalMappingsFromModule(Module *M);
239f049e07eb8930214941c72f8e4409df394de1567Nate Begeman
240f5feaf4fe381476b0ea567d7837c64b6590133e9Chris Lattner  /// updateGlobalMapping - Replace an existing mapping for GV with a new
241683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// address.  This updates both maps as required.  If "Addr" is null, the
242f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  /// entry for the global is removed from the mappings.  This returns the old
243f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  /// value of the pointer, or null if it was not in the map.
244f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  void *updateGlobalMapping(const GlobalValue *GV, void *Addr);
245683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner
246895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToGlobalIfAvailable - This returns the address of the specified
247683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// global value if it is has already been codegen'd, otherwise it returns
248683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  /// null.
249895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
250683d1bb712d8f8fc2d727a160da029c9cf40a423Chris Lattner  void *getPointerToGlobalIfAvailable(const GlobalValue *GV);
25170bca51f92871c7f9d3eac9ab68292c149fab53cChris Lattner
252895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToGlobal - This returns the address of the specified global
2534c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// value.  This may involve code generation if it's a function.
254895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
255bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void *getPointerToGlobal(const GlobalValue *GV);
256bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
257895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToFunction - The different EE's represent function bodies in
258895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// different ways.  They should each implement this to say what a function
2594c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// pointer should look like.  When F is destroyed, the ExecutionEngine will
2607a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin  /// remove its global mapping and free any machine code.  Be sure no threads
2617a9034c4db248fe8b8cb82762881b51b221988d3Jeffrey Yasskin  /// are running inside F when that happens.
262895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
263fb0ef2e82cb2e80983c097100ae168af68ee8e7bBrian Gaeke  virtual void *getPointerToFunction(Function *F) = 0;
264bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
265f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  /// getPointerToBasicBlock - The different EE's represent basic blocks in
266f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  /// different ways.  Return the representation for a blockaddress of the
267f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  /// specified block.
268f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  ///
269f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner  virtual void *getPointerToBasicBlock(BasicBlock *BB) = 0;
270f32a6a3091e0b01d17926f4b1cf78972854b8cb5Chris Lattner
271895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// getPointerToFunctionOrStub - If the specified function has been
272895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// code-gen'd, return a pointer to the function.  If not, compile it, or use
2734c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// a stub to implement lazy compilation if available.  See
2744c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// getPointerToFunction for the requirements on destroying F.
275895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  ///
27618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  virtual void *getPointerToFunctionOrStub(Function *F) {
27718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner    // Default implementation, just codegen the function.
27818cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner    return getPointerToFunction(F);
27918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  }
28018cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner
281b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis  // The JIT overrides a version that actually does this.
2825e0644c73e0415e85c035ad1306a86554dd26df7Bill Wendling  virtual void runJITOnFunction(Function *, MachineCodeInfo * = 0) { }
283b3a847db0b991d3210706a2580428fdc2b6bf037Argyrios Kyrtzidis
284c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// getGlobalValueAtAddress - Return the LLVM global value object that starts
285c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  /// at the specified address.
286c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  ///
287c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner  const GlobalValue *getGlobalValueAtAddress(void *Addr);
288c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner
289c8a07d7378699b8d11ce2a1549b984d84706da19Chris Lattner
290f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner  void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr,
291f4cc3096fd893cdef5b5c2664ebff8c13a07ad51Chris Lattner                          const Type *Ty);
29229794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke  void InitializeMemory(const Constant *Init, void *Addr);
29329794cba810ec249a9ede5ea77333a71579fd182Brian Gaeke
29418cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// recompileAndRelinkFunction - This method is used to force a function
295895be4bae2c4f9a2fd2234f0329f618274e67eabChris Lattner  /// which has already been compiled to be compiled again, possibly
29618cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// after it has been modified. Then the entry to the old copy is overwritten
29718cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// with a branch to the new copy. If there was no old copy, this acts
29818cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  /// just like VM::getPointerToFunction().
29918cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  ///
30018cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner  virtual void *recompileAndRelinkFunction(Function *F) = 0;
30118cb4c3c747ac2439ca9fb1218edd8993df69d7aChris Lattner
302e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  /// freeMachineCodeForFunction - Release memory in the ExecutionEngine
303e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  /// corresponding to the machine code emitted to execute this function, useful
304e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  /// for garbage-collecting generated code.
305e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  ///
306e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman  virtual void freeMachineCodeForFunction(Function *F) = 0;
307e81aaf238c32dbc34274ede09fb16aa78dae9f53Misha Brukman
3081514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  /// getOrEmitGlobalVariable - Return the address of the specified global
3091514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  /// variable, possibly emitting it to memory if needed.  This is used by the
3104c5b23b24f230607fa18a162519875a91a5e89e0Jeffrey Yasskin  /// Emitter.
3111514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  virtual void *getOrEmitGlobalVariable(const GlobalVariable *GV) {
3121514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner    return getPointerToGlobal((GlobalValue*)GV);
3131514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  }
314df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin
315df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin  /// Registers a listener to be called back on various events within
316df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin  /// the JIT.  See JITEventListener.h for more details.  Does not
317df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin  /// take ownership of the argument.  The argument may be NULL, in
318df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin  /// which case these functions do nothing.
319df225c0253aa987830fbd3dfcb5d9f8f7f973336Bill Wendling  virtual void RegisterJITEventListener(JITEventListener *) {}
320df225c0253aa987830fbd3dfcb5d9f8f7f973336Bill Wendling  virtual void UnregisterJITEventListener(JITEventListener *) {}
321df5a7daff9c7664bff8b713e8ed5155319bc6041Jeffrey Yasskin
32218fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  /// DisableLazyCompilation - When lazy compilation is off (the default), the
323dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// JIT will eagerly compile every function reachable from the argument to
324dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// getPointerToFunction.  If lazy compilation is turned on, the JIT will only
325dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// compile the one function and emit stubs to compile the rest when they're
326dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// first called.  If lazy compilation is turned off again while some lazy
327dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// stubs are still around, and one of those stubs is called, the program will
328dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// abort.
329dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  ///
330dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// In order to safely compile lazily in a threaded program, the user must
331dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// ensure that 1) only one thread at a time can call any particular lazy
332dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// stub, and 2) any thread modifying LLVM IR must hold the JIT's lock
333dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// (ExecutionEngine::lock) or otherwise ensure that no other thread calls a
334dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  /// lazy stub.  See http://llvm.org/PR5184 for details.
33518fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  void DisableLazyCompilation(bool Disabled = true) {
33618fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin    CompilingLazily = !Disabled;
3371c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  }
338dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin  bool isCompilingLazily() const {
339dc85724f703bddf6988b6b3f20203beab775f32bJeffrey Yasskin    return CompilingLazily;
3401c1a44699049cf56713a46ccaef7c747e4a888a3Chris Lattner  }
34118fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  // Deprecated in favor of isCompilingLazily (to reduce double-negatives).
34218fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  // Remove this in LLVM 2.8.
34318fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  bool isLazyCompilationDisabled() const {
34418fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin    return !CompilingLazily;
34518fec73e29d68b9c7473720507f51de39b0873b1Jeffrey Yasskin  }
346446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng
34777f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng  /// DisableGVCompilation - If called, the JIT will abort if it's asked to
34877f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng  /// allocate space and populate a GlobalVariable that is not internal to
34977f86ad08775e0ed2a704ef09ffff3dbd6e04583Evan Cheng  /// the module.
350446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng  void DisableGVCompilation(bool Disabled = true) {
351446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng    GVCompilationDisabled = Disabled;
352446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng  }
353446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng  bool isGVCompilationDisabled() const {
354446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng    return GVCompilationDisabled;
355446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng  }
356446531e7bb4355117b070493ca8e81e4b123ef18Evan Cheng
357e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  /// DisableSymbolSearching - If called, the JIT will not try to lookup unknown
358e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  /// symbols with dlsym.  A client can still use InstallLazyFunctionCreator to
359e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  /// resolve symbols in a custom way.
360e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  void DisableSymbolSearching(bool Disabled = true) {
361e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner    SymbolSearchingDisabled = Disabled;
362e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  }
363e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  bool isSymbolSearchingDisabled() const {
364e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner    return SymbolSearchingDisabled;
365e846db667529eeeae531ce3b7382e18888d1eba0Chris Lattner  }
3666f348e458660063a40052b208bab96895c822877Jeffrey Yasskin
367d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// InstallLazyFunctionCreator - If an unknown function is needed, the
368d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// specified function pointer is invoked to create it.  If it returns null,
369d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  /// the JIT will abort.
370d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  void InstallLazyFunctionCreator(void* (*P)(const std::string &)) {
371d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner    LazyFunctionCreator = P;
372d958a5a9feea7239a73c2068f43f237db550f46eChris Lattner  }
373afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray
374afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  /// InstallExceptionTableRegister - The JIT will use the given function
375afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  /// to register the exception tables it generates.
376afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  static void InstallExceptionTableRegister(void (*F)(void*)) {
377afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray    ExceptionTableRegister = F;
378afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  }
379afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray
380afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  /// RegisterTable - Registers the given pointer as an exception table. It uses
381afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  /// the ExceptionTableRegister function.
382afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  static void RegisterTable(void* res) {
383afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray    if (ExceptionTableRegister)
384afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray      ExceptionTableRegister(res);
385afe6c2b001a924cd74bd0aacfed5984d9af004b0Nicolas Geoffray  }
3861514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner
38756adf152f6354a9b5609e059050fd2315ad5960cChris Lattnerprotected:
388f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  explicit ExecutionEngine(Module *M);
3899f2f142d255bc96f109dd5c6524a485937b1f3a1Chris Lattner
390bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  void emitGlobals();
3913ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner
3923ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner  // EmitGlobalVariable - This method emits the specified global variable to the
3933ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner  // address specified in GlobalAddresses, or allocates new memory if it's not
3943ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner  // already in the map.
3951514b5b334c72e1e190fe1ce2bce7bf7d8a91c1aChris Lattner  void EmitGlobalVariable(const GlobalVariable *GV);
3963ddc05bdde6ed65f93340ea467d362e80c0ceb9cChris Lattner
397bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  GenericValue getConstantValue(const Constant *C);
39847567bdcb5ba3886eaf3fa5f0e0b912a24c12347Reid Spencer  void LoadValueFromMemory(GenericValue &Result, GenericValue *Ptr,
39947567bdcb5ba3886eaf3fa5f0e0b912a24c12347Reid Spencer                           const Type *Ty);
400bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner};
401bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
4024b1511b027ce0b648b3379f2891816c25b46f515Reid Klecknernamespace EngineKind {
4034b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  // These are actually bitmasks that get or-ed together.
4044b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  enum Kind {
4054b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    JIT         = 0x1,
4064b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    Interpreter = 0x2
4074b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  };
4084b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  const static Kind Either = (Kind)(JIT | Interpreter);
4094b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner}
4104b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4114b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner/// EngineBuilder - Builder class for ExecutionEngines.  Use this by
4124b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner/// stack-allocating a builder, chaining the various set* methods, and
4134b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner/// terminating it with a .create() call.
4144b1511b027ce0b648b3379f2891816c25b46f515Reid Klecknerclass EngineBuilder {
4154b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4164b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner private:
417f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  Module *M;
4184b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  EngineKind::Kind WhichEngine;
4194b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  std::string *ErrorStr;
4204b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  CodeGenOpt::Level OptLevel;
4214b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  JITMemoryManager *JMM;
4224b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  bool AllocateGVsWithCode;
42388b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher  CodeModel::Model CMModel;
4244688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  std::string MArch;
4254688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  std::string MCPU;
4264688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  SmallVector<std::string, 4> MAttrs;
4274b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4284b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// InitEngine - Does the common initialization of default options.
4294b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  ///
4304b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  void InitEngine() {
4314b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    WhichEngine = EngineKind::Either;
4324b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    ErrorStr = NULL;
4334b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    OptLevel = CodeGenOpt::Default;
4344b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    JMM = NULL;
4354b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    AllocateGVsWithCode = false;
43688b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher    CMModel = CodeModel::Default;
4374b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4384b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4394b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner public:
4404b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// EngineBuilder - Constructor for EngineBuilder.  If create() is called and
441f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  /// is successful, the created engine takes ownership of the module.
442f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  EngineBuilder(Module *m) : M(m) {
4434b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    InitEngine();
4444b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4454b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4464b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// setEngineKind - Controls whether the user wants the interpreter, the JIT,
4474b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// or whichever engine works.  This option defaults to EngineKind::Either.
4484b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  EngineBuilder &setEngineKind(EngineKind::Kind w) {
4494b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    WhichEngine = w;
4504b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    return *this;
4514b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4524b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4534b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// setJITMemoryManager - Sets the memory manager to use.  This allows
4544b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// clients to customize their memory allocation policies.  If create() is
4554b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// called and is successful, the created engine takes ownership of the
4564b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// memory manager.  This option defaults to NULL.
4574b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  EngineBuilder &setJITMemoryManager(JITMemoryManager *jmm) {
4584b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    JMM = jmm;
4594b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    return *this;
4604b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4614b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4624b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// setErrorStr - Set the error string to write to on error.  This option
4634b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// defaults to NULL.
4644b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  EngineBuilder &setErrorStr(std::string *e) {
4654b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    ErrorStr = e;
4664b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    return *this;
4674b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4684b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4694b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// setOptLevel - Set the optimization level for the JIT.  This option
4704b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// defaults to CodeGenOpt::Default.
4714b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  EngineBuilder &setOptLevel(CodeGenOpt::Level l) {
4724b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    OptLevel = l;
4734b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    return *this;
4744b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4754b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
47688b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher  /// setCodeModel - Set the CodeModel that the ExecutionEngine target
47788b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher  /// data is using. Defaults to target specific default "CodeModel::Default".
47888b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher  EngineBuilder &setCodeModel(CodeModel::Model M) {
47988b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher    CMModel = M;
48088b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher    return *this;
48188b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher  }
48288b5aca20a6dd0a8b15ff620bdee59aae567d245Eric Christopher
4834b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// setAllocateGVsWithCode - Sets whether global values should be allocated
4844b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// into the same buffer as code.  For most applications this should be set
4854b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// to false.  Allocating globals with code breaks freeMachineCodeForFunction
4864b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// and is probably unsafe and bad for performance.  However, we have clients
4874b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// who depend on this behavior, so we must support it.  This option defaults
4884b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// to false so that users of the new API can safely use the new memory
4894b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  /// manager and free machine code.
4904b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  EngineBuilder &setAllocateGVsWithCode(bool a) {
4914b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    AllocateGVsWithCode = a;
4924b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner    return *this;
4934b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  }
4944b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
4954688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  /// setMArch - Override the architecture set by the Module's triple.
4964688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  EngineBuilder &setMArch(StringRef march) {
4974688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    MArch.assign(march.begin(), march.end());
4984688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    return *this;
4994688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  }
5004688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin
5014688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  /// setMCPU - Target a specific cpu type.
5024688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  EngineBuilder &setMCPU(StringRef mcpu) {
5034688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    MCPU.assign(mcpu.begin(), mcpu.end());
5044688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    return *this;
5054688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  }
5064688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin
5074688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  /// setMAttrs - Set cpu-specific attributes.
5084688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  template<typename StringSequence>
5094688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  EngineBuilder &setMAttrs(const StringSequence &mattrs) {
5104688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    MAttrs.clear();
5114688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    MAttrs.append(mattrs.begin(), mattrs.end());
5124688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin    return *this;
5134688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin  }
5144688261c20735f5ead2f08695acdeb727db31894Jeffrey Yasskin
5154b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  ExecutionEngine *create();
5164b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner};
5174b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner
518d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
519d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
520bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif
521