brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · d193bef Raw
136 lines · c
1//===-- RemoteJITUtils.h - Utilities for remote-JITing with LLI -*- 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-exception6//7//===----------------------------------------------------------------------===//8//9// Utilities for remote-JITing with LLI.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_TOOLS_LLI_FORWARDINGMEMORYMANAGER_H14#define LLVM_TOOLS_LLI_FORWARDINGMEMORYMANAGER_H15 16#include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"17#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"18 19namespace llvm {20 21// ForwardingMM - Adapter to connect MCJIT to Orc's Remote22// memory manager.23class ForwardingMemoryManager : public llvm::RTDyldMemoryManager {24public:25  void setMemMgr(std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr) {26    this->MemMgr = std::move(MemMgr);27  }28 29  void setResolver(std::shared_ptr<LegacyJITSymbolResolver> Resolver) {30    this->Resolver = std::move(Resolver);31  }32 33  uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,34                               unsigned SectionID,35                               StringRef SectionName) override {36    return MemMgr->allocateCodeSection(Size, Alignment, SectionID, SectionName);37  }38 39  uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,40                               unsigned SectionID, StringRef SectionName,41                               bool IsReadOnly) override {42    return MemMgr->allocateDataSection(Size, Alignment, SectionID, SectionName,43                                       IsReadOnly);44  }45 46  void reserveAllocationSpace(uintptr_t CodeSize, Align CodeAlign,47                              uintptr_t RODataSize, Align RODataAlign,48                              uintptr_t RWDataSize,49                              Align RWDataAlign) override {50    MemMgr->reserveAllocationSpace(CodeSize, CodeAlign, RODataSize, RODataAlign,51                                   RWDataSize, RWDataAlign);52  }53 54  bool needsToReserveAllocationSpace() override {55    return MemMgr->needsToReserveAllocationSpace();56  }57 58  void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr,59                        size_t Size) override {60    MemMgr->registerEHFrames(Addr, LoadAddr, Size);61  }62 63  void deregisterEHFrames() override { MemMgr->deregisterEHFrames(); }64 65  bool finalizeMemory(std::string *ErrMsg = nullptr) override {66    return MemMgr->finalizeMemory(ErrMsg);67  }68 69  void notifyObjectLoaded(RuntimeDyld &RTDyld,70                          const object::ObjectFile &Obj) override {71    MemMgr->notifyObjectLoaded(RTDyld, Obj);72  }73 74  // Don't hide the sibling notifyObjectLoaded from RTDyldMemoryManager.75  using RTDyldMemoryManager::notifyObjectLoaded;76 77  JITSymbol findSymbol(const std::string &Name) override {78    return Resolver->findSymbol(Name);79  }80 81  JITSymbol findSymbolInLogicalDylib(const std::string &Name) override {82    return Resolver->findSymbolInLogicalDylib(Name);83  }84 85private:86  std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr;87  std::shared_ptr<LegacyJITSymbolResolver> Resolver;88};89 90class RemoteResolver : public LegacyJITSymbolResolver {91public:92  static Expected<std::unique_ptr<RemoteResolver>>93  Create(orc::ExecutorProcessControl &EPC) {94    auto DylibMgr =95        orc::EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(EPC);96    if (!DylibMgr)97      return DylibMgr.takeError();98    auto H = DylibMgr->open("", 0);99    if (!H)100      return H.takeError();101    return std::make_unique<RemoteResolver>(std::move(*DylibMgr),102                                            std::move(*H));103  }104 105  JITSymbol findSymbol(const std::string &Name) override {106    orc::RemoteSymbolLookupSet R;107    R.push_back({std::move(Name), false});108    if (auto Syms = DylibMgr.lookup(H, R)) {109      if (Syms->size() != 1)110        return make_error<StringError>("Unexpected remote lookup result",111                                       inconvertibleErrorCode());112      if (!Syms->front())113        return make_error<StringError>("Expected valid address",114                                       inconvertibleErrorCode());115      return JITSymbol(Syms->front()->getAddress().getValue(),116                       Syms->front()->getFlags());117    } else118      return Syms.takeError();119  }120 121  JITSymbol findSymbolInLogicalDylib(const std::string &Name) override {122    return nullptr;123  }124 125public:126  RemoteResolver(orc::EPCGenericDylibManager DylibMgr,127                 orc::tpctypes::DylibHandle H)128      : DylibMgr(std::move(DylibMgr)), H(std::move(H)) {}129 130  orc::EPCGenericDylibManager DylibMgr;131  orc::tpctypes::DylibHandle H;132};133} // namespace llvm134 135#endif // LLVM_TOOLS_LLI_FORWARDINGMEMORYMANAGER_H136