xref: /src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1c0981da4SDimitry Andric //===------------------------ OrcRTBootstrap.cpp --------------------------===//
2c0981da4SDimitry Andric //
3c0981da4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c0981da4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5c0981da4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c0981da4SDimitry Andric //
7c0981da4SDimitry Andric //===----------------------------------------------------------------------===//
8c0981da4SDimitry Andric 
9c0981da4SDimitry Andric #include "OrcRTBootstrap.h"
10c0981da4SDimitry Andric 
11c0981da4SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
12c0981da4SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
13c0981da4SDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"
14c0981da4SDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h"
15c0981da4SDimitry Andric 
16c0981da4SDimitry Andric #define DEBUG_TYPE "orc"
17c0981da4SDimitry Andric 
18c0981da4SDimitry Andric using namespace llvm::orc::shared;
19c0981da4SDimitry Andric 
20c0981da4SDimitry Andric namespace llvm {
21c0981da4SDimitry Andric namespace orc {
22c0981da4SDimitry Andric namespace rt_bootstrap {
23c0981da4SDimitry Andric 
24c0981da4SDimitry Andric template <typename WriteT, typename SPSWriteT>
25c0981da4SDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
writeUIntsWrapper(const char * ArgData,size_t ArgSize)26c0981da4SDimitry Andric writeUIntsWrapper(const char *ArgData, size_t ArgSize) {
27c0981da4SDimitry Andric   return WrapperFunction<void(SPSSequence<SPSWriteT>)>::handle(
28c0981da4SDimitry Andric              ArgData, ArgSize,
29c0981da4SDimitry Andric              [](std::vector<WriteT> Ws) {
30c0981da4SDimitry Andric                for (auto &W : Ws)
31c0981da4SDimitry Andric                  *W.Addr.template toPtr<decltype(W.Value) *>() = W.Value;
32c0981da4SDimitry Andric              })
33c0981da4SDimitry Andric       .release();
34c0981da4SDimitry Andric }
35c0981da4SDimitry Andric 
36c0981da4SDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
writeBuffersWrapper(const char * ArgData,size_t ArgSize)37c0981da4SDimitry Andric writeBuffersWrapper(const char *ArgData, size_t ArgSize) {
38c0981da4SDimitry Andric   return WrapperFunction<void(SPSSequence<SPSMemoryAccessBufferWrite>)>::handle(
39c0981da4SDimitry Andric              ArgData, ArgSize,
40c0981da4SDimitry Andric              [](std::vector<tpctypes::BufferWrite> Ws) {
41c0981da4SDimitry Andric                for (auto &W : Ws)
42c0981da4SDimitry Andric                  memcpy(W.Addr.template toPtr<char *>(), W.Buffer.data(),
43c0981da4SDimitry Andric                         W.Buffer.size());
44c0981da4SDimitry Andric              })
45c0981da4SDimitry Andric       .release();
46c0981da4SDimitry Andric }
47c0981da4SDimitry Andric 
48c0981da4SDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
runAsMainWrapper(const char * ArgData,size_t ArgSize)49c0981da4SDimitry Andric runAsMainWrapper(const char *ArgData, size_t ArgSize) {
50c0981da4SDimitry Andric   return WrapperFunction<rt::SPSRunAsMainSignature>::handle(
51c0981da4SDimitry Andric              ArgData, ArgSize,
52c0981da4SDimitry Andric              [](ExecutorAddr MainAddr,
53c0981da4SDimitry Andric                 std::vector<std::string> Args) -> int64_t {
54c0981da4SDimitry Andric                return runAsMain(MainAddr.toPtr<int (*)(int, char *[])>(), Args);
55c0981da4SDimitry Andric              })
56c0981da4SDimitry Andric       .release();
57c0981da4SDimitry Andric }
58c0981da4SDimitry Andric 
59e3b55780SDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
runAsVoidFunctionWrapper(const char * ArgData,size_t ArgSize)60e3b55780SDimitry Andric runAsVoidFunctionWrapper(const char *ArgData, size_t ArgSize) {
61e3b55780SDimitry Andric   return WrapperFunction<rt::SPSRunAsVoidFunctionSignature>::handle(
62e3b55780SDimitry Andric              ArgData, ArgSize,
63e3b55780SDimitry Andric              [](ExecutorAddr MainAddr) -> int32_t {
64e3b55780SDimitry Andric                return runAsVoidFunction(MainAddr.toPtr<int32_t (*)(void)>());
65e3b55780SDimitry Andric              })
66e3b55780SDimitry Andric       .release();
67e3b55780SDimitry Andric }
68e3b55780SDimitry Andric 
69e3b55780SDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
runAsIntFunctionWrapper(const char * ArgData,size_t ArgSize)70e3b55780SDimitry Andric runAsIntFunctionWrapper(const char *ArgData, size_t ArgSize) {
71e3b55780SDimitry Andric   return WrapperFunction<rt::SPSRunAsIntFunctionSignature>::handle(
72e3b55780SDimitry Andric              ArgData, ArgSize,
73e3b55780SDimitry Andric              [](ExecutorAddr MainAddr, int32_t Arg) -> int32_t {
74e3b55780SDimitry Andric                return runAsIntFunction(MainAddr.toPtr<int32_t (*)(int32_t)>(),
75e3b55780SDimitry Andric                                        Arg);
76e3b55780SDimitry Andric              })
77e3b55780SDimitry Andric       .release();
78e3b55780SDimitry Andric }
79e3b55780SDimitry Andric 
addTo(StringMap<ExecutorAddr> & M)80c0981da4SDimitry Andric void addTo(StringMap<ExecutorAddr> &M) {
81c0981da4SDimitry Andric   M[rt::MemoryWriteUInt8sWrapperName] = ExecutorAddr::fromPtr(
82c0981da4SDimitry Andric       &writeUIntsWrapper<tpctypes::UInt8Write,
83c0981da4SDimitry Andric                          shared::SPSMemoryAccessUInt8Write>);
84c0981da4SDimitry Andric   M[rt::MemoryWriteUInt16sWrapperName] = ExecutorAddr::fromPtr(
85c0981da4SDimitry Andric       &writeUIntsWrapper<tpctypes::UInt16Write,
86c0981da4SDimitry Andric                          shared::SPSMemoryAccessUInt16Write>);
87c0981da4SDimitry Andric   M[rt::MemoryWriteUInt32sWrapperName] = ExecutorAddr::fromPtr(
88c0981da4SDimitry Andric       &writeUIntsWrapper<tpctypes::UInt32Write,
89c0981da4SDimitry Andric                          shared::SPSMemoryAccessUInt32Write>);
90c0981da4SDimitry Andric   M[rt::MemoryWriteUInt64sWrapperName] = ExecutorAddr::fromPtr(
91c0981da4SDimitry Andric       &writeUIntsWrapper<tpctypes::UInt64Write,
92c0981da4SDimitry Andric                          shared::SPSMemoryAccessUInt64Write>);
93c0981da4SDimitry Andric   M[rt::MemoryWriteBuffersWrapperName] =
94c0981da4SDimitry Andric       ExecutorAddr::fromPtr(&writeBuffersWrapper);
956f8fc217SDimitry Andric   M[rt::RegisterEHFrameSectionWrapperName] =
966f8fc217SDimitry Andric       ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionWrapper);
976f8fc217SDimitry Andric   M[rt::DeregisterEHFrameSectionWrapperName] =
986f8fc217SDimitry Andric       ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionWrapper);
99c0981da4SDimitry Andric   M[rt::RunAsMainWrapperName] = ExecutorAddr::fromPtr(&runAsMainWrapper);
100e3b55780SDimitry Andric   M[rt::RunAsVoidFunctionWrapperName] =
101e3b55780SDimitry Andric       ExecutorAddr::fromPtr(&runAsVoidFunctionWrapper);
102e3b55780SDimitry Andric   M[rt::RunAsIntFunctionWrapperName] =
103e3b55780SDimitry Andric       ExecutorAddr::fromPtr(&runAsIntFunctionWrapper);
104c0981da4SDimitry Andric }
105c0981da4SDimitry Andric 
106c0981da4SDimitry Andric } // end namespace rt_bootstrap
107c0981da4SDimitry Andric } // end namespace orc
108c0981da4SDimitry Andric } // end namespace llvm
109