//===- ExecutionUtils.h - Utilities for executing code in Orc ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Contains utilities for executing code in Orc. // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_ORC_EXECUTIONUTILS_H #define LLVM_EXECUTIONENGINE_ORC_EXECUTIONUTILS_H #include "llvm/ADT/iterator_range.h" #include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/ExecutionEngine/Orc/Core.h" #include "llvm/ExecutionEngine/Orc/Mangling.h" #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/Shared/OrcError.h" #include "llvm/ExecutionEngine/RuntimeDyld.h" #include "llvm/Object/Archive.h" #include "llvm/Support/DynamicLibrary.h" #include <algorithm> #include <cstdint> #include <utility> #include <vector> namespace llvm { class ConstantArray; class GlobalVariable; class Function; class Module; class Value; namespace object { class MachOUniversalBinary; } namespace orc { class ObjectLayer; /// This iterator provides a convenient way to iterate over the elements /// of an llvm.global_ctors/llvm.global_dtors instance. /// /// The easiest way to get hold of instances of this class is to use the /// getConstructors/getDestructors functions. class CtorDtorIterator { … }; /// Create an iterator range over the entries of the llvm.global_ctors /// array. iterator_range<CtorDtorIterator> getConstructors(const Module &M); /// Create an iterator range over the entries of the llvm.global_ctors /// array. iterator_range<CtorDtorIterator> getDestructors(const Module &M); /// This iterator provides a convenient way to iterate over GlobalValues that /// have initialization effects. class StaticInitGVIterator { … }; /// Create an iterator range over the GlobalValues that contribute to static /// initialization. inline iterator_range<StaticInitGVIterator> getStaticInitGVs(Module &M) { … } class CtorDtorRunner { … }; /// Support class for static dtor execution. For hosted (in-process) JITs /// only! /// /// If a __cxa_atexit function isn't found C++ programs that use static /// destructors will fail to link. However, we don't want to use the host /// process's __cxa_atexit, because it will schedule JIT'd destructors to run /// after the JIT has been torn down, which is no good. This class makes it easy /// to override __cxa_atexit (and the related __dso_handle). /// /// To use, clients should manually call searchOverrides from their symbol /// resolver. This should generally be done after attempting symbol resolution /// inside the JIT, but before searching the host process's symbol table. When /// the client determines that destructors should be run (generally at JIT /// teardown or after a return from main), the runDestructors method should be /// called. class LocalCXXRuntimeOverridesBase { … }; class LocalCXXRuntimeOverrides : public LocalCXXRuntimeOverridesBase { … }; /// An interface for Itanium __cxa_atexit interposer implementations. class ItaniumCXAAtExitSupport { … }; /// A utility class to expose symbols found via dlsym to the JIT. /// /// If an instance of this class is attached to a JITDylib as a fallback /// definition generator, then any symbol found in the given DynamicLibrary that /// passes the 'Allow' predicate will be added to the JITDylib. class DynamicLibrarySearchGenerator : public DefinitionGenerator { … }; /// A utility class to expose symbols from a static library. /// /// If an instance of this class is attached to a JITDylib as a fallback /// definition generator, then any symbol found in the archive will result in /// the containing object being added to the JITDylib. class StaticLibraryDefinitionGenerator : public DefinitionGenerator { … }; /// A utility class to create COFF dllimport GOT symbols (__imp_*) and PLT /// stubs. /// /// If an instance of this class is attached to a JITDylib as a fallback /// definition generator, PLT stubs and dllimport __imp_ symbols will be /// generated for external symbols found outside the given jitdylib. Currently /// only supports x86_64 architecture. class DLLImportDefinitionGenerator : public DefinitionGenerator { … }; } // end namespace orc } // end namespace llvm #endif // LLVM_EXECUTIONENGINE_ORC_EXECUTIONUTILS_H