
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).
71 lines
2.3 KiB
C++
71 lines
2.3 KiB
C++
//===---------------- EPCDynamicLibrarySearchGenerator.cpp ----------------===//
|
|
//
|
|
// 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/EPCDynamicLibrarySearchGenerator.h"
|
|
|
|
namespace llvm {
|
|
namespace orc {
|
|
|
|
Expected<std::unique_ptr<EPCDynamicLibrarySearchGenerator>>
|
|
EPCDynamicLibrarySearchGenerator::Load(ExecutionSession &ES,
|
|
const char *LibraryPath,
|
|
SymbolPredicate Allow) {
|
|
auto Handle = ES.getExecutorProcessControl().loadDylib(LibraryPath);
|
|
if (!Handle)
|
|
return Handle.takeError();
|
|
|
|
return std::make_unique<EPCDynamicLibrarySearchGenerator>(ES, *Handle,
|
|
std::move(Allow));
|
|
}
|
|
|
|
Error EPCDynamicLibrarySearchGenerator::tryToGenerate(
|
|
LookupState &LS, LookupKind K, JITDylib &JD,
|
|
JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &Symbols) {
|
|
|
|
if (Symbols.empty())
|
|
return Error::success();
|
|
|
|
SymbolLookupSet LookupSymbols;
|
|
|
|
for (auto &KV : Symbols) {
|
|
// Skip symbols that don't match the filter.
|
|
if (Allow && !Allow(KV.first))
|
|
continue;
|
|
LookupSymbols.add(KV.first, SymbolLookupFlags::WeaklyReferencedSymbol);
|
|
}
|
|
|
|
SymbolMap NewSymbols;
|
|
|
|
ExecutorProcessControl::LookupRequest Request(H, LookupSymbols);
|
|
auto Result = EPC.lookupSymbols(Request);
|
|
if (!Result)
|
|
return Result.takeError();
|
|
|
|
assert(Result->size() == 1 && "Results for more than one library returned");
|
|
assert(Result->front().size() == LookupSymbols.size() &&
|
|
"Result has incorrect number of elements");
|
|
|
|
auto ResultI = Result->front().begin();
|
|
for (auto &KV : LookupSymbols) {
|
|
if (*ResultI)
|
|
NewSymbols[KV.first] =
|
|
JITEvaluatedSymbol(ResultI->getValue(), JITSymbolFlags::Exported);
|
|
++ResultI;
|
|
}
|
|
|
|
// If there were no resolved symbols bail out.
|
|
if (NewSymbols.empty())
|
|
return Error::success();
|
|
|
|
// Define resolved symbols.
|
|
return JD.define(absoluteSymbols(std::move(NewSymbols)));
|
|
}
|
|
|
|
} // end namespace orc
|
|
} // end namespace llvm
|