47 lines · cpp
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>("Required address for empty symbol \"\"",20 inconvertibleErrorCode()));21 else22 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#endif33 34 void *Addr = DL.getAddressOfSymbol(DemangledSymName);35 if (!Addr && E.Required)36 Result.emplace_back();37 else38 // FIXME: determine accurate JITSymbolFlags.39 Result.emplace_back(ExecutorSymbolDef(ExecutorAddr::fromPtr(Addr),40 JITSymbolFlags::Exported));41 }42 }43 44 OnResolve(std::move(Result));45}46 47} // end namespace llvm::orc