brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · 6054d86 Raw
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