164288571SLang Hames //===------- LookupAndRecordAddrs.h - Symbol lookup support utility -------===// 264288571SLang Hames // 364288571SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 464288571SLang Hames // See https://llvm.org/LICENSE.txt for license information. 564288571SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 664288571SLang Hames // 764288571SLang Hames //===----------------------------------------------------------------------===// 864288571SLang Hames 964288571SLang Hames #include "llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h" 1064288571SLang Hames 1164288571SLang Hames #include <future> 1264288571SLang Hames 1364288571SLang Hames namespace llvm { 1464288571SLang Hames namespace orc { 1564288571SLang Hames 1664288571SLang Hames void lookupAndRecordAddrs( 1764288571SLang Hames unique_function<void(Error)> OnRecorded, ExecutionSession &ES, LookupKind K, 1864288571SLang Hames const JITDylibSearchOrder &SearchOrder, 19ef391df2SLang Hames std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs, 2064288571SLang Hames SymbolLookupFlags LookupFlags) { 2164288571SLang Hames 2264288571SLang Hames SymbolLookupSet Symbols; 2364288571SLang Hames for (auto &KV : Pairs) 2464288571SLang Hames Symbols.add(KV.first, LookupFlags); 2564288571SLang Hames 2664288571SLang Hames ES.lookup( 274bb18a89SLang Hames K, SearchOrder, std::move(Symbols), SymbolState::Ready, 2864288571SLang Hames [Pairs = std::move(Pairs), 2964288571SLang Hames OnRec = std::move(OnRecorded)](Expected<SymbolMap> Result) mutable { 3064288571SLang Hames if (!Result) 3164288571SLang Hames return OnRec(Result.takeError()); 3264288571SLang Hames for (auto &KV : Pairs) { 3364288571SLang Hames auto I = Result->find(KV.first); 348b1771bdSLang Hames *KV.second = 358b1771bdSLang Hames I != Result->end() ? I->second.getAddress() : orc::ExecutorAddr(); 3664288571SLang Hames } 3764288571SLang Hames OnRec(Error::success()); 3864288571SLang Hames }, 3964288571SLang Hames NoDependenciesToRegister); 4064288571SLang Hames } 4164288571SLang Hames 4264288571SLang Hames Error lookupAndRecordAddrs( 4364288571SLang Hames ExecutionSession &ES, LookupKind K, const JITDylibSearchOrder &SearchOrder, 44ef391df2SLang Hames std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs, 4564288571SLang Hames SymbolLookupFlags LookupFlags) { 4664288571SLang Hames 4764288571SLang Hames std::promise<MSVCPError> ResultP; 4864288571SLang Hames auto ResultF = ResultP.get_future(); 4964288571SLang Hames lookupAndRecordAddrs([&](Error Err) { ResultP.set_value(std::move(Err)); }, 504bb18a89SLang Hames ES, K, SearchOrder, std::move(Pairs), LookupFlags); 5164288571SLang Hames return ResultF.get(); 5264288571SLang Hames } 5364288571SLang Hames 5464288571SLang Hames Error lookupAndRecordAddrs( 5564288571SLang Hames ExecutorProcessControl &EPC, tpctypes::DylibHandle H, 56ef391df2SLang Hames std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs, 5764288571SLang Hames SymbolLookupFlags LookupFlags) { 5864288571SLang Hames 5964288571SLang Hames SymbolLookupSet Symbols; 6064288571SLang Hames for (auto &KV : Pairs) 6164288571SLang Hames Symbols.add(KV.first, LookupFlags); 6264288571SLang Hames 63*db21bd4fSLang Hames DylibManager::LookupRequest LR(H, Symbols); 64*db21bd4fSLang Hames auto Result = EPC.getDylibMgr().lookupSymbols(LR); 6564288571SLang Hames if (!Result) 6664288571SLang Hames return Result.takeError(); 6764288571SLang Hames 6864288571SLang Hames if (Result->size() != 1) 6964288571SLang Hames return make_error<StringError>("Error in lookup result", 7064288571SLang Hames inconvertibleErrorCode()); 7164288571SLang Hames if (Result->front().size() != Pairs.size()) 7264288571SLang Hames return make_error<StringError>("Error in lookup result elements", 7364288571SLang Hames inconvertibleErrorCode()); 7464288571SLang Hames 7564288571SLang Hames for (unsigned I = 0; I != Pairs.size(); ++I) 7640b4ac27SBen Langmuir *Pairs[I].second = Result->front()[I].getAddress(); 7764288571SLang Hames 7864288571SLang Hames return Error::success(); 7964288571SLang Hames } 8064288571SLang Hames 8164288571SLang Hames } // End namespace orc. 8264288571SLang Hames } // End namespace llvm. 83