1//===------- LookupAndRecordAddrs.h - Symbol lookup support utility -------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#include "llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h" 10 11#include <future> 12 13namespace llvm { 14namespace orc { 15 16void lookupAndRecordAddrs( 17 unique_function<void(Error)> OnRecorded, ExecutionSession &ES, LookupKind K, 18 const JITDylibSearchOrder &SearchOrder, 19 std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs, 20 SymbolLookupFlags LookupFlags) { 21 22 SymbolLookupSet Symbols; 23 for (auto &KV : Pairs) 24 Symbols.add(KV.first, LookupFlags); 25 26 ES.lookup( 27 K, SearchOrder, std::move(Symbols), SymbolState::Ready, 28 [Pairs = std::move(Pairs), 29 OnRec = std::move(OnRecorded)](Expected<SymbolMap> Result) mutable { 30 if (!Result) 31 return OnRec(Result.takeError()); 32 for (auto &KV : Pairs) { 33 auto I = Result->find(KV.first); 34 *KV.second = 35 I != Result->end() ? I->second.getAddress() : orc::ExecutorAddr(); 36 } 37 OnRec(Error::success()); 38 }, 39 NoDependenciesToRegister); 40} 41 42Error lookupAndRecordAddrs( 43 ExecutionSession &ES, LookupKind K, const JITDylibSearchOrder &SearchOrder, 44 std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs, 45 SymbolLookupFlags LookupFlags) { 46 47 std::promise<MSVCPError> ResultP; 48 auto ResultF = ResultP.get_future(); 49 lookupAndRecordAddrs([&](Error Err) { ResultP.set_value(std::move(Err)); }, 50 ES, K, SearchOrder, std::move(Pairs), LookupFlags); 51 return ResultF.get(); 52} 53 54Error lookupAndRecordAddrs( 55 ExecutorProcessControl &EPC, tpctypes::DylibHandle H, 56 std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs, 57 SymbolLookupFlags LookupFlags) { 58 59 SymbolLookupSet Symbols; 60 for (auto &KV : Pairs) 61 Symbols.add(KV.first, LookupFlags); 62 63 ExecutorProcessControl::LookupRequest LR(H, Symbols); 64 auto Result = EPC.lookupSymbols(LR); 65 if (!Result) 66 return Result.takeError(); 67 68 if (Result->size() != 1) 69 return make_error<StringError>("Error in lookup result", 70 inconvertibleErrorCode()); 71 if (Result->front().size() != Pairs.size()) 72 return make_error<StringError>("Error in lookup result elements", 73 inconvertibleErrorCode()); 74 75 for (unsigned I = 0; I != Pairs.size(); ++I) 76 *Pairs[I].second = Result->front()[I].getAddress(); 77 78 return Error::success(); 79} 80 81} // End namespace orc. 82} // End namespace llvm. 83