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