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