1
2#include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h"
3
4#include "llvm/Support/DynamicLibrary.h"
5#include "llvm/Support/Error.h"
6
7namespace llvm::orc {
8
9void DylibSymbolResolver::resolveAsync(
10 const RemoteSymbolLookupSet &L,
11 ExecutorResolver::YieldResolveResultFn &&OnResolve) {
12 std::vector<std::optional<ExecutorSymbolDef>> Result;
13 auto DL = sys::DynamicLibrary(Handle.toPtr<void *>());
14
15 for (const auto &E : L) {
16 if (E.Name.empty()) {
17 if (E.Required)
18 OnResolve(
19 make_error<StringError>(Args: "Required address for empty symbol \"\"",
20 Args: inconvertibleErrorCode()));
21 else
22 Result.emplace_back();
23 } else {
24
25 const char *DemangledSymName = E.Name.c_str();
26#ifdef __APPLE__
27 if (E.Name.front() != '_')
28 OnResolve(make_error<StringError>(Twine("MachO symbol \"") + E.Name +
29 "\" missing leading '_'",
30 inconvertibleErrorCode()));
31 ++DemangledSymName;
32#endif
33
34 void *Addr = DL.getAddressOfSymbol(symbolName: DemangledSymName);
35 if (!Addr && E.Required)
36 Result.emplace_back();
37 else
38 // FIXME: determine accurate JITSymbolFlags.
39 Result.emplace_back(args: ExecutorSymbolDef(ExecutorAddr::fromPtr(Ptr: Addr),
40 JITSymbolFlags::Exported));
41 }
42 }
43
44 OnResolve(std::move(Result));
45}
46
47} // end namespace llvm::orc
48