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