1349cc55cSDimitry Andric //===------- LookupAndRecordAddrs.h - Symbol lookup support utility -------===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric
9349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h"
10349cc55cSDimitry Andric
11349cc55cSDimitry Andric #include <future>
12349cc55cSDimitry Andric
13349cc55cSDimitry Andric namespace llvm {
14349cc55cSDimitry Andric namespace orc {
15349cc55cSDimitry Andric
lookupAndRecordAddrs(unique_function<void (Error)> OnRecorded,ExecutionSession & ES,LookupKind K,const JITDylibSearchOrder & SearchOrder,std::vector<std::pair<SymbolStringPtr,ExecutorAddr * >> Pairs,SymbolLookupFlags LookupFlags)16349cc55cSDimitry Andric void lookupAndRecordAddrs(
17349cc55cSDimitry Andric unique_function<void(Error)> OnRecorded, ExecutionSession &ES, LookupKind K,
18349cc55cSDimitry Andric const JITDylibSearchOrder &SearchOrder,
19349cc55cSDimitry Andric std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
20349cc55cSDimitry Andric SymbolLookupFlags LookupFlags) {
21349cc55cSDimitry Andric
22349cc55cSDimitry Andric SymbolLookupSet Symbols;
23349cc55cSDimitry Andric for (auto &KV : Pairs)
24349cc55cSDimitry Andric Symbols.add(KV.first, LookupFlags);
25349cc55cSDimitry Andric
26349cc55cSDimitry Andric ES.lookup(
2781ad6265SDimitry Andric K, SearchOrder, std::move(Symbols), SymbolState::Ready,
28349cc55cSDimitry Andric [Pairs = std::move(Pairs),
29349cc55cSDimitry Andric OnRec = std::move(OnRecorded)](Expected<SymbolMap> Result) mutable {
30349cc55cSDimitry Andric if (!Result)
31349cc55cSDimitry Andric return OnRec(Result.takeError());
32349cc55cSDimitry Andric for (auto &KV : Pairs) {
33349cc55cSDimitry Andric auto I = Result->find(KV.first);
3406c3fb27SDimitry Andric *KV.second =
3506c3fb27SDimitry Andric I != Result->end() ? I->second.getAddress() : orc::ExecutorAddr();
36349cc55cSDimitry Andric }
37349cc55cSDimitry Andric OnRec(Error::success());
38349cc55cSDimitry Andric },
39349cc55cSDimitry Andric NoDependenciesToRegister);
40349cc55cSDimitry Andric }
41349cc55cSDimitry Andric
lookupAndRecordAddrs(ExecutionSession & ES,LookupKind K,const JITDylibSearchOrder & SearchOrder,std::vector<std::pair<SymbolStringPtr,ExecutorAddr * >> Pairs,SymbolLookupFlags LookupFlags)42349cc55cSDimitry Andric Error lookupAndRecordAddrs(
43349cc55cSDimitry Andric ExecutionSession &ES, LookupKind K, const JITDylibSearchOrder &SearchOrder,
44349cc55cSDimitry Andric std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
45349cc55cSDimitry Andric SymbolLookupFlags LookupFlags) {
46349cc55cSDimitry Andric
47349cc55cSDimitry Andric std::promise<MSVCPError> ResultP;
48349cc55cSDimitry Andric auto ResultF = ResultP.get_future();
49349cc55cSDimitry Andric lookupAndRecordAddrs([&](Error Err) { ResultP.set_value(std::move(Err)); },
5081ad6265SDimitry Andric ES, K, SearchOrder, std::move(Pairs), LookupFlags);
51349cc55cSDimitry Andric return ResultF.get();
52349cc55cSDimitry Andric }
53349cc55cSDimitry Andric
lookupAndRecordAddrs(ExecutorProcessControl & EPC,tpctypes::DylibHandle H,std::vector<std::pair<SymbolStringPtr,ExecutorAddr * >> Pairs,SymbolLookupFlags LookupFlags)54349cc55cSDimitry Andric Error lookupAndRecordAddrs(
55349cc55cSDimitry Andric ExecutorProcessControl &EPC, tpctypes::DylibHandle H,
56349cc55cSDimitry Andric std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
57349cc55cSDimitry Andric SymbolLookupFlags LookupFlags) {
58349cc55cSDimitry Andric
59349cc55cSDimitry Andric SymbolLookupSet Symbols;
60349cc55cSDimitry Andric for (auto &KV : Pairs)
61349cc55cSDimitry Andric Symbols.add(KV.first, LookupFlags);
62349cc55cSDimitry Andric
63349cc55cSDimitry Andric ExecutorProcessControl::LookupRequest LR(H, Symbols);
64349cc55cSDimitry Andric auto Result = EPC.lookupSymbols(LR);
65349cc55cSDimitry Andric if (!Result)
66349cc55cSDimitry Andric return Result.takeError();
67349cc55cSDimitry Andric
68349cc55cSDimitry Andric if (Result->size() != 1)
69349cc55cSDimitry Andric return make_error<StringError>("Error in lookup result",
70349cc55cSDimitry Andric inconvertibleErrorCode());
71349cc55cSDimitry Andric if (Result->front().size() != Pairs.size())
72349cc55cSDimitry Andric return make_error<StringError>("Error in lookup result elements",
73349cc55cSDimitry Andric inconvertibleErrorCode());
74349cc55cSDimitry Andric
75349cc55cSDimitry Andric for (unsigned I = 0; I != Pairs.size(); ++I)
76*1db9f3b2SDimitry Andric *Pairs[I].second = Result->front()[I].getAddress();
77349cc55cSDimitry Andric
78349cc55cSDimitry Andric return Error::success();
79349cc55cSDimitry Andric }
80349cc55cSDimitry Andric
81349cc55cSDimitry Andric } // End namespace orc.
82349cc55cSDimitry Andric } // End namespace llvm.
83