1//===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the abstract interface that implements execution support
11// for LLVM.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_EXECUTIONENGINE_EXECUTIONENGINE_H
16#define LLVM_EXECUTIONENGINE_EXECUTIONENGINE_H
17
18#include "RuntimeDyld.h"
19#include "llvm-c/ExecutionEngine.h"
20#include "llvm/ADT/SmallVector.h"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/IR/Module.h"
23#include "llvm/IR/ValueHandle.h"
24#include "llvm/IR/ValueMap.h"
25#include "llvm/Object/Binary.h"
26#include "llvm/Support/ErrorHandling.h"
27#include "llvm/Support/Mutex.h"
28#include "llvm/Target/TargetMachine.h"
29#include "llvm/Target/TargetOptions.h"
30#include <functional>
31#include <map>
32#include <string>
33#include <vector>
34
35namespace llvm {
36
37struct GenericValue;
38class Constant;
39class DataLayout;
40class ExecutionEngine;
41class Function;
42class GlobalVariable;
43class GlobalValue;
44class JITEventListener;
45class MachineCodeInfo;
46class MCJITMemoryManager;
47class MutexGuard;
48class ObjectCache;
49class RTDyldMemoryManager;
50class Triple;
51class Type;
52
53namespace object {
54  class Archive;
55  class ObjectFile;
56}
57
58/// \brief Helper class for helping synchronize access to the global address map
59/// table.  Access to this class should be serialized under a mutex.
60class ExecutionEngineState {
61public:
62  typedef StringMap<uint64_t> GlobalAddressMapTy;
63
64private:
65
66  /// GlobalAddressMap - A mapping between LLVM global symbol names values and
67  /// their actualized version...
68  GlobalAddressMapTy GlobalAddressMap;
69
70  /// GlobalAddressReverseMap - This is the reverse mapping of GlobalAddressMap,
71  /// used to convert raw addresses into the LLVM global value that is emitted
72  /// at the address.  This map is not computed unless getGlobalValueAtAddress
73  /// is called at some point.
74  std::map<uint64_t, std::string> GlobalAddressReverseMap;
75
76public:
77
78  GlobalAddressMapTy &getGlobalAddressMap() {
79    return GlobalAddressMap;
80  }
81
82  std::map<uint64_t, std::string> &getGlobalAddressReverseMap() {
83    return GlobalAddressReverseMap;
84  }
85
86  /// \brief Erase an entry from the mapping table.
87  ///
88  /// \returns The address that \p ToUnmap was happed to.
89  uint64_t RemoveMapping(StringRef Name);
90};
91
92using FunctionCreator = std::function<void *(const std::string &)>;
93
94/// \brief Abstract interface for implementation execution of LLVM modules,
95/// designed to support both interpreter and just-in-time (JIT) compiler
96/// implementations.
97class ExecutionEngine {
98  /// The state object holding the global address mapping, which must be
99  /// accessed synchronously.
100  //
101  // FIXME: There is no particular need the entire map needs to be
102  // synchronized.  Wouldn't a reader-writer design be better here?
103  ExecutionEngineState EEState;
104
105  /// The target data for the platform for which execution is being performed.
106  ///
107  /// Note: the DataLayout is LLVMContext specific because it has an
108  /// internal cache based on type pointers. It makes unsafe to reuse the
109  /// ExecutionEngine across context, we don't enforce this rule but undefined
110  /// behavior can occurs if the user tries to do it.
111  const DataLayout DL;
112
113  /// Whether lazy JIT compilation is enabled.
114  bool CompilingLazily;
115
116  /// Whether JIT compilation of external global variables is allowed.
117  bool GVCompilationDisabled;
118
119  /// Whether the JIT should perform lookups of external symbols (e.g.,
120  /// using dlsym).
121  bool SymbolSearchingDisabled;
122
123  /// Whether the JIT should verify IR modules during compilation.
124  bool VerifyModules;
125
126  friend class EngineBuilder;  // To allow access to JITCtor and InterpCtor.
127
128protected:
129  /// The list of Modules that we are JIT'ing from.  We use a SmallVector to
130  /// optimize for the case where there is only one module.
131  SmallVector<std::unique_ptr<Module>, 1> Modules;
132
133  /// getMemoryforGV - Allocate memory for a global variable.
134  virtual char *getMemoryForGV(const GlobalVariable *GV);
135
136  static ExecutionEngine *(*MCJITCtor)(
137                                std::unique_ptr<Module> M,
138                                std::string *ErrorStr,
139                                std::shared_ptr<MCJITMemoryManager> MM,
140                                std::shared_ptr<JITSymbolResolver> SR,
141                                std::unique_ptr<TargetMachine> TM);
142
143  static ExecutionEngine *(*OrcMCJITReplacementCtor)(
144                                std::string *ErrorStr,
145                                std::shared_ptr<MCJITMemoryManager> MM,
146                                std::shared_ptr<JITSymbolResolver> SR,
147                                std::unique_ptr<TargetMachine> TM);
148
149  static ExecutionEngine *(*InterpCtor)(std::unique_ptr<Module> M,
150                                        std::string *ErrorStr);
151
152  /// LazyFunctionCreator - If an unknown function is needed, this function
153  /// pointer is invoked to create it.  If this returns null, the JIT will
154  /// abort.
155  FunctionCreator LazyFunctionCreator;
156
157  /// getMangledName - Get mangled name.
158  std::string getMangledName(const GlobalValue *GV);
159
160public:
161  /// lock - This lock protects the ExecutionEngine and MCJIT classes. It must
162  /// be held while changing the internal state of any of those classes.
163  sys::Mutex lock;
164
165  //===--------------------------------------------------------------------===//
166  //  ExecutionEngine Startup
167  //===--------------------------------------------------------------------===//
168
169  virtual ~ExecutionEngine();
170
171  /// Add a Module to the list of modules that we can JIT from.
172  virtual void addModule(std::unique_ptr<Module> M) {
173    Modules.push_back(std::move(M));
174  }
175
176  /// addObjectFile - Add an ObjectFile to the execution engine.
177  ///
178  /// This method is only supported by MCJIT.  MCJIT will immediately load the
179  /// object into memory and adds its symbols to the list used to resolve
180  /// external symbols while preparing other objects for execution.
181  ///
182  /// Objects added using this function will not be made executable until
183  /// needed by another object.
184  ///
185  /// MCJIT will take ownership of the ObjectFile.
186  virtual void addObjectFile(std::unique_ptr<object::ObjectFile> O);
187  virtual void addObjectFile(object::OwningBinary<object::ObjectFile> O);
188
189  /// addArchive - Add an Archive to the execution engine.
190  ///
191  /// This method is only supported by MCJIT.  MCJIT will use the archive to
192  /// resolve external symbols in objects it is loading.  If a symbol is found
193  /// in the Archive the contained object file will be extracted (in memory)
194  /// and loaded for possible execution.
195  virtual void addArchive(object::OwningBinary<object::Archive> A);
196
197  //===--------------------------------------------------------------------===//
198
199  const DataLayout &getDataLayout() const { return DL; }
200
201  /// removeModule - Removes a Module from the list of modules, but does not
202  /// free the module's memory. Returns true if M is found, in which case the
203  /// caller assumes responsibility for deleting the module.
204  //
205  // FIXME: This stealth ownership transfer is horrible. This will probably be
206  //        fixed by deleting ExecutionEngine.
207  virtual bool removeModule(Module *M);
208
209  /// FindFunctionNamed - Search all of the active modules to find the function that
210  /// defines FnName.  This is very slow operation and shouldn't be used for
211  /// general code.
212  virtual Function *FindFunctionNamed(StringRef FnName);
213
214  /// FindGlobalVariableNamed - Search all of the active modules to find the global variable
215  /// that defines Name.  This is very slow operation and shouldn't be used for
216  /// general code.
217  virtual GlobalVariable *FindGlobalVariableNamed(StringRef Name, bool AllowInternal = false);
218
219  /// runFunction - Execute the specified function with the specified arguments,
220  /// and return the result.
221  ///
222  /// For MCJIT execution engines, clients are encouraged to use the
223  /// "GetFunctionAddress" method (rather than runFunction) and cast the
224  /// returned uint64_t to the desired function pointer type. However, for
225  /// backwards compatibility MCJIT's implementation can execute 'main-like'
226  /// function (i.e. those returning void or int, and taking either no
227  /// arguments or (int, char*[])).
228  virtual GenericValue runFunction(Function *F,
229                                   ArrayRef<GenericValue> ArgValues) = 0;
230
231  /// getPointerToNamedFunction - This method returns the address of the
232  /// specified function by using the dlsym function call.  As such it is only
233  /// useful for resolving library symbols, not code generated symbols.
234  ///
235  /// If AbortOnFailure is false and no function with the given name is
236  /// found, this function silently returns a null pointer. Otherwise,
237  /// it prints a message to stderr and aborts.
238  ///
239  /// This function is deprecated for the MCJIT execution engine.
240  virtual void *getPointerToNamedFunction(StringRef Name,
241                                          bool AbortOnFailure = true) = 0;
242
243  /// mapSectionAddress - map a section to its target address space value.
244  /// Map the address of a JIT section as returned from the memory manager
245  /// to the address in the target process as the running code will see it.
246  /// This is the address which will be used for relocation resolution.
247  virtual void mapSectionAddress(const void *LocalAddress,
248                                 uint64_t TargetAddress) {
249    llvm_unreachable("Re-mapping of section addresses not supported with this "
250                     "EE!");
251  }
252
253  /// generateCodeForModule - Run code generation for the specified module and
254  /// load it into memory.
255  ///
256  /// When this function has completed, all code and data for the specified
257  /// module, and any module on which this module depends, will be generated
258  /// and loaded into memory, but relocations will not yet have been applied
259  /// and all memory will be readable and writable but not executable.
260  ///
261  /// This function is primarily useful when generating code for an external
262  /// target, allowing the client an opportunity to remap section addresses
263  /// before relocations are applied.  Clients that intend to execute code
264  /// locally can use the getFunctionAddress call, which will generate code
265  /// and apply final preparations all in one step.
266  ///
267  /// This method has no effect for the interpeter.
268  virtual void generateCodeForModule(Module *M) {}
269
270  /// finalizeObject - ensure the module is fully processed and is usable.
271  ///
272  /// It is the user-level function for completing the process of making the
273  /// object usable for execution.  It should be called after sections within an
274  /// object have been relocated using mapSectionAddress.  When this method is
275  /// called the MCJIT execution engine will reapply relocations for a loaded
276  /// object.  This method has no effect for the interpeter.
277  virtual void finalizeObject() {}
278
279  /// runStaticConstructorsDestructors - This method is used to execute all of
280  /// the static constructors or destructors for a program.
281  ///
282  /// \param isDtors - Run the destructors instead of constructors.
283  virtual void runStaticConstructorsDestructors(bool isDtors);
284
285  /// This method is used to execute all of the static constructors or
286  /// destructors for a particular module.
287  ///
288  /// \param isDtors - Run the destructors instead of constructors.
289  void runStaticConstructorsDestructors(Module &module, bool isDtors);
290
291
292  /// runFunctionAsMain - This is a helper function which wraps runFunction to
293  /// handle the common task of starting up main with the specified argc, argv,
294  /// and envp parameters.
295  int runFunctionAsMain(Function *Fn, const std::vector<std::string> &argv,
296                        const char * const * envp);
297
298
299  /// addGlobalMapping - Tell the execution engine that the specified global is
300  /// at the specified location.  This is used internally as functions are JIT'd
301  /// and as global variables are laid out in memory.  It can and should also be
302  /// used by clients of the EE that want to have an LLVM global overlay
303  /// existing data in memory. Values to be mapped should be named, and have
304  /// external or weak linkage. Mappings are automatically removed when their
305  /// GlobalValue is destroyed.
306  void addGlobalMapping(const GlobalValue *GV, void *Addr);
307  void addGlobalMapping(StringRef Name, uint64_t Addr);
308
309  /// clearAllGlobalMappings - Clear all global mappings and start over again,
310  /// for use in dynamic compilation scenarios to move globals.
311  void clearAllGlobalMappings();
312
313  /// clearGlobalMappingsFromModule - Clear all global mappings that came from a
314  /// particular module, because it has been removed from the JIT.
315  void clearGlobalMappingsFromModule(Module *M);
316
317  /// updateGlobalMapping - Replace an existing mapping for GV with a new
318  /// address.  This updates both maps as required.  If "Addr" is null, the
319  /// entry for the global is removed from the mappings.  This returns the old
320  /// value of the pointer, or null if it was not in the map.
321  uint64_t updateGlobalMapping(const GlobalValue *GV, void *Addr);
322  uint64_t updateGlobalMapping(StringRef Name, uint64_t Addr);
323
324  /// getAddressToGlobalIfAvailable - This returns the address of the specified
325  /// global symbol.
326  uint64_t getAddressToGlobalIfAvailable(StringRef S);
327
328  /// getPointerToGlobalIfAvailable - This returns the address of the specified
329  /// global value if it is has already been codegen'd, otherwise it returns
330  /// null.
331  void *getPointerToGlobalIfAvailable(StringRef S);
332  void *getPointerToGlobalIfAvailable(const GlobalValue *GV);
333
334  /// getPointerToGlobal - This returns the address of the specified global
335  /// value. This may involve code generation if it's a function.
336  ///
337  /// This function is deprecated for the MCJIT execution engine.  Use
338  /// getGlobalValueAddress instead.
339  void *getPointerToGlobal(const GlobalValue *GV);
340
341  /// getPointerToFunction - The different EE's represent function bodies in
342  /// different ways.  They should each implement this to say what a function
343  /// pointer should look like.  When F is destroyed, the ExecutionEngine will
344  /// remove its global mapping and free any machine code.  Be sure no threads
345  /// are running inside F when that happens.
346  ///
347  /// This function is deprecated for the MCJIT execution engine.  Use
348  /// getFunctionAddress instead.
349  virtual void *getPointerToFunction(Function *F) = 0;
350
351  /// getPointerToFunctionOrStub - If the specified function has been
352  /// code-gen'd, return a pointer to the function.  If not, compile it, or use
353  /// a stub to implement lazy compilation if available.  See
354  /// getPointerToFunction for the requirements on destroying F.
355  ///
356  /// This function is deprecated for the MCJIT execution engine.  Use
357  /// getFunctionAddress instead.
358  virtual void *getPointerToFunctionOrStub(Function *F) {
359    // Default implementation, just codegen the function.
360    return getPointerToFunction(F);
361  }
362
363  /// getGlobalValueAddress - Return the address of the specified global
364  /// value. This may involve code generation.
365  ///
366  /// This function should not be called with the interpreter engine.
367  virtual uint64_t getGlobalValueAddress(const std::string &Name) {
368    // Default implementation for the interpreter.  MCJIT will override this.
369    // JIT and interpreter clients should use getPointerToGlobal instead.
370    return 0;
371  }
372
373  /// getFunctionAddress - Return the address of the specified function.
374  /// This may involve code generation.
375  virtual uint64_t getFunctionAddress(const std::string &Name) {
376    // Default implementation for the interpreter.  MCJIT will override this.
377    // Interpreter clients should use getPointerToFunction instead.
378    return 0;
379  }
380
381  /// getGlobalValueAtAddress - Return the LLVM global value object that starts
382  /// at the specified address.
383  ///
384  const GlobalValue *getGlobalValueAtAddress(void *Addr);
385
386  /// StoreValueToMemory - Stores the data in Val of type Ty at address Ptr.
387  /// Ptr is the address of the memory at which to store Val, cast to
388  /// GenericValue *.  It is not a pointer to a GenericValue containing the
389  /// address at which to store Val.
390  void StoreValueToMemory(const GenericValue &Val, GenericValue *Ptr,
391                          Type *Ty);
392
393  void InitializeMemory(const Constant *Init, void *Addr);
394
395  /// getOrEmitGlobalVariable - Return the address of the specified global
396  /// variable, possibly emitting it to memory if needed.  This is used by the
397  /// Emitter.
398  ///
399  /// This function is deprecated for the MCJIT execution engine.  Use
400  /// getGlobalValueAddress instead.
401  virtual void *getOrEmitGlobalVariable(const GlobalVariable *GV) {
402    return getPointerToGlobal((const GlobalValue *)GV);
403  }
404
405  /// Registers a listener to be called back on various events within
406  /// the JIT.  See JITEventListener.h for more details.  Does not
407  /// take ownership of the argument.  The argument may be NULL, in
408  /// which case these functions do nothing.
409  virtual void RegisterJITEventListener(JITEventListener *) {}
410  virtual void UnregisterJITEventListener(JITEventListener *) {}
411
412  /// Sets the pre-compiled object cache.  The ownership of the ObjectCache is
413  /// not changed.  Supported by MCJIT but not the interpreter.
414  virtual void setObjectCache(ObjectCache *) {
415    llvm_unreachable("No support for an object cache");
416  }
417
418  /// setProcessAllSections (MCJIT Only): By default, only sections that are
419  /// "required for execution" are passed to the RTDyldMemoryManager, and other
420  /// sections are discarded. Passing 'true' to this method will cause
421  /// RuntimeDyld to pass all sections to its RTDyldMemoryManager regardless
422  /// of whether they are "required to execute" in the usual sense.
423  ///
424  /// Rationale: Some MCJIT clients want to be able to inspect metadata
425  /// sections (e.g. Dwarf, Stack-maps) to enable functionality or analyze
426  /// performance. Passing these sections to the memory manager allows the
427  /// client to make policy about the relevant sections, rather than having
428  /// MCJIT do it.
429  virtual void setProcessAllSections(bool ProcessAllSections) {
430    llvm_unreachable("No support for ProcessAllSections option");
431  }
432
433  /// Return the target machine (if available).
434  virtual TargetMachine *getTargetMachine() { return nullptr; }
435
436  /// DisableLazyCompilation - When lazy compilation is off (the default), the
437  /// JIT will eagerly compile every function reachable from the argument to
438  /// getPointerToFunction.  If lazy compilation is turned on, the JIT will only
439  /// compile the one function and emit stubs to compile the rest when they're
440  /// first called.  If lazy compilation is turned off again while some lazy
441  /// stubs are still around, and one of those stubs is called, the program will
442  /// abort.
443  ///
444  /// In order to safely compile lazily in a threaded program, the user must
445  /// ensure that 1) only one thread at a time can call any particular lazy
446  /// stub, and 2) any thread modifying LLVM IR must hold the JIT's lock
447  /// (ExecutionEngine::lock) or otherwise ensure that no other thread calls a
448  /// lazy stub.  See http://llvm.org/PR5184 for details.
449  void DisableLazyCompilation(bool Disabled = true) {
450    CompilingLazily = !Disabled;
451  }
452  bool isCompilingLazily() const {
453    return CompilingLazily;
454  }
455
456  /// DisableGVCompilation - If called, the JIT will abort if it's asked to
457  /// allocate space and populate a GlobalVariable that is not internal to
458  /// the module.
459  void DisableGVCompilation(bool Disabled = true) {
460    GVCompilationDisabled = Disabled;
461  }
462  bool isGVCompilationDisabled() const {
463    return GVCompilationDisabled;
464  }
465
466  /// DisableSymbolSearching - If called, the JIT will not try to lookup unknown
467  /// symbols with dlsym.  A client can still use InstallLazyFunctionCreator to
468  /// resolve symbols in a custom way.
469  void DisableSymbolSearching(bool Disabled = true) {
470    SymbolSearchingDisabled = Disabled;
471  }
472  bool isSymbolSearchingDisabled() const {
473    return SymbolSearchingDisabled;
474  }
475
476  /// Enable/Disable IR module verification.
477  ///
478  /// Note: Module verification is enabled by default in Debug builds, and
479  /// disabled by default in Release. Use this method to override the default.
480  void setVerifyModules(bool Verify) {
481    VerifyModules = Verify;
482  }
483  bool getVerifyModules() const {
484    return VerifyModules;
485  }
486
487  /// InstallLazyFunctionCreator - If an unknown function is needed, the
488  /// specified function pointer is invoked to create it.  If it returns null,
489  /// the JIT will abort.
490  void InstallLazyFunctionCreator(FunctionCreator C) {
491    LazyFunctionCreator = std::move(C);
492  }
493
494protected:
495  ExecutionEngine(DataLayout DL) : DL(std::move(DL)) {}
496  explicit ExecutionEngine(DataLayout DL, std::unique_ptr<Module> M);
497  explicit ExecutionEngine(std::unique_ptr<Module> M);
498
499  void emitGlobals();
500
501  void EmitGlobalVariable(const GlobalVariable *GV);
502
503  GenericValue getConstantValue(const Constant *C);
504  void LoadValueFromMemory(GenericValue &Result, GenericValue *Ptr,
505                           Type *Ty);
506
507private:
508  void Init(std::unique_ptr<Module> M);
509};
510
511namespace EngineKind {
512  // These are actually bitmasks that get or-ed together.
513  enum Kind {
514    JIT         = 0x1,
515    Interpreter = 0x2
516  };
517  const static Kind Either = (Kind)(JIT | Interpreter);
518}
519
520/// Builder class for ExecutionEngines. Use this by stack-allocating a builder,
521/// chaining the various set* methods, and terminating it with a .create()
522/// call.
523class EngineBuilder {
524private:
525  std::unique_ptr<Module> M;
526  EngineKind::Kind WhichEngine;
527  std::string *ErrorStr;
528  CodeGenOpt::Level OptLevel;
529  std::shared_ptr<MCJITMemoryManager> MemMgr;
530  std::shared_ptr<JITSymbolResolver> Resolver;
531  TargetOptions Options;
532  Optional<Reloc::Model> RelocModel;
533  CodeModel::Model CMModel;
534  std::string MArch;
535  std::string MCPU;
536  SmallVector<std::string, 4> MAttrs;
537  bool VerifyModules;
538  bool UseOrcMCJITReplacement;
539
540public:
541  /// Default constructor for EngineBuilder.
542  EngineBuilder();
543
544  /// Constructor for EngineBuilder.
545  EngineBuilder(std::unique_ptr<Module> M);
546
547  // Out-of-line since we don't have the def'n of RTDyldMemoryManager here.
548  ~EngineBuilder();
549
550  /// setEngineKind - Controls whether the user wants the interpreter, the JIT,
551  /// or whichever engine works.  This option defaults to EngineKind::Either.
552  EngineBuilder &setEngineKind(EngineKind::Kind w) {
553    WhichEngine = w;
554    return *this;
555  }
556
557  /// setMCJITMemoryManager - Sets the MCJIT memory manager to use. This allows
558  /// clients to customize their memory allocation policies for the MCJIT. This
559  /// is only appropriate for the MCJIT; setting this and configuring the builder
560  /// to create anything other than MCJIT will cause a runtime error. If create()
561  /// is called and is successful, the created engine takes ownership of the
562  /// memory manager. This option defaults to NULL.
563  EngineBuilder &setMCJITMemoryManager(std::unique_ptr<RTDyldMemoryManager> mcjmm);
564
565  EngineBuilder&
566  setMemoryManager(std::unique_ptr<MCJITMemoryManager> MM);
567
568  EngineBuilder&
569  setSymbolResolver(std::unique_ptr<JITSymbolResolver> SR);
570
571  /// setErrorStr - Set the error string to write to on error.  This option
572  /// defaults to NULL.
573  EngineBuilder &setErrorStr(std::string *e) {
574    ErrorStr = e;
575    return *this;
576  }
577
578  /// setOptLevel - Set the optimization level for the JIT.  This option
579  /// defaults to CodeGenOpt::Default.
580  EngineBuilder &setOptLevel(CodeGenOpt::Level l) {
581    OptLevel = l;
582    return *this;
583  }
584
585  /// setTargetOptions - Set the target options that the ExecutionEngine
586  /// target is using. Defaults to TargetOptions().
587  EngineBuilder &setTargetOptions(const TargetOptions &Opts) {
588    Options = Opts;
589    return *this;
590  }
591
592  /// setRelocationModel - Set the relocation model that the ExecutionEngine
593  /// target is using. Defaults to target specific default "Reloc::Default".
594  EngineBuilder &setRelocationModel(Reloc::Model RM) {
595    RelocModel = RM;
596    return *this;
597  }
598
599  /// setCodeModel - Set the CodeModel that the ExecutionEngine target
600  /// data is using. Defaults to target specific default
601  /// "CodeModel::JITDefault".
602  EngineBuilder &setCodeModel(CodeModel::Model M) {
603    CMModel = M;
604    return *this;
605  }
606
607  /// setMArch - Override the architecture set by the Module's triple.
608  EngineBuilder &setMArch(StringRef march) {
609    MArch.assign(march.begin(), march.end());
610    return *this;
611  }
612
613  /// setMCPU - Target a specific cpu type.
614  EngineBuilder &setMCPU(StringRef mcpu) {
615    MCPU.assign(mcpu.begin(), mcpu.end());
616    return *this;
617  }
618
619  /// setVerifyModules - Set whether the JIT implementation should verify
620  /// IR modules during compilation.
621  EngineBuilder &setVerifyModules(bool Verify) {
622    VerifyModules = Verify;
623    return *this;
624  }
625
626  /// setMAttrs - Set cpu-specific attributes.
627  template<typename StringSequence>
628  EngineBuilder &setMAttrs(const StringSequence &mattrs) {
629    MAttrs.clear();
630    MAttrs.append(mattrs.begin(), mattrs.end());
631    return *this;
632  }
633
634  // \brief Use OrcMCJITReplacement instead of MCJIT. Off by default.
635  void setUseOrcMCJITReplacement(bool UseOrcMCJITReplacement) {
636    this->UseOrcMCJITReplacement = UseOrcMCJITReplacement;
637  }
638
639  TargetMachine *selectTarget();
640
641  /// selectTarget - Pick a target either via -march or by guessing the native
642  /// arch.  Add any CPU features specified via -mcpu or -mattr.
643  TargetMachine *selectTarget(const Triple &TargetTriple,
644                              StringRef MArch,
645                              StringRef MCPU,
646                              const SmallVectorImpl<std::string>& MAttrs);
647
648  ExecutionEngine *create() {
649    return create(selectTarget());
650  }
651
652  ExecutionEngine *create(TargetMachine *TM);
653};
654
655// Create wrappers for C Binding types (see CBindingWrapping.h).
656DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionEngine, LLVMExecutionEngineRef)
657
658} // End llvm namespace
659
660#endif
661