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