Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.