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