Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp
35266 views
//===---------------- EPCDynamicLibrarySearchGenerator.cpp ----------------===//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/EPCDynamicLibrarySearchGenerator.h"9#include "llvm/ExecutionEngine/Orc/DebugUtils.h"10#include "llvm/Support/Error.h"1112#define DEBUG_TYPE "orc"1314namespace llvm {15namespace orc {1617Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>18EPCDynamicLibrarySearchGenerator::Load(19ExecutionSession &ES, const char *LibraryPath, SymbolPredicate Allow,20AddAbsoluteSymbolsFn AddAbsoluteSymbols) {21auto Handle = ES.getExecutorProcessControl().loadDylib(LibraryPath);22if (!Handle)23return Handle.takeError();2425return std::make_unique<EPCDynamicLibrarySearchGenerator>(26ES, *Handle, std::move(Allow), std::move(AddAbsoluteSymbols));27}2829Error EPCDynamicLibrarySearchGenerator::tryToGenerate(30LookupState &LS, LookupKind K, JITDylib &JD,31JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &Symbols) {3233if (Symbols.empty())34return Error::success();3536LLVM_DEBUG({37dbgs() << "EPCDynamicLibrarySearchGenerator trying to generate "38<< Symbols << "\n";39});4041SymbolLookupSet LookupSymbols;4243for (auto &KV : Symbols) {44// Skip symbols that don't match the filter.45if (Allow && !Allow(KV.first))46continue;47LookupSymbols.add(KV.first, SymbolLookupFlags::WeaklyReferencedSymbol);48}4950ExecutorProcessControl::LookupRequest Request(H, LookupSymbols);51// Copy-capture LookupSymbols, since LookupRequest keeps a reference.52EPC.lookupSymbolsAsync(Request, [this, &JD, LS = std::move(LS),53LookupSymbols](auto Result) mutable {54if (!Result) {55LLVM_DEBUG({56dbgs() << "EPCDynamicLibrarySearchGenerator lookup failed due to error";57});58return LS.continueLookup(Result.takeError());59}6061assert(Result->size() == 1 && "Results for more than one library returned");62assert(Result->front().size() == LookupSymbols.size() &&63"Result has incorrect number of elements");6465SymbolMap NewSymbols;66auto ResultI = Result->front().begin();67for (auto &KV : LookupSymbols) {68if (ResultI->getAddress())69NewSymbols[KV.first] = *ResultI;70++ResultI;71}7273LLVM_DEBUG({74dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned "75<< NewSymbols << "\n";76});7778// If there were no resolved symbols bail out.79if (NewSymbols.empty())80return LS.continueLookup(Error::success());8182// Define resolved symbols.83Error Err = AddAbsoluteSymbols84? AddAbsoluteSymbols(JD, std::move(NewSymbols))85: JD.define(absoluteSymbols(std::move(NewSymbols)));8687LS.continueLookup(std::move(Err));88});8990return Error::success();91}9293} // end namespace orc94} // end namespace llvm959697