17f99337fSLang Hames //===- EPCGenericMemoryAccessTest.cpp -- Tests for EPCGenericMemoryAccess -===//
27f99337fSLang Hames //
37f99337fSLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47f99337fSLang Hames // See https://llvm.org/LICENSE.txt for license information.
57f99337fSLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67f99337fSLang Hames //
77f99337fSLang Hames //===----------------------------------------------------------------------===//
87f99337fSLang Hames 
97f99337fSLang Hames #include "OrcTestCommon.h"
107f99337fSLang Hames 
117f99337fSLang Hames #include "llvm/ExecutionEngine/Orc/EPCGenericMemoryAccess.h"
127f99337fSLang Hames #include "llvm/Testing/Support/Error.h"
137f99337fSLang Hames 
147f99337fSLang Hames using namespace llvm;
157f99337fSLang Hames using namespace llvm::orc;
167f99337fSLang Hames using namespace llvm::orc::shared;
177f99337fSLang Hames 
187f99337fSLang Hames namespace {
197f99337fSLang Hames 
207f99337fSLang Hames template <typename WriteT, typename SPSWriteT>
testWriteUInts(const char * ArgData,size_t ArgSize)21*213666f8SLang Hames llvm::orc::shared::CWrapperFunctionResult testWriteUInts(const char *ArgData,
22*213666f8SLang Hames                                                          size_t ArgSize) {
237f99337fSLang Hames   return WrapperFunction<void(SPSSequence<SPSWriteT>)>::handle(
247f99337fSLang Hames              ArgData, ArgSize,
257f99337fSLang Hames              [](std::vector<WriteT> Ws) {
267f99337fSLang Hames                for (auto &W : Ws)
27999c6a23SLang Hames                  *W.Addr.template toPtr<decltype(W.Value) *>() = W.Value;
287f99337fSLang Hames              })
297f99337fSLang Hames       .release();
307f99337fSLang Hames }
317f99337fSLang Hames 
testWriteBuffers(const char * ArgData,size_t ArgSize)32*213666f8SLang Hames llvm::orc::shared::CWrapperFunctionResult testWriteBuffers(const char *ArgData,
33*213666f8SLang Hames                                                            size_t ArgSize) {
347f99337fSLang Hames   return WrapperFunction<void(SPSSequence<SPSMemoryAccessBufferWrite>)>::handle(
357f99337fSLang Hames              ArgData, ArgSize,
367f99337fSLang Hames              [](std::vector<tpctypes::BufferWrite> Ws) {
377f99337fSLang Hames                for (auto &W : Ws)
38999c6a23SLang Hames                  memcpy(W.Addr.template toPtr<char *>(), W.Buffer.data(),
39999c6a23SLang Hames                         W.Buffer.size());
407f99337fSLang Hames              })
417f99337fSLang Hames       .release();
427f99337fSLang Hames }
437f99337fSLang Hames 
TEST(EPCGenericMemoryAccessTest,MemWrites)447f99337fSLang Hames TEST(EPCGenericMemoryAccessTest, MemWrites) {
457f99337fSLang Hames   auto SelfEPC = cantFail(SelfExecutorProcessControl::Create());
467f99337fSLang Hames 
477f99337fSLang Hames   EPCGenericMemoryAccess::FuncAddrs FAs;
48ef391df2SLang Hames   FAs.WriteUInt8s = ExecutorAddr::fromPtr(
497f99337fSLang Hames       &testWriteUInts<tpctypes::UInt8Write, SPSMemoryAccessUInt8Write>);
50ef391df2SLang Hames   FAs.WriteUInt16s = ExecutorAddr::fromPtr(
517f99337fSLang Hames       &testWriteUInts<tpctypes::UInt16Write, SPSMemoryAccessUInt16Write>);
52ef391df2SLang Hames   FAs.WriteUInt32s = ExecutorAddr::fromPtr(
537f99337fSLang Hames       &testWriteUInts<tpctypes::UInt32Write, SPSMemoryAccessUInt32Write>);
54ef391df2SLang Hames   FAs.WriteUInt64s = ExecutorAddr::fromPtr(
557f99337fSLang Hames       &testWriteUInts<tpctypes::UInt64Write, SPSMemoryAccessUInt64Write>);
56ef391df2SLang Hames   FAs.WriteBuffers = ExecutorAddr::fromPtr(&testWriteBuffers);
577f99337fSLang Hames 
587f99337fSLang Hames   auto MemAccess = std::make_unique<EPCGenericMemoryAccess>(*SelfEPC, FAs);
597f99337fSLang Hames 
607f99337fSLang Hames   uint8_t Test_UInt8_1 = 0;
617f99337fSLang Hames   uint8_t Test_UInt8_2 = 0;
627f99337fSLang Hames   uint16_t Test_UInt16 = 0;
637f99337fSLang Hames   uint32_t Test_UInt32 = 0;
647f99337fSLang Hames   uint64_t Test_UInt64 = 0;
657f99337fSLang Hames   char Test_Buffer[21];
667f99337fSLang Hames 
67999c6a23SLang Hames   auto Err1 =
68999c6a23SLang Hames       MemAccess->writeUInt8s({{ExecutorAddr::fromPtr(&Test_UInt8_1), 1},
69999c6a23SLang Hames                               {ExecutorAddr::fromPtr(&Test_UInt8_2), 0xFE}});
707f99337fSLang Hames 
717f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err1), Succeeded());
727f99337fSLang Hames   EXPECT_EQ(Test_UInt8_1, 1U);
737f99337fSLang Hames   EXPECT_EQ(Test_UInt8_2, 0xFE);
747f99337fSLang Hames 
757f99337fSLang Hames   auto Err2 =
76999c6a23SLang Hames       MemAccess->writeUInt16s({{ExecutorAddr::fromPtr(&Test_UInt16), 1}});
777f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err2), Succeeded());
787f99337fSLang Hames   EXPECT_EQ(Test_UInt16, 1U);
797f99337fSLang Hames 
807f99337fSLang Hames   auto Err3 =
81999c6a23SLang Hames       MemAccess->writeUInt32s({{ExecutorAddr::fromPtr(&Test_UInt32), 1}});
827f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err3), Succeeded());
837f99337fSLang Hames   EXPECT_EQ(Test_UInt32, 1U);
847f99337fSLang Hames 
857f99337fSLang Hames   auto Err4 =
86999c6a23SLang Hames       MemAccess->writeUInt64s({{ExecutorAddr::fromPtr(&Test_UInt64), 1}});
877f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err4), Succeeded());
887f99337fSLang Hames   EXPECT_EQ(Test_UInt64, 1U);
897f99337fSLang Hames 
907f99337fSLang Hames   StringRef TestMsg("test-message");
91999c6a23SLang Hames   auto Err5 =
92999c6a23SLang Hames       MemAccess->writeBuffers({{ExecutorAddr::fromPtr(&Test_Buffer), TestMsg}});
937f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err5), Succeeded());
947f99337fSLang Hames   EXPECT_EQ(StringRef(Test_Buffer, TestMsg.size()), TestMsg);
95adf55ac6SLang Hames 
96adf55ac6SLang Hames   cantFail(SelfEPC->disconnect());
977f99337fSLang Hames }
987f99337fSLang Hames 
997f99337fSLang Hames } // namespace
100