xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/InProcessMemoryAccess.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===------ InProcessMemoryAccess.cpp - Direct, in-process mem access -----===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ExecutionEngine/Orc/InProcessMemoryAccess.h"
10 
11 #define DEBUG_TYPE "orc"
12 
13 namespace llvm::orc {
14 
15 MemoryAccess::~MemoryAccess() = default;
16 
writeUInt8sAsync(ArrayRef<tpctypes::UInt8Write> Ws,WriteResultFn OnWriteComplete)17 void InProcessMemoryAccess::writeUInt8sAsync(ArrayRef<tpctypes::UInt8Write> Ws,
18                                              WriteResultFn OnWriteComplete) {
19   for (auto &W : Ws)
20     *W.Addr.toPtr<uint8_t *>() = W.Value;
21   OnWriteComplete(Error::success());
22 }
23 
writeUInt16sAsync(ArrayRef<tpctypes::UInt16Write> Ws,WriteResultFn OnWriteComplete)24 void InProcessMemoryAccess::writeUInt16sAsync(
25     ArrayRef<tpctypes::UInt16Write> Ws, WriteResultFn OnWriteComplete) {
26   for (auto &W : Ws)
27     *W.Addr.toPtr<uint16_t *>() = W.Value;
28   OnWriteComplete(Error::success());
29 }
30 
writeUInt32sAsync(ArrayRef<tpctypes::UInt32Write> Ws,WriteResultFn OnWriteComplete)31 void InProcessMemoryAccess::writeUInt32sAsync(
32     ArrayRef<tpctypes::UInt32Write> Ws, WriteResultFn OnWriteComplete) {
33   for (auto &W : Ws)
34     *W.Addr.toPtr<uint32_t *>() = W.Value;
35   OnWriteComplete(Error::success());
36 }
37 
writeUInt64sAsync(ArrayRef<tpctypes::UInt64Write> Ws,WriteResultFn OnWriteComplete)38 void InProcessMemoryAccess::writeUInt64sAsync(
39     ArrayRef<tpctypes::UInt64Write> Ws, WriteResultFn OnWriteComplete) {
40   for (auto &W : Ws)
41     *W.Addr.toPtr<uint64_t *>() = W.Value;
42   OnWriteComplete(Error::success());
43 }
44 
writePointersAsync(ArrayRef<tpctypes::PointerWrite> Ws,WriteResultFn OnWriteComplete)45 void InProcessMemoryAccess::writePointersAsync(
46     ArrayRef<tpctypes::PointerWrite> Ws, WriteResultFn OnWriteComplete) {
47   if (IsArch64Bit) {
48     for (auto &W : Ws)
49       *W.Addr.toPtr<uint64_t *>() = W.Value.getValue();
50   } else {
51     for (auto &W : Ws)
52       *W.Addr.toPtr<uint32_t *>() = static_cast<uint32_t>(W.Value.getValue());
53   }
54 
55   OnWriteComplete(Error::success());
56 }
57 
writeBuffersAsync(ArrayRef<tpctypes::BufferWrite> Ws,WriteResultFn OnWriteComplete)58 void InProcessMemoryAccess::writeBuffersAsync(
59     ArrayRef<tpctypes::BufferWrite> Ws, WriteResultFn OnWriteComplete) {
60   for (auto &W : Ws)
61     memcpy(W.Addr.toPtr<char *>(), W.Buffer.data(), W.Buffer.size());
62   OnWriteComplete(Error::success());
63 }
64 
readUInt8sAsync(ArrayRef<ExecutorAddr> Rs,OnReadUIntsCompleteFn<uint8_t> OnComplete)65 void InProcessMemoryAccess::readUInt8sAsync(
66     ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint8_t> OnComplete) {
67   ReadUIntsResult<uint8_t> Result;
68   Result.reserve(Rs.size());
69   for (auto &R : Rs)
70     Result.push_back(*R.toPtr<uint8_t *>());
71   OnComplete(std::move(Result));
72 }
73 
readUInt16sAsync(ArrayRef<ExecutorAddr> Rs,OnReadUIntsCompleteFn<uint16_t> OnComplete)74 void InProcessMemoryAccess::readUInt16sAsync(
75     ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint16_t> OnComplete) {
76   ReadUIntsResult<uint16_t> Result;
77   Result.reserve(Rs.size());
78   for (auto &R : Rs)
79     Result.push_back(*R.toPtr<uint16_t *>());
80   OnComplete(std::move(Result));
81 }
82 
readUInt32sAsync(ArrayRef<ExecutorAddr> Rs,OnReadUIntsCompleteFn<uint32_t> OnComplete)83 void InProcessMemoryAccess::readUInt32sAsync(
84     ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint32_t> OnComplete) {
85   ReadUIntsResult<uint32_t> Result;
86   Result.reserve(Rs.size());
87   for (auto &R : Rs)
88     Result.push_back(*R.toPtr<uint32_t *>());
89   OnComplete(std::move(Result));
90 }
91 
readUInt64sAsync(ArrayRef<ExecutorAddr> Rs,OnReadUIntsCompleteFn<uint64_t> OnComplete)92 void InProcessMemoryAccess::readUInt64sAsync(
93     ArrayRef<ExecutorAddr> Rs, OnReadUIntsCompleteFn<uint64_t> OnComplete) {
94   ReadUIntsResult<uint64_t> Result;
95   Result.reserve(Rs.size());
96   for (auto &R : Rs)
97     Result.push_back(*R.toPtr<uint64_t *>());
98   OnComplete(std::move(Result));
99 }
100 
readPointersAsync(ArrayRef<ExecutorAddr> Rs,OnReadPointersCompleteFn OnComplete)101 void InProcessMemoryAccess::readPointersAsync(
102     ArrayRef<ExecutorAddr> Rs, OnReadPointersCompleteFn OnComplete) {
103   ReadPointersResult Result;
104   Result.reserve(Rs.size());
105   for (auto &R : Rs)
106     Result.push_back(ExecutorAddr::fromPtr(*R.toPtr<void **>()));
107   OnComplete(std::move(Result));
108 }
109 
readBuffersAsync(ArrayRef<ExecutorAddrRange> Rs,OnReadBuffersCompleteFn OnComplete)110 void InProcessMemoryAccess::readBuffersAsync(
111     ArrayRef<ExecutorAddrRange> Rs, OnReadBuffersCompleteFn OnComplete) {
112   ReadBuffersResult Result;
113   Result.reserve(Rs.size());
114   for (auto &R : Rs) {
115     Result.push_back({});
116     Result.back().resize(R.size());
117     memcpy(Result.back().data(), R.Start.toPtr<char *>(), R.size());
118   }
119   OnComplete(std::move(Result));
120 }
121 
readStringsAsync(ArrayRef<ExecutorAddr> Rs,OnReadStringsCompleteFn OnComplete)122 void InProcessMemoryAccess::readStringsAsync(
123     ArrayRef<ExecutorAddr> Rs, OnReadStringsCompleteFn OnComplete) {
124   ReadStringsResult Result;
125   Result.reserve(Rs.size());
126   for (auto &R : Rs) {
127     Result.push_back({});
128     for (auto *P = R.toPtr<char *>(); *P; ++P)
129       Result.back().push_back(*P);
130   }
131   OnComplete(std::move(Result));
132 }
133 
134 } // end namespace llvm::orc
135