Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 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 |