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