LLVM 24.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
16
17#define DEBUG_TYPE "orc"
18
19using namespace llvm::orc::shared;
20
21namespace llvm {
22namespace orc {
23namespace rt_bootstrap {
24
25template <typename WriteT, typename SPSWriteT>
27writeUIntsWrapper(const char *ArgData, size_t ArgSize) {
28 return WrapperFunction<void(SPSSequence<SPSWriteT>)>::handle(
29 ArgData, ArgSize,
30 [](std::vector<WriteT> Ws) {
31 for (auto &W : Ws)
32 *W.Addr.template toPtr<decltype(W.Value) *>() = W.Value;
33 })
34 .release();
35}
36
38writePointersWrapper(const char *ArgData, size_t ArgSize) {
40 handle(ArgData, ArgSize,
41 [](std::vector<tpctypes::PointerWrite> Ws) {
42 for (auto &W : Ws)
43 *W.Addr.template toPtr<void **>() =
44 W.Value.template toPtr<void *>();
45 })
46 .release();
47}
48
50writeBuffersWrapper(const char *ArgData, size_t ArgSize) {
52 ArgData, ArgSize,
53 [](std::vector<tpctypes::BufferWrite> Ws) {
54 for (auto &W : Ws)
55 memcpy(W.Addr.template toPtr<char *>(), W.Buffer.data(),
56 W.Buffer.size());
57 })
58 .release();
59}
60
61template <typename ReadT>
63readUIntsWrapper(const char *ArgData, size_t ArgSize) {
65 return WrapperFunction<SPSSig>::handle(ArgData, ArgSize,
66 [](std::vector<ExecutorAddr> Rs) {
67 std::vector<ReadT> Result;
68 Result.reserve(Rs.size());
69 for (auto &R : Rs)
70 Result.push_back(
71 *R.toPtr<ReadT *>());
72 return Result;
73 })
74 .release();
75}
76
78readPointersWrapper(const char *ArgData, size_t ArgSize) {
81 ArgData, ArgSize,
82 [](std::vector<ExecutorAddr> Rs) {
83 std::vector<ExecutorAddr> Result;
84 Result.reserve(Rs.size());
85 for (auto &R : Rs)
86 Result.push_back(ExecutorAddr::fromPtr(*R.toPtr<void **>()));
87 return Result;
88 })
89 .release();
90}
91
93readBuffersWrapper(const char *ArgData, size_t ArgSize) {
94 using SPSSig =
97 ArgData, ArgSize,
98 [](std::vector<ExecutorAddrRange> Rs) {
99 std::vector<std::vector<uint8_t>> Result;
100 Result.reserve(Rs.size());
101 for (auto &R : Rs) {
102 Result.push_back({});
103 Result.back().resize(R.size());
104 memcpy(reinterpret_cast<char *>(Result.back().data()),
105 R.Start.toPtr<char *>(), R.size());
106 }
107 return Result;
108 })
109 .release();
110}
111
113readStringsWrapper(const char *ArgData, size_t ArgSize) {
115 return WrapperFunction<SPSSig>::handle(ArgData, ArgSize,
116 [](std::vector<ExecutorAddr> Rs) {
117 std::vector<std::string> Result;
118 Result.reserve(Rs.size());
119 for (auto &R : Rs)
120 Result.push_back(
121 R.toPtr<char *>());
122 return Result;
123 })
124 .release();
125}
126
128runAsMainWrapper(const char *ArgData, size_t ArgSize) {
130 ArgData, ArgSize,
131 [](ExecutorAddr MainAddr,
132 std::vector<std::string> Args) -> int64_t {
133 return runAsMain(MainAddr.toPtr<int (*)(int, char *[])>(), Args);
134 })
135 .release();
136}
137
139runAsInt32VoidFunctionWrapper(const char *ArgData, size_t ArgSize) {
141 ArgData, ArgSize,
142 [](ExecutorAddr MainAddr) -> int32_t {
143 return runAsVoidFunction(MainAddr.toPtr<int32_t (*)(void)>());
144 })
145 .release();
146}
147
149runAsInt32Int32FunctionWrapper(const char *ArgData, size_t ArgSize) {
151 ArgData, ArgSize,
152 [](ExecutorAddr MainAddr, int32_t Arg) -> int32_t {
153 return runAsIntFunction(MainAddr.toPtr<int32_t (*)(int32_t)>(),
154 Arg);
155 })
156 .release();
157}
158
195}
196
197} // end namespace rt_bootstrap
198} // end namespace orc
199} // end namespace llvm
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:128
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.
constexpr char CallInt32VoidCIName[]
Definition Calls.h:124
constexpr char CallMainCIName[]
Definition Calls.h:111
constexpr char CallInt32Int32CIName[]
Definition Calls.h:132
static llvm::orc::shared::CWrapperFunctionBuffer writePointersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer readPointersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer readBuffersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer runAsInt32Int32FunctionWrapper(const char *ArgData, size_t ArgSize)
void addTo(StringMap< ExecutorAddr > &M)
static llvm::orc::shared::CWrapperFunctionBuffer runAsMainWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer runAsInt32VoidFunctionWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer writeUIntsWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer writeBuffersWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer readStringsWrapper(const char *ArgData, size_t ArgSize)
static llvm::orc::shared::CWrapperFunctionBuffer readUIntsWrapper(const char *ArgData, size_t ArgSize)
LLVM_ABI const char * MemoryReadUInt64sWrapperName
LLVM_ABI const char * MemoryWriteUInt16sWrapperName
LLVM_ABI const char * MemoryReadStringsWrapperName
LLVM_ABI const char * MemoryReadUInt16sWrapperName
LLVM_ABI const char * MemoryReadPointersWrapperName
LLVM_ABI const char * MemoryReadUInt32sWrapperName
LLVM_ABI const char * MemoryWriteUInt64sWrapperName
LLVM_ABI const char * MemoryWriteUInt8sWrapperName
LLVM_ABI const char * MemoryWritePointersWrapperName
LLVM_ABI const char * MemoryWriteUInt32sWrapperName
LLVM_ABI const char * MemoryWriteBuffersWrapperName
LLVM_ABI const char * MemoryReadBuffersWrapperName
LLVM_ABI const char * MemoryReadUInt8sWrapperName
SPSMemoryAccessUIntWrite< uint8_t > SPSMemoryAccessUInt8Write
SPSMemoryAccessUIntWrite< uint16_t > SPSMemoryAccessUInt16Write
SPSMemoryAccessUIntWrite< uint64_t > SPSMemoryAccessUInt64Write
SPSMemoryAccessUIntWrite< uint32_t > SPSMemoryAccessUInt32Write
UIntWrite< uint64_t > UInt64Write
Describes a write to a uint64_t.
UIntWrite< uint8_t > UInt8Write
Describes a write to a uint8_t.
UIntWrite< uint32_t > UInt32Write
Describes a write to a uint32_t.
UIntWrite< uint16_t > UInt16Write
Describes a write to a uint16_t.
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.