Updates tpctypes::DylibHandle to be an ExecutorAddr (rather than a uint64_t), and SimpleExecutorDylibManager to hold and return raw OS handle values (as ExecutorAddrs) rather than index values into a map of DynamicLibrary instances. This will allow clients to use EPCGenericDylibManager in contexts where the existing DynamicLibrary interface is too limited to be used. (e.g. to look up JIT symbols in a dylib that was loaded with RTLD_LOCAL).
83 lines
2.7 KiB
C++
83 lines
2.7 KiB
C++
//===------- LookupAndRecordAddrs.h - Symbol lookup support utility -------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h"
|
|
|
|
#include <future>
|
|
|
|
namespace llvm {
|
|
namespace orc {
|
|
|
|
void lookupAndRecordAddrs(
|
|
unique_function<void(Error)> OnRecorded, ExecutionSession &ES, LookupKind K,
|
|
const JITDylibSearchOrder &SearchOrder,
|
|
std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
|
|
SymbolLookupFlags LookupFlags) {
|
|
|
|
SymbolLookupSet Symbols;
|
|
for (auto &KV : Pairs)
|
|
Symbols.add(KV.first, LookupFlags);
|
|
|
|
ES.lookup(
|
|
K, SearchOrder, std::move(Symbols), SymbolState::Ready,
|
|
[Pairs = std::move(Pairs),
|
|
OnRec = std::move(OnRecorded)](Expected<SymbolMap> Result) mutable {
|
|
if (!Result)
|
|
return OnRec(Result.takeError());
|
|
for (auto &KV : Pairs) {
|
|
auto I = Result->find(KV.first);
|
|
KV.second->setValue((I != Result->end()) ? I->second.getAddress()
|
|
: 0);
|
|
}
|
|
OnRec(Error::success());
|
|
},
|
|
NoDependenciesToRegister);
|
|
}
|
|
|
|
Error lookupAndRecordAddrs(
|
|
ExecutionSession &ES, LookupKind K, const JITDylibSearchOrder &SearchOrder,
|
|
std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
|
|
SymbolLookupFlags LookupFlags) {
|
|
|
|
std::promise<MSVCPError> ResultP;
|
|
auto ResultF = ResultP.get_future();
|
|
lookupAndRecordAddrs([&](Error Err) { ResultP.set_value(std::move(Err)); },
|
|
ES, K, SearchOrder, std::move(Pairs), LookupFlags);
|
|
return ResultF.get();
|
|
}
|
|
|
|
Error lookupAndRecordAddrs(
|
|
ExecutorProcessControl &EPC, tpctypes::DylibHandle H,
|
|
std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,
|
|
SymbolLookupFlags LookupFlags) {
|
|
|
|
SymbolLookupSet Symbols;
|
|
for (auto &KV : Pairs)
|
|
Symbols.add(KV.first, LookupFlags);
|
|
|
|
ExecutorProcessControl::LookupRequest LR(H, Symbols);
|
|
auto Result = EPC.lookupSymbols(LR);
|
|
if (!Result)
|
|
return Result.takeError();
|
|
|
|
if (Result->size() != 1)
|
|
return make_error<StringError>("Error in lookup result",
|
|
inconvertibleErrorCode());
|
|
if (Result->front().size() != Pairs.size())
|
|
return make_error<StringError>("Error in lookup result elements",
|
|
inconvertibleErrorCode());
|
|
|
|
for (unsigned I = 0; I != Pairs.size(); ++I)
|
|
*Pairs[I].second = Result->front()[I];
|
|
|
|
return Error::success();
|
|
}
|
|
|
|
} // End namespace orc.
|
|
} // End namespace llvm.
|