xref: /llvm-project/llvm/unittests/ExecutionEngine/Orc/EPCGenericMemoryAccessTest.cpp (revision 209c242845e56eb8dbbde5e380b165d261769266)
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)21213666f8SLang Hames llvm::orc::shared::CWrapperFunctionResult testWriteUInts(const char *ArgData,
22213666f8SLang 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)32213666f8SLang Hames llvm::orc::shared::CWrapperFunctionResult testWriteBuffers(const char *ArgData,
33213666f8SLang 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 
testWritePointers(const char * ArgData,size_t ArgSize)44*209c2428SSunho Kim llvm::orc::shared::CWrapperFunctionResult testWritePointers(const char *ArgData,
45*209c2428SSunho Kim                                                             size_t ArgSize) {
46*209c2428SSunho Kim   return WrapperFunction<void(SPSSequence<SPSMemoryAccessPointerWrite>)>::
47*209c2428SSunho Kim       handle(ArgData, ArgSize,
48*209c2428SSunho Kim              [](std::vector<tpctypes::PointerWrite> Ws) {
49*209c2428SSunho Kim                for (auto &W : Ws)
50*209c2428SSunho Kim                  *W.Addr.template toPtr<uint64_t *>() = W.Value.getValue();
51*209c2428SSunho Kim              })
52*209c2428SSunho Kim           .release();
53*209c2428SSunho Kim }
54*209c2428SSunho Kim 
TEST(EPCGenericMemoryAccessTest,MemWrites)557f99337fSLang Hames TEST(EPCGenericMemoryAccessTest, MemWrites) {
567f99337fSLang Hames   auto SelfEPC = cantFail(SelfExecutorProcessControl::Create());
577f99337fSLang Hames 
587f99337fSLang Hames   EPCGenericMemoryAccess::FuncAddrs FAs;
59ef391df2SLang Hames   FAs.WriteUInt8s = ExecutorAddr::fromPtr(
607f99337fSLang Hames       &testWriteUInts<tpctypes::UInt8Write, SPSMemoryAccessUInt8Write>);
61ef391df2SLang Hames   FAs.WriteUInt16s = ExecutorAddr::fromPtr(
627f99337fSLang Hames       &testWriteUInts<tpctypes::UInt16Write, SPSMemoryAccessUInt16Write>);
63ef391df2SLang Hames   FAs.WriteUInt32s = ExecutorAddr::fromPtr(
647f99337fSLang Hames       &testWriteUInts<tpctypes::UInt32Write, SPSMemoryAccessUInt32Write>);
65ef391df2SLang Hames   FAs.WriteUInt64s = ExecutorAddr::fromPtr(
667f99337fSLang Hames       &testWriteUInts<tpctypes::UInt64Write, SPSMemoryAccessUInt64Write>);
67ef391df2SLang Hames   FAs.WriteBuffers = ExecutorAddr::fromPtr(&testWriteBuffers);
68*209c2428SSunho Kim   FAs.WritePointers = ExecutorAddr::fromPtr(&testWritePointers);
697f99337fSLang Hames 
707f99337fSLang Hames   auto MemAccess = std::make_unique<EPCGenericMemoryAccess>(*SelfEPC, FAs);
717f99337fSLang Hames 
727f99337fSLang Hames   uint8_t Test_UInt8_1 = 0;
737f99337fSLang Hames   uint8_t Test_UInt8_2 = 0;
747f99337fSLang Hames   uint16_t Test_UInt16 = 0;
757f99337fSLang Hames   uint32_t Test_UInt32 = 0;
767f99337fSLang Hames   uint64_t Test_UInt64 = 0;
77*209c2428SSunho Kim   uint64_t Test_Pointer = 0;
787f99337fSLang Hames   char Test_Buffer[21];
797f99337fSLang Hames 
80999c6a23SLang Hames   auto Err1 =
81999c6a23SLang Hames       MemAccess->writeUInt8s({{ExecutorAddr::fromPtr(&Test_UInt8_1), 1},
82999c6a23SLang Hames                               {ExecutorAddr::fromPtr(&Test_UInt8_2), 0xFE}});
837f99337fSLang Hames 
847f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err1), Succeeded());
857f99337fSLang Hames   EXPECT_EQ(Test_UInt8_1, 1U);
867f99337fSLang Hames   EXPECT_EQ(Test_UInt8_2, 0xFE);
877f99337fSLang Hames 
887f99337fSLang Hames   auto Err2 =
89999c6a23SLang Hames       MemAccess->writeUInt16s({{ExecutorAddr::fromPtr(&Test_UInt16), 1}});
907f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err2), Succeeded());
917f99337fSLang Hames   EXPECT_EQ(Test_UInt16, 1U);
927f99337fSLang Hames 
937f99337fSLang Hames   auto Err3 =
94999c6a23SLang Hames       MemAccess->writeUInt32s({{ExecutorAddr::fromPtr(&Test_UInt32), 1}});
957f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err3), Succeeded());
967f99337fSLang Hames   EXPECT_EQ(Test_UInt32, 1U);
977f99337fSLang Hames 
987f99337fSLang Hames   auto Err4 =
99999c6a23SLang Hames       MemAccess->writeUInt64s({{ExecutorAddr::fromPtr(&Test_UInt64), 1}});
1007f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err4), Succeeded());
1017f99337fSLang Hames   EXPECT_EQ(Test_UInt64, 1U);
1027f99337fSLang Hames 
1037f99337fSLang Hames   StringRef TestMsg("test-message");
104999c6a23SLang Hames   auto Err5 =
105999c6a23SLang Hames       MemAccess->writeBuffers({{ExecutorAddr::fromPtr(&Test_Buffer), TestMsg}});
1067f99337fSLang Hames   EXPECT_THAT_ERROR(std::move(Err5), Succeeded());
1077f99337fSLang Hames   EXPECT_EQ(StringRef(Test_Buffer, TestMsg.size()), TestMsg);
108adf55ac6SLang Hames 
109*209c2428SSunho Kim   auto Err6 = MemAccess->writePointers(
110*209c2428SSunho Kim       {{ExecutorAddr::fromPtr(&Test_Pointer), ExecutorAddr(1U)}});
111*209c2428SSunho Kim   EXPECT_THAT_ERROR(std::move(Err6), Succeeded());
112*209c2428SSunho Kim   EXPECT_EQ(Test_Pointer, 1U);
113*209c2428SSunho Kim 
114adf55ac6SLang Hames   cantFail(SelfEPC->disconnect());
1157f99337fSLang Hames }
1167f99337fSLang Hames 
1177f99337fSLang Hames } // namespace
118