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_LINKGRAPHLINKINGLAYER_H
0014 #define LLVM_EXECUTIONENGINE_ORC_LINKGRAPHLINKINGLAYER_H
0015
0016 #include "llvm/ADT/STLExtras.h"
0017 #include "llvm/ADT/StringRef.h"
0018 #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"
0019 #include "llvm/ExecutionEngine/Orc/Core.h"
0020 #include "llvm/ExecutionEngine/Orc/Layer.h"
0021 #include "llvm/ExecutionEngine/Orc/LinkGraphLayer.h"
0022 #include "llvm/Support/Error.h"
0023 #include <algorithm>
0024 #include <cassert>
0025 #include <functional>
0026 #include <memory>
0027 #include <mutex>
0028 #include <utility>
0029 #include <vector>
0030
0031 namespace llvm {
0032
0033 namespace jitlink {
0034 class EHFrameRegistrar;
0035 }
0036
0037 namespace orc {
0038
0039
0040
0041
0042
0043 class LinkGraphLinkingLayer : public LinkGraphLayer, private ResourceManager {
0044 class JITLinkCtx;
0045
0046 public:
0047
0048
0049
0050 class Plugin {
0051 public:
0052 virtual ~Plugin();
0053 virtual void modifyPassConfig(MaterializationResponsibility &MR,
0054 jitlink::LinkGraph &G,
0055 jitlink::PassConfiguration &Config) {}
0056
0057
0058
0059 virtual void notifyMaterializing(MaterializationResponsibility &MR,
0060 jitlink::LinkGraph &G,
0061 jitlink::JITLinkContext &Ctx,
0062 MemoryBufferRef InputObject) {}
0063
0064 virtual void notifyLoaded(MaterializationResponsibility &MR) {}
0065 virtual Error notifyEmitted(MaterializationResponsibility &MR) {
0066 return Error::success();
0067 }
0068 virtual Error notifyFailed(MaterializationResponsibility &MR) = 0;
0069 virtual Error notifyRemovingResources(JITDylib &JD, ResourceKey K) = 0;
0070 virtual void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
0071 ResourceKey SrcKey) = 0;
0072 };
0073
0074
0075
0076 LinkGraphLinkingLayer(ExecutionSession &ES);
0077
0078
0079 LinkGraphLinkingLayer(ExecutionSession &ES,
0080 jitlink::JITLinkMemoryManager &MemMgr);
0081
0082
0083
0084
0085
0086 LinkGraphLinkingLayer(ExecutionSession &ES,
0087 std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr);
0088
0089
0090 ~LinkGraphLinkingLayer();
0091
0092
0093 LinkGraphLinkingLayer &addPlugin(std::shared_ptr<Plugin> P) {
0094 std::lock_guard<std::mutex> Lock(LayerMutex);
0095 Plugins.push_back(std::move(P));
0096 return *this;
0097 }
0098
0099
0100
0101
0102
0103 void removePlugin(Plugin &P) {
0104 std::lock_guard<std::mutex> Lock(LayerMutex);
0105 auto I = llvm::find_if(Plugins, [&](const std::shared_ptr<Plugin> &Elem) {
0106 return Elem.get() == &P;
0107 });
0108 assert(I != Plugins.end() && "Plugin not present");
0109 Plugins.erase(I);
0110 }
0111
0112
0113 void emit(std::unique_ptr<MaterializationResponsibility> R,
0114 std::unique_ptr<jitlink::LinkGraph> G) override;
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124 LinkGraphLinkingLayer &
0125 setOverrideObjectFlagsWithResponsibilityFlags(bool OverrideObjectFlags) {
0126 this->OverrideObjectFlags = OverrideObjectFlags;
0127 return *this;
0128 }
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 LinkGraphLinkingLayer &
0142 setAutoClaimResponsibilityForObjectSymbols(bool AutoClaimObjectSymbols) {
0143 this->AutoClaimObjectSymbols = AutoClaimObjectSymbols;
0144 return *this;
0145 }
0146
0147 protected:
0148
0149
0150
0151 void emit(std::unique_ptr<MaterializationResponsibility> R,
0152 std::unique_ptr<jitlink::LinkGraph> G,
0153 std::unique_ptr<MemoryBuffer> ObjBuf);
0154
0155 std::function<void(std::unique_ptr<MemoryBuffer>)> ReturnObjectBuffer;
0156
0157 private:
0158 using FinalizedAlloc = jitlink::JITLinkMemoryManager::FinalizedAlloc;
0159
0160 Error recordFinalizedAlloc(MaterializationResponsibility &MR,
0161 FinalizedAlloc FA);
0162
0163 Error handleRemoveResources(JITDylib &JD, ResourceKey K) override;
0164 void handleTransferResources(JITDylib &JD, ResourceKey DstKey,
0165 ResourceKey SrcKey) override;
0166
0167 mutable std::mutex LayerMutex;
0168 jitlink::JITLinkMemoryManager &MemMgr;
0169 std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgrOwnership;
0170 bool OverrideObjectFlags = false;
0171 bool AutoClaimObjectSymbols = false;
0172 DenseMap<ResourceKey, std::vector<FinalizedAlloc>> Allocs;
0173 std::vector<std::shared_ptr<Plugin>> Plugins;
0174 };
0175
0176 }
0177 }
0178
0179 #endif