1//===- JITLinkReentryTrampolines.h -- JITLink-based trampolines -*- 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// Emit reentry trampolines via JITLink.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
14#define LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
15
16#include "llvm/ADT/FunctionExtras.h"
17#include "llvm/ExecutionEngine/Orc/Core.h"
18#include "llvm/ExecutionEngine/Orc/LazyReexports.h"
19#include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h"
20#include "llvm/Support/Compiler.h"
21#include "llvm/Support/Error.h"
22
23namespace llvm::jitlink {
24class Block;
25class LinkGraph;
26class Section;
27class Symbol;
28} // namespace llvm::jitlink
29
30namespace llvm::orc {
31
32class ObjectLinkingLayer;
33class RedirectableSymbolManager;
34
35/// Produces trampolines on request using JITLink.
36class JITLinkReentryTrampolines {
37public:
38 using EmitTrampolineFn = unique_function<jitlink::Symbol &(
39 jitlink::LinkGraph &G, jitlink::Section &Sec,
40 jitlink::Symbol &ReentrySym)>;
41 using OnTrampolinesReadyFn = unique_function<void(
42 Expected<std::vector<ExecutorSymbolDef>> EntryAddrs)>;
43
44 /// Create trampolines using the default reentry trampoline function for
45 /// the session triple.
46 LLVM_ABI static Expected<std::unique_ptr<JITLinkReentryTrampolines>>
47 Create(ObjectLinkingLayer &ObjLinkingLayer);
48
49 LLVM_ABI JITLinkReentryTrampolines(ObjectLinkingLayer &ObjLinkingLayer,
50 EmitTrampolineFn EmitTrampoline);
51 JITLinkReentryTrampolines(JITLinkReentryTrampolines &&) = delete;
52 JITLinkReentryTrampolines &operator=(JITLinkReentryTrampolines &&) = delete;
53
54 LLVM_ABI void emit(ResourceTrackerSP RT, size_t NumTrampolines,
55 OnTrampolinesReadyFn OnTrampolinesReady);
56
57private:
58 class TrampolineAddrScraperPlugin;
59
60 ObjectLinkingLayer &ObjLinkingLayer;
61 TrampolineAddrScraperPlugin *TrampolineAddrScraper = nullptr;
62 EmitTrampolineFn EmitTrampoline;
63 std::atomic<size_t> ReentryGraphIdx{0};
64};
65
66LLVM_ABI Expected<std::unique_ptr<LazyReexportsManager>>
67createJITLinkLazyReexportsManager(ObjectLinkingLayer &ObjLinkingLayer,
68 RedirectableSymbolManager &RSMgr,
69 JITDylib &PlatformJD,
70 LazyReexportsManager::Listener *L = nullptr);
71
72} // namespace llvm::orc
73
74#endif // LLVM_EXECUTIONENGINE_ORC_JITLINKREENTRYTRAMPOLINES_H
75