xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1349cc55cSDimitry Andric //===------------------------ OrcRTBootstrap.cpp --------------------------===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric 
9349cc55cSDimitry Andric #include "OrcRTBootstrap.h"
10349cc55cSDimitry Andric 
11349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
12349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
13349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"
14349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h"
15349cc55cSDimitry Andric 
16349cc55cSDimitry Andric #define DEBUG_TYPE "orc"
17349cc55cSDimitry Andric 
18349cc55cSDimitry Andric using namespace llvm::orc::shared;
19349cc55cSDimitry Andric 
20349cc55cSDimitry Andric namespace llvm {
21349cc55cSDimitry Andric namespace orc {
22349cc55cSDimitry Andric namespace rt_bootstrap {
23349cc55cSDimitry Andric 
24349cc55cSDimitry Andric template <typename WriteT, typename SPSWriteT>
25349cc55cSDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
writeUIntsWrapper(const char * ArgData,size_t ArgSize)26349cc55cSDimitry Andric writeUIntsWrapper(const char *ArgData, size_t ArgSize) {
27349cc55cSDimitry Andric   return WrapperFunction<void(SPSSequence<SPSWriteT>)>::handle(
28349cc55cSDimitry Andric              ArgData, ArgSize,
29349cc55cSDimitry Andric              [](std::vector<WriteT> Ws) {
30349cc55cSDimitry Andric                for (auto &W : Ws)
31349cc55cSDimitry Andric                  *W.Addr.template toPtr<decltype(W.Value) *>() = W.Value;
32349cc55cSDimitry Andric              })
33349cc55cSDimitry Andric       .release();
34349cc55cSDimitry Andric }
35349cc55cSDimitry Andric 
36349cc55cSDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
writeBuffersWrapper(const char * ArgData,size_t ArgSize)37349cc55cSDimitry Andric writeBuffersWrapper(const char *ArgData, size_t ArgSize) {
38349cc55cSDimitry Andric   return WrapperFunction<void(SPSSequence<SPSMemoryAccessBufferWrite>)>::handle(
39349cc55cSDimitry Andric              ArgData, ArgSize,
40349cc55cSDimitry Andric              [](std::vector<tpctypes::BufferWrite> Ws) {
41349cc55cSDimitry Andric                for (auto &W : Ws)
42349cc55cSDimitry Andric                  memcpy(W.Addr.template toPtr<char *>(), W.Buffer.data(),
43349cc55cSDimitry Andric                         W.Buffer.size());
44349cc55cSDimitry Andric              })
45349cc55cSDimitry Andric       .release();
46349cc55cSDimitry Andric }
47349cc55cSDimitry Andric 
48349cc55cSDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
runAsMainWrapper(const char * ArgData,size_t ArgSize)49349cc55cSDimitry Andric runAsMainWrapper(const char *ArgData, size_t ArgSize) {
50349cc55cSDimitry Andric   return WrapperFunction<rt::SPSRunAsMainSignature>::handle(
51349cc55cSDimitry Andric              ArgData, ArgSize,
52349cc55cSDimitry Andric              [](ExecutorAddr MainAddr,
53349cc55cSDimitry Andric                 std::vector<std::string> Args) -> int64_t {
54349cc55cSDimitry Andric                return runAsMain(MainAddr.toPtr<int (*)(int, char *[])>(), Args);
55349cc55cSDimitry Andric              })
56349cc55cSDimitry Andric       .release();
57349cc55cSDimitry Andric }
58349cc55cSDimitry Andric 
59*bdd1243dSDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
runAsVoidFunctionWrapper(const char * ArgData,size_t ArgSize)60*bdd1243dSDimitry Andric runAsVoidFunctionWrapper(const char *ArgData, size_t ArgSize) {
61*bdd1243dSDimitry Andric   return WrapperFunction<rt::SPSRunAsVoidFunctionSignature>::handle(
62*bdd1243dSDimitry Andric              ArgData, ArgSize,
63*bdd1243dSDimitry Andric              [](ExecutorAddr MainAddr) -> int32_t {
64*bdd1243dSDimitry Andric                return runAsVoidFunction(MainAddr.toPtr<int32_t (*)(void)>());
65*bdd1243dSDimitry Andric              })
66*bdd1243dSDimitry Andric       .release();
67*bdd1243dSDimitry Andric }
68*bdd1243dSDimitry Andric 
69*bdd1243dSDimitry Andric static llvm::orc::shared::CWrapperFunctionResult
runAsIntFunctionWrapper(const char * ArgData,size_t ArgSize)70*bdd1243dSDimitry Andric runAsIntFunctionWrapper(const char *ArgData, size_t ArgSize) {
71*bdd1243dSDimitry Andric   return WrapperFunction<rt::SPSRunAsIntFunctionSignature>::handle(
72*bdd1243dSDimitry Andric              ArgData, ArgSize,
73*bdd1243dSDimitry Andric              [](ExecutorAddr MainAddr, int32_t Arg) -> int32_t {
74*bdd1243dSDimitry Andric                return runAsIntFunction(MainAddr.toPtr<int32_t (*)(int32_t)>(),
75*bdd1243dSDimitry Andric                                        Arg);
76*bdd1243dSDimitry Andric              })
77*bdd1243dSDimitry Andric       .release();
78*bdd1243dSDimitry Andric }
79*bdd1243dSDimitry Andric 
addTo(StringMap<ExecutorAddr> & M)80349cc55cSDimitry Andric void addTo(StringMap<ExecutorAddr> &M) {
81349cc55cSDimitry Andric   M[rt::MemoryWriteUInt8sWrapperName] = ExecutorAddr::fromPtr(
82349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt8Write,
83349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt8Write>);
84349cc55cSDimitry Andric   M[rt::MemoryWriteUInt16sWrapperName] = ExecutorAddr::fromPtr(
85349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt16Write,
86349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt16Write>);
87349cc55cSDimitry Andric   M[rt::MemoryWriteUInt32sWrapperName] = ExecutorAddr::fromPtr(
88349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt32Write,
89349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt32Write>);
90349cc55cSDimitry Andric   M[rt::MemoryWriteUInt64sWrapperName] = ExecutorAddr::fromPtr(
91349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt64Write,
92349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt64Write>);
93349cc55cSDimitry Andric   M[rt::MemoryWriteBuffersWrapperName] =
94349cc55cSDimitry Andric       ExecutorAddr::fromPtr(&writeBuffersWrapper);
9504eeddc0SDimitry Andric   M[rt::RegisterEHFrameSectionWrapperName] =
9604eeddc0SDimitry Andric       ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionWrapper);
9704eeddc0SDimitry Andric   M[rt::DeregisterEHFrameSectionWrapperName] =
9804eeddc0SDimitry Andric       ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionWrapper);
99349cc55cSDimitry Andric   M[rt::RunAsMainWrapperName] = ExecutorAddr::fromPtr(&runAsMainWrapper);
100*bdd1243dSDimitry Andric   M[rt::RunAsVoidFunctionWrapperName] =
101*bdd1243dSDimitry Andric       ExecutorAddr::fromPtr(&runAsVoidFunctionWrapper);
102*bdd1243dSDimitry Andric   M[rt::RunAsIntFunctionWrapperName] =
103*bdd1243dSDimitry Andric       ExecutorAddr::fromPtr(&runAsIntFunctionWrapper);
104349cc55cSDimitry Andric }
105349cc55cSDimitry Andric 
106349cc55cSDimitry Andric } // end namespace rt_bootstrap
107349cc55cSDimitry Andric } // end namespace orc
108349cc55cSDimitry Andric } // end namespace llvm
109