xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
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