| //===------ 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<tpctypes::UInt8Write> Ws, |
| WriteResultFn OnWriteComplete) { |
| for (auto &W : Ws) |
| *W.Addr.toPtr<uint8_t *>() = W.Value; |
| OnWriteComplete(Error::success()); |
| } |
| |
| void InProcessMemoryAccess::writeUInt16sAsync( |
| ArrayRef<tpctypes::UInt16Write> Ws, WriteResultFn OnWriteComplete) { |
| for (auto &W : Ws) |
| *W.Addr.toPtr<uint16_t *>() = W.Value; |
| OnWriteComplete(Error::success()); |
| } |
| |
| void InProcessMemoryAccess::writeUInt32sAsync( |
| ArrayRef<tpctypes::UInt32Write> Ws, WriteResultFn OnWriteComplete) { |
| for (auto &W : Ws) |
| *W.Addr.toPtr<uint32_t *>() = W.Value; |
| OnWriteComplete(Error::success()); |
| } |
| |
| void InProcessMemoryAccess::writeUInt64sAsync( |
| ArrayRef<tpctypes::UInt64Write> Ws, WriteResultFn OnWriteComplete) { |
| for (auto &W : Ws) |
| *W.Addr.toPtr<uint64_t *>() = W.Value; |
| OnWriteComplete(Error::success()); |
| } |
| |
| void InProcessMemoryAccess::writePointersAsync( |
| ArrayRef<tpctypes::PointerWrite> Ws, WriteResultFn OnWriteComplete) { |
| if (IsArch64Bit) { |
| for (auto &W : Ws) |
| *W.Addr.toPtr<uint64_t *>() = W.Value.getValue(); |
| } else { |
| for (auto &W : Ws) |
| *W.Addr.toPtr<uint32_t *>() = static_cast<uint32_t>(W.Value.getValue()); |
| } |
| |
| OnWriteComplete(Error::success()); |
| } |
| |
| void InProcessMemoryAccess::writeBuffersAsync( |
| ArrayRef<tpctypes::BufferWrite> Ws, WriteResultFn OnWriteComplete) { |
| for (auto &W : Ws) |
| memcpy(W.Addr.toPtr<char *>(), W.Buffer.data(), W.Buffer.size()); |
| OnWriteComplete(Error::success()); |
| } |
| |
| void InProcessMemoryAccess::readUInt8sAsync( |
| ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint8_t> OnComplete) { |
| ReadUIntsResult<uint8_t> Result; |
| Result.reserve(Rs.size()); |
| for (auto &R : Rs) |
| Result.push_back(*R.toPtr<uint8_t *>()); |
| OnComplete(std::move(Result)); |
| } |
| |
| void InProcessMemoryAccess::readUInt16sAsync( |
| ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint16_t> OnComplete) { |
| ReadUIntsResult<uint16_t> Result; |
| Result.reserve(Rs.size()); |
| for (auto &R : Rs) |
| Result.push_back(*R.toPtr<uint16_t *>()); |
| OnComplete(std::move(Result)); |
| } |
| |
| void InProcessMemoryAccess::readUInt32sAsync( |
| ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint32_t> OnComplete) { |
| ReadUIntsResult<uint32_t> Result; |
| Result.reserve(Rs.size()); |
| for (auto &R : Rs) |
| Result.push_back(*R.toPtr<uint32_t *>()); |
| OnComplete(std::move(Result)); |
| } |
| |
| void InProcessMemoryAccess::readUInt64sAsync( |
| ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint64_t> OnComplete) { |
| ReadUIntsResult<uint64_t> Result; |
| Result.reserve(Rs.size()); |
| for (auto &R : Rs) |
| Result.push_back(*R.toPtr<uint64_t *>()); |
| OnComplete(std::move(Result)); |
| } |
| |
| void InProcessMemoryAccess::readPointersAsync( |
| ArrayRef<ExecutorAddr> Rs, OnReadPointersCompleteFn OnComplete) { |
| ReadPointersResult Result; |
| Result.reserve(Rs.size()); |
| for (auto &R : Rs) |
| Result.push_back(ExecutorAddr::fromPtr(*R.toPtr<void **>())); |
| OnComplete(std::move(Result)); |
| } |
| |
| void InProcessMemoryAccess::readBuffersAsync( |
| ArrayRef<ExecutorAddrRange> 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<char *>(), R.size()); |
| } |
| OnComplete(std::move(Result)); |
| } |
| |
| void InProcessMemoryAccess::readStringsAsync( |
| ArrayRef<ExecutorAddr> Rs, OnReadStringsCompleteFn OnComplete) { |
| ReadStringsResult Result; |
| Result.reserve(Rs.size()); |
| for (auto &R : Rs) { |
| Result.push_back({}); |
| for (auto *P = R.toPtr<char *>(); *P; ++P) |
| Result.back().push_back(*P); |
| } |
| OnComplete(std::move(Result)); |
| } |
| |
| } // end namespace llvm::orc |