//===------ InProcessMemoryAccess.cpp - Direct, in-process mem access -----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ExecutionEngine/Orc/InProcessMemoryAccess.h" #define DEBUG_TYPE "orc" namespace llvm::orc { MemoryAccess::~MemoryAccess() = default; void InProcessMemoryAccess::writeUInt8sAsync(ArrayRef Ws, WriteResultFn OnWriteComplete) { for (auto &W : Ws) *W.Addr.toPtr() = W.Value; OnWriteComplete(Error::success()); } void InProcessMemoryAccess::writeUInt16sAsync( ArrayRef Ws, WriteResultFn OnWriteComplete) { for (auto &W : Ws) *W.Addr.toPtr() = W.Value; OnWriteComplete(Error::success()); } void InProcessMemoryAccess::writeUInt32sAsync( ArrayRef Ws, WriteResultFn OnWriteComplete) { for (auto &W : Ws) *W.Addr.toPtr() = W.Value; OnWriteComplete(Error::success()); } void InProcessMemoryAccess::writeUInt64sAsync( ArrayRef Ws, WriteResultFn OnWriteComplete) { for (auto &W : Ws) *W.Addr.toPtr() = W.Value; OnWriteComplete(Error::success()); } void InProcessMemoryAccess::writePointersAsync( ArrayRef Ws, WriteResultFn OnWriteComplete) { if (IsArch64Bit) { for (auto &W : Ws) *W.Addr.toPtr() = W.Value.getValue(); } else { for (auto &W : Ws) *W.Addr.toPtr() = static_cast(W.Value.getValue()); } OnWriteComplete(Error::success()); } void InProcessMemoryAccess::writeBuffersAsync( ArrayRef Ws, WriteResultFn OnWriteComplete) { for (auto &W : Ws) memcpy(W.Addr.toPtr(), W.Buffer.data(), W.Buffer.size()); OnWriteComplete(Error::success()); } void InProcessMemoryAccess::readUInt8sAsync( ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) { ReadUIntsResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back(*R.toPtr()); OnComplete(std::move(Result)); } void InProcessMemoryAccess::readUInt16sAsync( ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) { ReadUIntsResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back(*R.toPtr()); OnComplete(std::move(Result)); } void InProcessMemoryAccess::readUInt32sAsync( ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) { ReadUIntsResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back(*R.toPtr()); OnComplete(std::move(Result)); } void InProcessMemoryAccess::readUInt64sAsync( ArrayRef Rs, OnReadUIntsCompleteFn OnComplete) { ReadUIntsResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back(*R.toPtr()); OnComplete(std::move(Result)); } void InProcessMemoryAccess::readPointersAsync( ArrayRef Rs, OnReadPointersCompleteFn OnComplete) { ReadPointersResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back(ExecutorAddr::fromPtr(*R.toPtr())); OnComplete(std::move(Result)); } void InProcessMemoryAccess::readBuffersAsync( ArrayRef Rs, OnReadBuffersCompleteFn OnComplete) { ReadBuffersResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) { Result.push_back({}); Result.back().resize(R.size()); memcpy(Result.back().data(), R.Start.toPtr(), R.size()); } OnComplete(std::move(Result)); } void InProcessMemoryAccess::readStringsAsync( ArrayRef Rs, OnReadStringsCompleteFn OnComplete) { ReadStringsResult Result; Result.reserve(Rs.size()); for (auto &R : Rs) { Result.push_back({}); for (auto *P = R.toPtr(); *P; ++P) Result.back().push_back(*P); } OnComplete(std::move(Result)); } } // end namespace llvm::orc