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