1fe6060f1SDimitry Andric //===---------------- EPCDynamicLibrarySearchGenerator.cpp ----------------===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric
9fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
10fe6060f1SDimitry Andric
11fe6060f1SDimitry Andric namespace llvm {
12fe6060f1SDimitry Andric namespace orc {
13fe6060f1SDimitry Andric
14fe6060f1SDimitry Andric Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>
Load(ExecutionSession & ES,const char * LibraryPath,SymbolPredicate Allow,AddAbsoluteSymbolsFn AddAbsoluteSymbols)15*cdc20ff6SDimitry Andric EPCDynamicLibrarySearchGenerator::Load(
16*cdc20ff6SDimitry Andric ExecutionSession &ES, const char *LibraryPath, SymbolPredicate Allow,
17*cdc20ff6SDimitry Andric AddAbsoluteSymbolsFn AddAbsoluteSymbols) {
18fe6060f1SDimitry Andric auto Handle = ES.getExecutorProcessControl().loadDylib(LibraryPath);
19fe6060f1SDimitry Andric if (!Handle)
20fe6060f1SDimitry Andric return Handle.takeError();
21fe6060f1SDimitry Andric
22*cdc20ff6SDimitry Andric return std::make_unique<EPCDynamicLibrarySearchGenerator>(
23*cdc20ff6SDimitry Andric ES, *Handle, std::move(Allow), std::move(AddAbsoluteSymbols));
24fe6060f1SDimitry Andric }
25fe6060f1SDimitry Andric
tryToGenerate(LookupState & LS,LookupKind K,JITDylib & JD,JITDylibLookupFlags JDLookupFlags,const SymbolLookupSet & Symbols)26fe6060f1SDimitry Andric Error EPCDynamicLibrarySearchGenerator::tryToGenerate(
27fe6060f1SDimitry Andric LookupState &LS, LookupKind K, JITDylib &JD,
28fe6060f1SDimitry Andric JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &Symbols) {
29fe6060f1SDimitry Andric
30fe6060f1SDimitry Andric if (Symbols.empty())
31fe6060f1SDimitry Andric return Error::success();
32fe6060f1SDimitry Andric
33fe6060f1SDimitry Andric SymbolLookupSet LookupSymbols;
34fe6060f1SDimitry Andric
35fe6060f1SDimitry Andric for (auto &KV : Symbols) {
36fe6060f1SDimitry Andric // Skip symbols that don't match the filter.
37fe6060f1SDimitry Andric if (Allow && !Allow(KV.first))
38fe6060f1SDimitry Andric continue;
39fe6060f1SDimitry Andric LookupSymbols.add(KV.first, SymbolLookupFlags::WeaklyReferencedSymbol);
40fe6060f1SDimitry Andric }
41fe6060f1SDimitry Andric
42fe6060f1SDimitry Andric SymbolMap NewSymbols;
43fe6060f1SDimitry Andric
44fe6060f1SDimitry Andric ExecutorProcessControl::LookupRequest Request(H, LookupSymbols);
45fe6060f1SDimitry Andric auto Result = EPC.lookupSymbols(Request);
46fe6060f1SDimitry Andric if (!Result)
47fe6060f1SDimitry Andric return Result.takeError();
48fe6060f1SDimitry Andric
49fe6060f1SDimitry Andric assert(Result->size() == 1 && "Results for more than one library returned");
50fe6060f1SDimitry Andric assert(Result->front().size() == LookupSymbols.size() &&
51fe6060f1SDimitry Andric "Result has incorrect number of elements");
52fe6060f1SDimitry Andric
53fe6060f1SDimitry Andric auto ResultI = Result->front().begin();
54fe6060f1SDimitry Andric for (auto &KV : LookupSymbols) {
55*cdc20ff6SDimitry Andric if (ResultI->getAddress())
56*cdc20ff6SDimitry Andric NewSymbols[KV.first] = *ResultI;
57fe6060f1SDimitry Andric ++ResultI;
58fe6060f1SDimitry Andric }
59fe6060f1SDimitry Andric
60fe6060f1SDimitry Andric // If there were no resolved symbols bail out.
61fe6060f1SDimitry Andric if (NewSymbols.empty())
62fe6060f1SDimitry Andric return Error::success();
63fe6060f1SDimitry Andric
64fe6060f1SDimitry Andric // Define resolved symbols.
65*cdc20ff6SDimitry Andric if (AddAbsoluteSymbols)
66*cdc20ff6SDimitry Andric return AddAbsoluteSymbols(JD, std::move(NewSymbols));
67fe6060f1SDimitry Andric return JD.define(absoluteSymbols(std::move(NewSymbols)));
68fe6060f1SDimitry Andric }
69fe6060f1SDimitry Andric
70fe6060f1SDimitry Andric } // end namespace orc
71fe6060f1SDimitry Andric } // end namespace llvm
72