xref: /freebsd-src/contrib/llvm-project/llvm/tools/lli/ForwardingMemoryManager.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1349cc55cSDimitry Andric //===-- RemoteJITUtils.h - Utilities for remote-JITing with LLI -*- C++ -*-===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric //
9349cc55cSDimitry Andric // Utilities for remote-JITing with LLI.
10349cc55cSDimitry Andric //
11349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
12349cc55cSDimitry Andric 
13349cc55cSDimitry Andric #ifndef LLVM_TOOLS_LLI_FORWARDINGMEMORYMANAGER_H
14349cc55cSDimitry Andric #define LLVM_TOOLS_LLI_FORWARDINGMEMORYMANAGER_H
15349cc55cSDimitry Andric 
16349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
17349cc55cSDimitry Andric #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
18349cc55cSDimitry Andric 
19349cc55cSDimitry Andric namespace llvm {
20349cc55cSDimitry Andric 
21349cc55cSDimitry Andric // ForwardingMM - Adapter to connect MCJIT to Orc's Remote
22349cc55cSDimitry Andric // memory manager.
23349cc55cSDimitry Andric class ForwardingMemoryManager : public llvm::RTDyldMemoryManager {
24349cc55cSDimitry Andric public:
25349cc55cSDimitry Andric   void setMemMgr(std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr) {
26349cc55cSDimitry Andric     this->MemMgr = std::move(MemMgr);
27349cc55cSDimitry Andric   }
28349cc55cSDimitry Andric 
29349cc55cSDimitry Andric   void setResolver(std::shared_ptr<LegacyJITSymbolResolver> Resolver) {
30349cc55cSDimitry Andric     this->Resolver = std::move(Resolver);
31349cc55cSDimitry Andric   }
32349cc55cSDimitry Andric 
33349cc55cSDimitry Andric   uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
34349cc55cSDimitry Andric                                unsigned SectionID,
35349cc55cSDimitry Andric                                StringRef SectionName) override {
36349cc55cSDimitry Andric     return MemMgr->allocateCodeSection(Size, Alignment, SectionID, SectionName);
37349cc55cSDimitry Andric   }
38349cc55cSDimitry Andric 
39349cc55cSDimitry Andric   uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
40349cc55cSDimitry Andric                                unsigned SectionID, StringRef SectionName,
41349cc55cSDimitry Andric                                bool IsReadOnly) override {
42349cc55cSDimitry Andric     return MemMgr->allocateDataSection(Size, Alignment, SectionID, SectionName,
43349cc55cSDimitry Andric                                        IsReadOnly);
44349cc55cSDimitry Andric   }
45349cc55cSDimitry Andric 
46bdd1243dSDimitry Andric   void reserveAllocationSpace(uintptr_t CodeSize, Align CodeAlign,
47bdd1243dSDimitry Andric                               uintptr_t RODataSize, Align RODataAlign,
48349cc55cSDimitry Andric                               uintptr_t RWDataSize,
49bdd1243dSDimitry Andric                               Align RWDataAlign) override {
50349cc55cSDimitry Andric     MemMgr->reserveAllocationSpace(CodeSize, CodeAlign, RODataSize, RODataAlign,
51349cc55cSDimitry Andric                                    RWDataSize, RWDataAlign);
52349cc55cSDimitry Andric   }
53349cc55cSDimitry Andric 
54349cc55cSDimitry Andric   bool needsToReserveAllocationSpace() override {
55349cc55cSDimitry Andric     return MemMgr->needsToReserveAllocationSpace();
56349cc55cSDimitry Andric   }
57349cc55cSDimitry Andric 
58349cc55cSDimitry Andric   void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr,
59349cc55cSDimitry Andric                         size_t Size) override {
60349cc55cSDimitry Andric     MemMgr->registerEHFrames(Addr, LoadAddr, Size);
61349cc55cSDimitry Andric   }
62349cc55cSDimitry Andric 
63349cc55cSDimitry Andric   void deregisterEHFrames() override { MemMgr->deregisterEHFrames(); }
64349cc55cSDimitry Andric 
65349cc55cSDimitry Andric   bool finalizeMemory(std::string *ErrMsg = nullptr) override {
66349cc55cSDimitry Andric     return MemMgr->finalizeMemory(ErrMsg);
67349cc55cSDimitry Andric   }
68349cc55cSDimitry Andric 
69349cc55cSDimitry Andric   void notifyObjectLoaded(RuntimeDyld &RTDyld,
70349cc55cSDimitry Andric                           const object::ObjectFile &Obj) override {
71349cc55cSDimitry Andric     MemMgr->notifyObjectLoaded(RTDyld, Obj);
72349cc55cSDimitry Andric   }
73349cc55cSDimitry Andric 
74349cc55cSDimitry Andric   // Don't hide the sibling notifyObjectLoaded from RTDyldMemoryManager.
75349cc55cSDimitry Andric   using RTDyldMemoryManager::notifyObjectLoaded;
76349cc55cSDimitry Andric 
77349cc55cSDimitry Andric   JITSymbol findSymbol(const std::string &Name) override {
78349cc55cSDimitry Andric     return Resolver->findSymbol(Name);
79349cc55cSDimitry Andric   }
80349cc55cSDimitry Andric 
81349cc55cSDimitry Andric   JITSymbol findSymbolInLogicalDylib(const std::string &Name) override {
82349cc55cSDimitry Andric     return Resolver->findSymbolInLogicalDylib(Name);
83349cc55cSDimitry Andric   }
84349cc55cSDimitry Andric 
85349cc55cSDimitry Andric private:
86349cc55cSDimitry Andric   std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr;
87349cc55cSDimitry Andric   std::shared_ptr<LegacyJITSymbolResolver> Resolver;
88349cc55cSDimitry Andric };
89349cc55cSDimitry Andric 
90349cc55cSDimitry Andric class RemoteResolver : public LegacyJITSymbolResolver {
91349cc55cSDimitry Andric public:
92349cc55cSDimitry Andric   static Expected<std::unique_ptr<RemoteResolver>>
93349cc55cSDimitry Andric   Create(orc::ExecutorProcessControl &EPC) {
94349cc55cSDimitry Andric     auto DylibMgr =
95349cc55cSDimitry Andric         orc::EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(EPC);
96349cc55cSDimitry Andric     if (!DylibMgr)
97349cc55cSDimitry Andric       return DylibMgr.takeError();
98349cc55cSDimitry Andric     auto H = DylibMgr->open("", 0);
99349cc55cSDimitry Andric     if (!H)
100349cc55cSDimitry Andric       return H.takeError();
101*0fca6ea1SDimitry Andric     return std::make_unique<RemoteResolver>(std::move(*DylibMgr),
102*0fca6ea1SDimitry Andric                                             std::move(*H));
103349cc55cSDimitry Andric   }
104349cc55cSDimitry Andric 
105349cc55cSDimitry Andric   JITSymbol findSymbol(const std::string &Name) override {
106349cc55cSDimitry Andric     orc::RemoteSymbolLookupSet R;
107349cc55cSDimitry Andric     R.push_back({std::move(Name), false});
1081db9f3b2SDimitry Andric     if (auto Syms = DylibMgr.lookup(H, R)) {
1091db9f3b2SDimitry Andric       if (Syms->size() != 1)
110349cc55cSDimitry Andric         return make_error<StringError>("Unexpected remote lookup result",
111349cc55cSDimitry Andric                                        inconvertibleErrorCode());
1121db9f3b2SDimitry Andric       return JITSymbol(Syms->front().getAddress().getValue(),
1131db9f3b2SDimitry Andric                        Syms->front().getFlags());
114349cc55cSDimitry Andric     } else
1151db9f3b2SDimitry Andric       return Syms.takeError();
116349cc55cSDimitry Andric   }
117349cc55cSDimitry Andric 
118349cc55cSDimitry Andric   JITSymbol findSymbolInLogicalDylib(const std::string &Name) override {
119349cc55cSDimitry Andric     return nullptr;
120349cc55cSDimitry Andric   }
121349cc55cSDimitry Andric 
122349cc55cSDimitry Andric public:
123349cc55cSDimitry Andric   RemoteResolver(orc::EPCGenericDylibManager DylibMgr,
124349cc55cSDimitry Andric                  orc::tpctypes::DylibHandle H)
125349cc55cSDimitry Andric       : DylibMgr(std::move(DylibMgr)), H(std::move(H)) {}
126349cc55cSDimitry Andric 
127349cc55cSDimitry Andric   orc::EPCGenericDylibManager DylibMgr;
128349cc55cSDimitry Andric   orc::tpctypes::DylibHandle H;
129349cc55cSDimitry Andric };
130349cc55cSDimitry Andric } // namespace llvm
131349cc55cSDimitry Andric 
132349cc55cSDimitry Andric #endif // LLVM_TOOLS_LLI_FORWARDINGMEMORYMANAGER_H
133