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