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