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