Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/InProcessMemoryAccess.cpp
213799 views
//===------ InProcessMemoryAccess.cpp - Direct, in-process mem access -----===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/InProcessMemoryAccess.h"910#define DEBUG_TYPE "orc"1112namespace llvm::orc {1314MemoryAccess::~MemoryAccess() = default;1516void InProcessMemoryAccess::writeUInt8sAsync(ArrayRef<tpctypes::UInt8Write> Ws,17WriteResultFn OnWriteComplete) {18for (auto &W : Ws)19*W.Addr.toPtr<uint8_t *>() = W.Value;20OnWriteComplete(Error::success());21}2223void InProcessMemoryAccess::writeUInt16sAsync(24ArrayRef<tpctypes::UInt16Write> Ws, WriteResultFn OnWriteComplete) {25for (auto &W : Ws)26*W.Addr.toPtr<uint16_t *>() = W.Value;27OnWriteComplete(Error::success());28}2930void InProcessMemoryAccess::writeUInt32sAsync(31ArrayRef<tpctypes::UInt32Write> Ws, WriteResultFn OnWriteComplete) {32for (auto &W : Ws)33*W.Addr.toPtr<uint32_t *>() = W.Value;34OnWriteComplete(Error::success());35}3637void InProcessMemoryAccess::writeUInt64sAsync(38ArrayRef<tpctypes::UInt64Write> Ws, WriteResultFn OnWriteComplete) {39for (auto &W : Ws)40*W.Addr.toPtr<uint64_t *>() = W.Value;41OnWriteComplete(Error::success());42}4344void InProcessMemoryAccess::writePointersAsync(45ArrayRef<tpctypes::PointerWrite> Ws, WriteResultFn OnWriteComplete) {46if (IsArch64Bit) {47for (auto &W : Ws)48*W.Addr.toPtr<uint64_t *>() = W.Value.getValue();49} else {50for (auto &W : Ws)51*W.Addr.toPtr<uint32_t *>() = static_cast<uint32_t>(W.Value.getValue());52}5354OnWriteComplete(Error::success());55}5657void InProcessMemoryAccess::writeBuffersAsync(58ArrayRef<tpctypes::BufferWrite> Ws, WriteResultFn OnWriteComplete) {59for (auto &W : Ws)60memcpy(W.Addr.toPtr<char *>(), W.Buffer.data(), W.Buffer.size());61OnWriteComplete(Error::success());62}6364void InProcessMemoryAccess::readUInt8sAsync(65ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint8_t> OnComplete) {66ReadUIntsResult<uint8_t> Result;67Result.reserve(Rs.size());68for (auto &R : Rs)69Result.push_back(*R.toPtr<uint8_t *>());70OnComplete(std::move(Result));71}7273void InProcessMemoryAccess::readUInt16sAsync(74ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint16_t> OnComplete) {75ReadUIntsResult<uint16_t> Result;76Result.reserve(Rs.size());77for (auto &R : Rs)78Result.push_back(*R.toPtr<uint16_t *>());79OnComplete(std::move(Result));80}8182void InProcessMemoryAccess::readUInt32sAsync(83ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint32_t> OnComplete) {84ReadUIntsResult<uint32_t> Result;85Result.reserve(Rs.size());86for (auto &R : Rs)87Result.push_back(*R.toPtr<uint32_t *>());88OnComplete(std::move(Result));89}9091void InProcessMemoryAccess::readUInt64sAsync(92ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint64_t> OnComplete) {93ReadUIntsResult<uint64_t> Result;94Result.reserve(Rs.size());95for (auto &R : Rs)96Result.push_back(*R.toPtr<uint64_t *>());97OnComplete(std::move(Result));98}99100void InProcessMemoryAccess::readPointersAsync(101ArrayRef<ExecutorAddr> Rs, OnReadPointersCompleteFn OnComplete) {102ReadPointersResult Result;103Result.reserve(Rs.size());104for (auto &R : Rs)105Result.push_back(ExecutorAddr::fromPtr(*R.toPtr<void **>()));106OnComplete(std::move(Result));107}108109void InProcessMemoryAccess::readBuffersAsync(110ArrayRef<ExecutorAddrRange> Rs, OnReadBuffersCompleteFn OnComplete) {111ReadBuffersResult Result;112Result.reserve(Rs.size());113for (auto &R : Rs) {114Result.push_back({});115Result.back().resize(R.size());116memcpy(Result.back().data(), R.Start.toPtr<char *>(), R.size());117}118OnComplete(std::move(Result));119}120121void InProcessMemoryAccess::readStringsAsync(122ArrayRef<ExecutorAddr> Rs, OnReadStringsCompleteFn OnComplete) {123ReadStringsResult Result;124Result.reserve(Rs.size());125for (auto &R : Rs) {126Result.push_back({});127for (auto *P = R.toPtr<char *>(); *P; ++P)128Result.back().push_back(*P);129}130OnComplete(std::move(Result));131}132133} // end namespace llvm::orc134135136