File indexing completed on 2026-05-10 08:43:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
0014 #define LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
0015
0016 #include "llvm/ADT/FunctionExtras.h"
0017 #include "llvm/ExecutionEngine/Orc/Core.h"
0018 #include "llvm/ExecutionEngine/Orc/LazyReexports.h"
0019 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h"
0020 #include "llvm/Support/Error.h"
0021
0022 namespace llvm::jitlink {
0023 class Block;
0024 class LinkGraph;
0025 class Section;
0026 class Symbol;
0027 }
0028
0029 namespace llvm::orc {
0030
0031 class ObjectLinkingLayer;
0032 class RedirectableSymbolManager;
0033
0034
0035 class JITLinkReentryTrampolines {
0036 public:
0037 using EmitTrampolineFn = unique_function<jitlink::Symbol &(
0038 jitlink::LinkGraph &G, jitlink::Section &Sec,
0039 jitlink::Symbol &ReentrySym)>;
0040 using OnTrampolinesReadyFn = unique_function<void(
0041 Expected<std::vector<ExecutorSymbolDef>> EntryAddrs)>;
0042
0043
0044
0045 static Expected<std::unique_ptr<JITLinkReentryTrampolines>>
0046 Create(ObjectLinkingLayer &ObjLinkingLayer);
0047
0048 JITLinkReentryTrampolines(ObjectLinkingLayer &ObjLinkingLayer,
0049 EmitTrampolineFn EmitTrampoline);
0050 JITLinkReentryTrampolines(JITLinkReentryTrampolines &&) = delete;
0051 JITLinkReentryTrampolines &operator=(JITLinkReentryTrampolines &&) = delete;
0052
0053 void emit(ResourceTrackerSP RT, size_t NumTrampolines,
0054 OnTrampolinesReadyFn OnTrampolinesReady);
0055
0056 private:
0057 class TrampolineAddrScraperPlugin;
0058
0059 ObjectLinkingLayer &ObjLinkingLayer;
0060 TrampolineAddrScraperPlugin *TrampolineAddrScraper = nullptr;
0061 EmitTrampolineFn EmitTrampoline;
0062 std::atomic<size_t> ReentryGraphIdx{0};
0063 };
0064
0065 Expected<std::unique_ptr<LazyReexportsManager>>
0066 createJITLinkLazyReexportsManager(ObjectLinkingLayer &ObjLinkingLayer,
0067 RedirectableSymbolManager &RSMgr,
0068 JITDylib &PlatformJD,
0069 LazyReexportsManager::Listener *L = nullptr);
0070
0071 }
0072
0073 #endif