//===------------------------ OrcRTBootstrap.cpp --------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "OrcRTBootstrap.h" #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h" #define DEBUG_TYPE "orc" using namespace llvm::orc::shared; namespace llvm { namespace orc { namespace rt_bootstrap { template static llvm::orc::shared::CWrapperFunctionResult writeUIntsWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction)>::handle( ArgData, ArgSize, [](std::vector Ws) { for (auto &W : Ws) *W.Addr.template toPtr() = W.Value; }) .release(); } static llvm::orc::shared::CWrapperFunctionResult writePointersWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction)>:: handle(ArgData, ArgSize, [](std::vector Ws) { for (auto &W : Ws) *W.Addr.template toPtr() = W.Value.template toPtr(); }) .release(); } static llvm::orc::shared::CWrapperFunctionResult writeBuffersWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction)>::handle( ArgData, ArgSize, [](std::vector Ws) { for (auto &W : Ws) memcpy(W.Addr.template toPtr(), W.Buffer.data(), W.Buffer.size()); }) .release(); } template static llvm::orc::shared::CWrapperFunctionResult readUIntsWrapper(const char *ArgData, size_t ArgSize) { using SPSSig = SPSSequence(SPSSequence); return WrapperFunction::handle(ArgData, ArgSize, [](std::vector Rs) { std::vector Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back( *R.toPtr()); return Result; }) .release(); } static llvm::orc::shared::CWrapperFunctionResult readPointersWrapper(const char *ArgData, size_t ArgSize) { using SPSSig = SPSSequence(SPSSequence); return WrapperFunction::handle( ArgData, ArgSize, [](std::vector Rs) { std::vector Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back(ExecutorAddr::fromPtr(*R.toPtr())); return Result; }) .release(); } static llvm::orc::shared::CWrapperFunctionResult readBuffersWrapper(const char *ArgData, size_t ArgSize) { using SPSSig = SPSSequence>(SPSSequence); return WrapperFunction::handle( ArgData, ArgSize, [](std::vector Rs) { std::vector> Result; Result.reserve(Rs.size()); for (auto &R : Rs) { Result.push_back({}); Result.back().resize(R.size()); memcpy(reinterpret_cast(Result.back().data()), R.Start.toPtr(), R.size()); } return Result; }) .release(); } static llvm::orc::shared::CWrapperFunctionResult readStringsWrapper(const char *ArgData, size_t ArgSize) { using SPSSig = SPSSequence(SPSSequence); return WrapperFunction::handle(ArgData, ArgSize, [](std::vector Rs) { std::vector Result; Result.reserve(Rs.size()); for (auto &R : Rs) Result.push_back( R.toPtr()); return Result; }) .release(); } static llvm::orc::shared::CWrapperFunctionResult runAsMainWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction::handle( ArgData, ArgSize, [](ExecutorAddr MainAddr, std::vector Args) -> int64_t { return runAsMain(MainAddr.toPtr(), Args); }) .release(); } static llvm::orc::shared::CWrapperFunctionResult runAsVoidFunctionWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction::handle( ArgData, ArgSize, [](ExecutorAddr MainAddr) -> int32_t { return runAsVoidFunction(MainAddr.toPtr()); }) .release(); } static llvm::orc::shared::CWrapperFunctionResult runAsIntFunctionWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction::handle( ArgData, ArgSize, [](ExecutorAddr MainAddr, int32_t Arg) -> int32_t { return runAsIntFunction(MainAddr.toPtr(), Arg); }) .release(); } void addTo(StringMap &M) { M[rt::MemoryWriteUInt8sWrapperName] = ExecutorAddr::fromPtr( &writeUIntsWrapper); M[rt::MemoryWriteUInt16sWrapperName] = ExecutorAddr::fromPtr( &writeUIntsWrapper); M[rt::MemoryWriteUInt32sWrapperName] = ExecutorAddr::fromPtr( &writeUIntsWrapper); M[rt::MemoryWriteUInt64sWrapperName] = ExecutorAddr::fromPtr( &writeUIntsWrapper); M[rt::MemoryWritePointersWrapperName] = ExecutorAddr::fromPtr(&writePointersWrapper); M[rt::MemoryWriteBuffersWrapperName] = ExecutorAddr::fromPtr(&writeBuffersWrapper); M[rt::MemoryReadUInt8sWrapperName] = ExecutorAddr::fromPtr(&readUIntsWrapper); M[rt::MemoryReadUInt16sWrapperName] = ExecutorAddr::fromPtr(&readUIntsWrapper); M[rt::MemoryReadUInt32sWrapperName] = ExecutorAddr::fromPtr(&readUIntsWrapper); M[rt::MemoryReadUInt64sWrapperName] = ExecutorAddr::fromPtr(&readUIntsWrapper); M[rt::MemoryReadPointersWrapperName] = ExecutorAddr::fromPtr(&readPointersWrapper); M[rt::MemoryReadBuffersWrapperName] = ExecutorAddr::fromPtr(&readBuffersWrapper); M[rt::MemoryReadStringsWrapperName] = ExecutorAddr::fromPtr(&readStringsWrapper); M[rt::RunAsMainWrapperName] = ExecutorAddr::fromPtr(&runAsMainWrapper); M[rt::RunAsVoidFunctionWrapperName] = ExecutorAddr::fromPtr(&runAsVoidFunctionWrapper); M[rt::RunAsIntFunctionWrapperName] = ExecutorAddr::fromPtr(&runAsIntFunctionWrapper); } } // end namespace rt_bootstrap } // end namespace orc } // end namespace llvm