| #include "llvm/ExecutionEngine/Orc/TargetProcess/ExecutorResolver.h" | |
| #include "llvm/Support/DynamicLibrary.h" | |
| #include "llvm/Support/Error.h" | |
| namespace llvm::orc { | |
| void DylibSymbolResolver::resolveAsync( | |
| const RemoteSymbolLookupSet &L, | |
| ExecutorResolver::YieldResolveResultFn &&OnResolve) { | |
| std::vector<std::optional<ExecutorAddr>> Result; | |
| auto DL = sys::DynamicLibrary(Handle.toPtr<void *>()); | |
| for (const auto &E : L) { | |
| if (E.Name.empty()) { | |
| if (E.Required) | |
| OnResolve( | |
| make_error<StringError>("Required address for empty symbol \"\"", | |
| inconvertibleErrorCode())); | |
| else | |
| Result.emplace_back(); | |
| } else { | |
| const char *DemangledSymName = E.Name.c_str(); | |
| #ifdef __APPLE__ | |
| if (E.Name.front() != '_') | |
| OnResolve(make_error<StringError>(Twine("MachO symbol \"") + E.Name + | |
| "\" missing leading '_'", | |
| inconvertibleErrorCode())); | |
| ++DemangledSymName; | |
| #endif | |
| void *Addr = DL.getAddressOfSymbol(DemangledSymName); | |
| if (!Addr && E.Required) | |
| Result.emplace_back(); | |
| else | |
| Result.emplace_back(ExecutorAddr::fromPtr(Addr)); | |
| } | |
| } | |
| OnResolve(std::move(Result)); | |
| } | |
| } // end namespace llvm::orc |