xref: /llvm-project/llvm/lib/ExecutionEngine/Orc/LookupAndRecordAddrs.cpp (revision db21bd4fa9bf40a9f6e7713bf674dcfaa48d1d5b)
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