brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 42d630d Raw
84 lines · cpp
1//===------- LookupAndRecordAddrs.h - Symbol lookup support utility -------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ExecutionEngine/Orc/LookupAndRecordAddrs.h"10 11#include <future>12 13namespace llvm {14namespace orc {15 16void lookupAndRecordAddrs(17    unique_function<void(Error)> OnRecorded, ExecutionSession &ES, LookupKind K,18    const JITDylibSearchOrder &SearchOrder,19    std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,20    SymbolLookupFlags LookupFlags) {21 22  SymbolLookupSet Symbols;23  for (auto &KV : Pairs)24    Symbols.add(KV.first, LookupFlags);25 26  ES.lookup(27      K, SearchOrder, std::move(Symbols), SymbolState::Ready,28      [Pairs = std::move(Pairs),29       OnRec = std::move(OnRecorded)](Expected<SymbolMap> Result) mutable {30        if (!Result)31          return OnRec(Result.takeError());32        for (auto &KV : Pairs) {33          auto I = Result->find(KV.first);34          *KV.second =35              I != Result->end() ? I->second.getAddress() : orc::ExecutorAddr();36        }37        OnRec(Error::success());38      },39      NoDependenciesToRegister);40}41 42Error lookupAndRecordAddrs(43    ExecutionSession &ES, LookupKind K, const JITDylibSearchOrder &SearchOrder,44    std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,45    SymbolLookupFlags LookupFlags) {46 47  std::promise<MSVCPError> ResultP;48  auto ResultF = ResultP.get_future();49  lookupAndRecordAddrs([&](Error Err) { ResultP.set_value(std::move(Err)); },50                       ES, K, SearchOrder, std::move(Pairs), LookupFlags);51  return ResultF.get();52}53 54Error lookupAndRecordAddrs(55    ExecutorProcessControl &EPC, tpctypes::DylibHandle H,56    std::vector<std::pair<SymbolStringPtr, ExecutorAddr *>> Pairs,57    SymbolLookupFlags LookupFlags) {58 59  SymbolLookupSet Symbols;60  for (auto &KV : Pairs)61    Symbols.add(KV.first, LookupFlags);62 63  DylibManager::LookupRequest LR(H, Symbols);64  auto Result = EPC.getDylibMgr().lookupSymbols(LR);65  if (!Result)66    return Result.takeError();67 68  if (Result->size() != 1)69    return make_error<StringError>("Error in lookup result",70                                   inconvertibleErrorCode());71  if (Result->front().size() != Pairs.size())72    return make_error<StringError>("Error in lookup result elements",73                                   inconvertibleErrorCode());74 75  for (unsigned I = 0; I != Pairs.size(); ++I) {76    if (Result->front()[I])77      *Pairs[I].second = Result->front()[I]->getAddress();78  }79  return Error::success();80}81 82} // End namespace orc.83} // End namespace llvm.84