1662c5544SLang Hames //===---------------- EPCDynamicLibrarySearchGenerator.cpp ----------------===// 2662c5544SLang Hames // 3662c5544SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4662c5544SLang Hames // See https://llvm.org/LICENSE.txt for license information. 5662c5544SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6662c5544SLang Hames // 7662c5544SLang Hames //===----------------------------------------------------------------------===// 8662c5544SLang Hames 9662c5544SLang Hames #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" 10*dc11c060SLang Hames 11*dc11c060SLang Hames #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h" 1294bbc18bSLang Hames #include "llvm/ExecutionEngine/Orc/DebugUtils.h" 1354226e23SBen Langmuir #include "llvm/Support/Error.h" 14662c5544SLang Hames 1594bbc18bSLang Hames #define DEBUG_TYPE "orc" 1694bbc18bSLang Hames 17662c5544SLang Hames namespace llvm { 18662c5544SLang Hames namespace orc { 19662c5544SLang Hames 20662c5544SLang Hames Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>> 2108c5f1feSBen Langmuir EPCDynamicLibrarySearchGenerator::Load( 2208c5f1feSBen Langmuir ExecutionSession &ES, const char *LibraryPath, SymbolPredicate Allow, 2308c5f1feSBen Langmuir AddAbsoluteSymbolsFn AddAbsoluteSymbols) { 24db21bd4fSLang Hames auto Handle = 25db21bd4fSLang Hames ES.getExecutorProcessControl().getDylibMgr().loadDylib(LibraryPath); 26662c5544SLang Hames if (!Handle) 27662c5544SLang Hames return Handle.takeError(); 28662c5544SLang Hames 2908c5f1feSBen Langmuir return std::make_unique<EPCDynamicLibrarySearchGenerator>( 3008c5f1feSBen Langmuir ES, *Handle, std::move(Allow), std::move(AddAbsoluteSymbols)); 31662c5544SLang Hames } 32662c5544SLang Hames 33662c5544SLang Hames Error EPCDynamicLibrarySearchGenerator::tryToGenerate( 34662c5544SLang Hames LookupState &LS, LookupKind K, JITDylib &JD, 35662c5544SLang Hames JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &Symbols) { 36662c5544SLang Hames 37662c5544SLang Hames if (Symbols.empty()) 38662c5544SLang Hames return Error::success(); 39662c5544SLang Hames 4094bbc18bSLang Hames LLVM_DEBUG({ 4194bbc18bSLang Hames dbgs() << "EPCDynamicLibrarySearchGenerator trying to generate " 4294bbc18bSLang Hames << Symbols << "\n"; 4394bbc18bSLang Hames }); 4494bbc18bSLang Hames 45662c5544SLang Hames SymbolLookupSet LookupSymbols; 46662c5544SLang Hames 47662c5544SLang Hames for (auto &KV : Symbols) { 48662c5544SLang Hames // Skip symbols that don't match the filter. 49662c5544SLang Hames if (Allow && !Allow(KV.first)) 50662c5544SLang Hames continue; 51662c5544SLang Hames LookupSymbols.add(KV.first, SymbolLookupFlags::WeaklyReferencedSymbol); 52662c5544SLang Hames } 53662c5544SLang Hames 54db21bd4fSLang Hames DylibManager::LookupRequest Request(H, LookupSymbols); 5554226e23SBen Langmuir // Copy-capture LookupSymbols, since LookupRequest keeps a reference. 56db21bd4fSLang Hames EPC.getDylibMgr().lookupSymbolsAsync(Request, [this, &JD, LS = std::move(LS), 57db21bd4fSLang Hames LookupSymbols]( 58db21bd4fSLang Hames auto Result) mutable { 5994bbc18bSLang Hames if (!Result) { 6094bbc18bSLang Hames LLVM_DEBUG({ 6194bbc18bSLang Hames dbgs() << "EPCDynamicLibrarySearchGenerator lookup failed due to error"; 6294bbc18bSLang Hames }); 6354226e23SBen Langmuir return LS.continueLookup(Result.takeError()); 6494bbc18bSLang Hames } 65662c5544SLang Hames 66662c5544SLang Hames assert(Result->size() == 1 && "Results for more than one library returned"); 67662c5544SLang Hames assert(Result->front().size() == LookupSymbols.size() && 68662c5544SLang Hames "Result has incorrect number of elements"); 69662c5544SLang Hames 7054226e23SBen Langmuir SymbolMap NewSymbols; 71662c5544SLang Hames auto ResultI = Result->front().begin(); 72662c5544SLang Hames for (auto &KV : LookupSymbols) { 7340b4ac27SBen Langmuir if (ResultI->getAddress()) 7440b4ac27SBen Langmuir NewSymbols[KV.first] = *ResultI; 75662c5544SLang Hames ++ResultI; 76662c5544SLang Hames } 77662c5544SLang Hames 7894bbc18bSLang Hames LLVM_DEBUG({ 7994bbc18bSLang Hames dbgs() << "EPCDynamicLibrarySearchGenerator lookup returned " 8094bbc18bSLang Hames << NewSymbols << "\n"; 8194bbc18bSLang Hames }); 8294bbc18bSLang Hames 83662c5544SLang Hames // If there were no resolved symbols bail out. 84662c5544SLang Hames if (NewSymbols.empty()) 8554226e23SBen Langmuir return LS.continueLookup(Error::success()); 86662c5544SLang Hames 87662c5544SLang Hames // Define resolved symbols. 8854226e23SBen Langmuir Error Err = AddAbsoluteSymbols 8954226e23SBen Langmuir ? AddAbsoluteSymbols(JD, std::move(NewSymbols)) 9054226e23SBen Langmuir : JD.define(absoluteSymbols(std::move(NewSymbols))); 9154226e23SBen Langmuir 9254226e23SBen Langmuir LS.continueLookup(std::move(Err)); 9354226e23SBen Langmuir }); 9454226e23SBen Langmuir 9554226e23SBen Langmuir return Error::success(); 96662c5544SLang Hames } 97662c5544SLang Hames 98662c5544SLang Hames } // end namespace orc 99662c5544SLang Hames } // end namespace llvm 100