xref: /freebsd-src/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
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
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
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
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 
59349cc55cSDimitry Andric void addTo(StringMap<ExecutorAddr> &M) {
60349cc55cSDimitry Andric   M[rt::MemoryWriteUInt8sWrapperName] = ExecutorAddr::fromPtr(
61349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt8Write,
62349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt8Write>);
63349cc55cSDimitry Andric   M[rt::MemoryWriteUInt16sWrapperName] = ExecutorAddr::fromPtr(
64349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt16Write,
65349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt16Write>);
66349cc55cSDimitry Andric   M[rt::MemoryWriteUInt32sWrapperName] = ExecutorAddr::fromPtr(
67349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt32Write,
68349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt32Write>);
69349cc55cSDimitry Andric   M[rt::MemoryWriteUInt64sWrapperName] = ExecutorAddr::fromPtr(
70349cc55cSDimitry Andric       &writeUIntsWrapper<tpctypes::UInt64Write,
71349cc55cSDimitry Andric                          shared::SPSMemoryAccessUInt64Write>);
72349cc55cSDimitry Andric   M[rt::MemoryWriteBuffersWrapperName] =
73349cc55cSDimitry Andric       ExecutorAddr::fromPtr(&writeBuffersWrapper);
74*04eeddc0SDimitry Andric   M[rt::RegisterEHFrameSectionWrapperName] =
75*04eeddc0SDimitry Andric       ExecutorAddr::fromPtr(&llvm_orc_registerEHFrameSectionWrapper);
76*04eeddc0SDimitry Andric   M[rt::DeregisterEHFrameSectionWrapperName] =
77*04eeddc0SDimitry Andric       ExecutorAddr::fromPtr(&llvm_orc_deregisterEHFrameSectionWrapper);
78349cc55cSDimitry Andric   M[rt::RunAsMainWrapperName] = ExecutorAddr::fromPtr(&runAsMainWrapper);
79349cc55cSDimitry Andric }
80349cc55cSDimitry Andric 
81349cc55cSDimitry Andric } // end namespace rt_bootstrap
82349cc55cSDimitry Andric } // end namespace orc
83349cc55cSDimitry Andric } // end namespace llvm
84