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