Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/LazyObjectLinkingLayer.cpp
213799 views
//===---------- LazyReexports.cpp - Utilities for lazy reexports ----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h"910#include "llvm/ExecutionEngine/Orc/LazyReexports.h"11#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"12#include "llvm/ExecutionEngine/Orc/RedirectionManager.h"1314using namespace llvm;15using namespace llvm::jitlink;1617namespace {1819constexpr StringRef FnBodySuffix = "$orc_fnbody";2021} // anonymous namespace2223namespace llvm::orc {2425class LazyObjectLinkingLayer::RenamerPlugin26: public ObjectLinkingLayer::Plugin {27public:28void modifyPassConfig(MaterializationResponsibility &MR,29jitlink::LinkGraph &LG,30jitlink::PassConfiguration &Config) override {31// We need to insert this before the mark-live pass to ensure that we don't32// delete the bodies (their names won't match the responsibility set until33// after this pass completes.34Config.PrePrunePasses.insert(35Config.PrePrunePasses.begin(),36[&MR](LinkGraph &G) { return renameFunctionBodies(G, MR); });37}3839Error notifyFailed(MaterializationResponsibility &MR) override {40return Error::success();41}4243Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {44return Error::success();45}4647void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,48ResourceKey SrcKey) override {}4950private:51static Error renameFunctionBodies(LinkGraph &G,52MaterializationResponsibility &MR) {53DenseMap<StringRef, NonOwningSymbolStringPtr> SymsToRename;54for (auto &[Name, Flags] : MR.getSymbols())55if ((*Name).ends_with(FnBodySuffix))56SymsToRename[(*Name).drop_back(FnBodySuffix.size())] =57NonOwningSymbolStringPtr(Name);5859for (auto *Sym : G.defined_symbols()) {60if (!Sym->hasName())61continue;62auto I = SymsToRename.find(*Sym->getName());63if (I == SymsToRename.end())64continue;65Sym->setName(G.intern(G.allocateName(*I->second)));66}6768return Error::success();69}70};7172LazyObjectLinkingLayer::LazyObjectLinkingLayer(ObjectLinkingLayer &BaseLayer,73LazyReexportsManager &LRMgr)74: ObjectLayer(BaseLayer.getExecutionSession()), BaseLayer(BaseLayer),75LRMgr(LRMgr) {76BaseLayer.addPlugin(std::make_unique<RenamerPlugin>());77}7879Error LazyObjectLinkingLayer::add(ResourceTrackerSP RT,80std::unique_ptr<MemoryBuffer> O,81MaterializationUnit::Interface I) {8283// Object files with initializer symbols can't be lazy.84if (I.InitSymbol)85return BaseLayer.add(std::move(RT), std::move(O), std::move(I));8687auto &ES = getExecutionSession();88SymbolAliasMap LazySymbols;89for (auto &[Name, Flags] : I.SymbolFlags)90if (Flags.isCallable())91LazySymbols[Name] = {ES.intern((*Name + FnBodySuffix).str()), Flags};9293for (auto &[Name, AI] : LazySymbols) {94I.SymbolFlags.erase(Name);95I.SymbolFlags[AI.Aliasee] = AI.AliasFlags;96}9798if (auto Err = BaseLayer.add(RT, std::move(O), std::move(I)))99return Err;100101auto &JD = RT->getJITDylib();102return JD.define(lazyReexports(LRMgr, std::move(LazySymbols)), std::move(RT));103}104105void LazyObjectLinkingLayer::emit(106std::unique_ptr<MaterializationResponsibility> MR,107std::unique_ptr<MemoryBuffer> Obj) {108return BaseLayer.emit(std::move(MR), std::move(Obj));109}110111} // namespace llvm::orc112113114