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