LLVM 22.0.0git
OrcRTBootstrap.cpp
Go to the documentation of this file.
1//===------------------------ OrcRTBootstrap.cpp --------------------------===//
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 "OrcRTBootstrap.h"
10
15
16#define DEBUG_TYPE "orc"
17
18using namespace llvm::orc::shared;
19
20namespace llvm {
21namespace orc {
22namespace rt_bootstrap {
23
24template <typename WriteT, typename SPSWriteT>
26writeUIntsWrapper(const char *ArgData, size_t ArgSize) {
27 return WrapperFunction<void(SPSSequence<SPSWriteT>)>::handle(
28 ArgData, ArgSize,
29 [](std::vector<WriteT> Ws) {
30 for (auto &W : Ws)
31 *W.Addr.template toPtr<decltype(W.Value) *>() = W.Value;
32 })
33 .release();
34}
35
37writePointersWrapper(const char *ArgData, size_t ArgSize) {
39 handle(ArgData, ArgSize,
40 [](std::vector<tpctypes::PointerWrite> Ws) {
41 for (auto &W : Ws)
42 *W.Addr.template toPtr<void **>() =
43 W.Value.template toPtr<void *>();
44 })
45 .release();
46}
47
49writeBuffersWrapper(const char *ArgData, size_t ArgSize) {
51 ArgData, ArgSize,
52 [](std::vector<tpctypes::BufferWrite> Ws) {
53 for (auto &W : Ws)
54 memcpy(W.Addr.template toPtr<char *>(), W.Buffer.data(),
55 W.Buffer.size());
56 })
57 .release();
58}
59
60template <typename ReadT>
62readUIntsWrapper(const char *ArgData, size_t ArgSize) {
64 return WrapperFunction<SPSSig>::handle(ArgData, ArgSize,
65 [](std::vector<ExecutorAddr> Rs) {
66 std::vector<ReadT> Result;
67 Result.reserve(Rs.size());
68 for (auto &R : Rs)
69 Result.push_back(
70 *R.toPtr<ReadT *>());
71 return Result;
72 })
73 .release();
74}
75
77readPointersWrapper(const char *ArgData, size_t ArgSize) {
80 ArgData, ArgSize,
81 [](std::vector<ExecutorAddr> Rs) {
82 std::vector<ExecutorAddr> Result;
83 Result.reserve(Rs.size());
84 for (auto &R : Rs)
85 Result.push_back(ExecutorAddr::fromPtr(*R.toPtr<void **>()));
86 return Result;
87 })
88 .release();
89}
90
92readBuffersWrapper(const char *ArgData, size_t ArgSize) {
93 using SPSSig =
96 ArgData, ArgSize,
97 [](std::vector<ExecutorAddrRange> Rs) {
98 std::vector<std::vector<uint8_t>> Result;
99 Result.reserve(Rs.size());
100 for (auto &R : Rs) {
101 Result.push_back({});
102 Result.back().resize(R.size());
103 memcpy(reinterpret_cast<char *>(Result.back().data()),
104 R.Start.toPtr<char *>(), R.size());
105 }
106 return Result;
107 })
108 .release();
109}
110
112readStringsWrapper(const char *ArgData, size_t ArgSize) {
114 return WrapperFunction<SPSSig>::handle(ArgData, ArgSize,
115 [](std::vector<ExecutorAddr> Rs) {
116 std::vector<std::string> Result;
117 Result.reserve(Rs.size());
118 for (auto &R : Rs)
119 Result.push_back(
120 R.toPtr<char *>());
121 return Result;
122 })
123 .release();
124}
125
127runAsMainWrapper(const char *ArgData, size_t ArgSize) {
129 ArgData, ArgSize,
130 [](ExecutorAddr MainAddr,
131 std::vector<std::string> Args) -> int64_t {
132 return runAsMain(MainAddr.toPtr<int (*)(int, char *[])>(), Args);
133 })
134 .release();
135}
136
138runAsVoidFunctionWrapper(const char *ArgData, size_t ArgSize) {
140 ArgData, ArgSize,
141 [](ExecutorAddr MainAddr) -> int32_t {
142 return runAsVoidFunction(MainAddr.toPtr<int32_t (*)(void)>());
143 })
144 .release();
145}
146
148runAsIntFunctionWrapper(const char *ArgData, size_t ArgSize) {
150 ArgData, ArgSize,
151 [](ExecutorAddr MainAddr, int32_t Arg) -> int32_t {
152 return runAsIntFunction(MainAddr.toPtr<int32_t (*)(int32_t)>(),
153 Arg);
154 })
155 .release();
156}
157
176 ExecutorAddr::fromPtr(&readUIntsWrapper<uint8_t>);
178 ExecutorAddr::fromPtr(&readUIntsWrapper<uint16_t>);
180 ExecutorAddr::fromPtr(&readUIntsWrapper<uint32_t>);
182 ExecutorAddr::fromPtr(&readUIntsWrapper<uint64_t>);
194}
195
196} // end namespace rt_bootstrap
197} // end namespace orc
198} // end namespace llvm
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition: StringMap.h:133
Represents an address in the executor process.
static ExecutorAddr fromPtr(T *Ptr, UnwrapFn &&Unwrap=UnwrapFn())
Create an ExecutorAddr from the given pointer.
std::enable_if_t< std::is_pointer< T >::value, T > toPtr(WrapFn &&Wrap=WrapFn()) const
Cast this ExecutorAddr to a pointer of the given type.
static llvm::orc::shared::CWrapperFunctionResult writeUIntsWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult readBuffersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult runAsVoidFunctionWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult readStringsWrapper(const char *ArgData, size_t ArgSize)
void addTo(StringMap< ExecutorAddr > &M)
static llvm::orc::shared::CWrapperFunctionResult writePointersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult runAsMainWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult readUIntsWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult writeBuffersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult readPointersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionResult runAsIntFunctionWrapper(const char *ArgData, size_t ArgSize)
LLVM_ABI const char * MemoryReadUInt64sWrapperName
Definition: OrcRTBridge.cpp:61
LLVM_ABI const char * MemoryWriteUInt16sWrapperName
Definition: OrcRTBridge.cpp:44
LLVM_ABI const char * MemoryReadStringsWrapperName
Definition: OrcRTBridge.cpp:67
LLVM_ABI const char * MemoryReadUInt16sWrapperName
Definition: OrcRTBridge.cpp:57
LLVM_ABI const char * RunAsIntFunctionWrapperName
Definition: OrcRTBridge.cpp:78
LLVM_ABI const char * MemoryReadPointersWrapperName
Definition: OrcRTBridge.cpp:63
LLVM_ABI const char * MemoryReadUInt32sWrapperName
Definition: OrcRTBridge.cpp:59
LLVM_ABI const char * MemoryWriteUInt64sWrapperName
Definition: OrcRTBridge.cpp:48
LLVM_ABI const char * MemoryWriteUInt8sWrapperName
Definition: OrcRTBridge.cpp:42
LLVM_ABI const char * MemoryWritePointersWrapperName
Definition: OrcRTBridge.cpp:50
LLVM_ABI const char * MemoryWriteUInt32sWrapperName
Definition: OrcRTBridge.cpp:46
LLVM_ABI const char * RunAsVoidFunctionWrapperName
Definition: OrcRTBridge.cpp:76
LLVM_ABI const char * MemoryWriteBuffersWrapperName
Definition: OrcRTBridge.cpp:52
LLVM_ABI const char * MemoryReadBuffersWrapperName
Definition: OrcRTBridge.cpp:65
LLVM_ABI const char * RunAsMainWrapperName
Definition: OrcRTBridge.cpp:75
LLVM_ABI const char * MemoryReadUInt8sWrapperName
Definition: OrcRTBridge.cpp:55
LLVM_ABI int runAsVoidFunction(int(*Func)(void))
LLVM_ABI int runAsIntFunction(int(*Func)(int), int Arg)
LLVM_ABI int runAsMain(int(*Main)(int, char *[]), ArrayRef< std::string > Args, std::optional< StringRef > ProgramName=std::nullopt)
Run a main function, returning the result.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18