xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
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>>
15*1db9f3b2SDimitry Andric EPCDynamicLibrarySearchGenerator::Load(
16*1db9f3b2SDimitry Andric     ExecutionSession &ES, const char *LibraryPath, SymbolPredicate Allow,
17*1db9f3b2SDimitry Andric     AddAbsoluteSymbolsFn AddAbsoluteSymbols) {
18fe6060f1SDimitry Andric   auto Handle = ES.getExecutorProcessControl().loadDylib(LibraryPath);
19fe6060f1SDimitry Andric   if (!Handle)
20fe6060f1SDimitry Andric     return Handle.takeError();
21fe6060f1SDimitry Andric 
22*1db9f3b2SDimitry Andric   return std::make_unique<EPCDynamicLibrarySearchGenerator>(
23*1db9f3b2SDimitry Andric       ES, *Handle, std::move(Allow), std::move(AddAbsoluteSymbols));
24fe6060f1SDimitry Andric }
25fe6060f1SDimitry Andric 
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*1db9f3b2SDimitry Andric     if (ResultI->getAddress())
56*1db9f3b2SDimitry 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*1db9f3b2SDimitry Andric   if (AddAbsoluteSymbols)
66*1db9f3b2SDimitry 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