xref: /llvm-project/llvm/unittests/ExecutionEngine/Orc/SimpleExecutorMemoryManagerTest.cpp (revision d3d9f7caf96680dad4ef0fd108e64ca044a0a113)
178b083dbSLang Hames //===---------------- SimpleExecutorMemoryManagerTest.cpp -----------------===//
278b083dbSLang Hames //
378b083dbSLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
478b083dbSLang Hames // See https://llvm.org/LICENSE.txt for license information.
578b083dbSLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
678b083dbSLang Hames //
778b083dbSLang Hames //===----------------------------------------------------------------------===//
878b083dbSLang Hames 
978b083dbSLang Hames #include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h"
1078b083dbSLang Hames #include "llvm/Testing/Support/Error.h"
1178b083dbSLang Hames #include "gtest/gtest.h"
1278b083dbSLang Hames 
1378b083dbSLang Hames #include <limits>
1478b083dbSLang Hames #include <vector>
1578b083dbSLang Hames 
1678b083dbSLang Hames using namespace llvm;
1778b083dbSLang Hames using namespace llvm::orc;
1878b083dbSLang Hames using namespace llvm::orc::shared;
1978b083dbSLang Hames using namespace llvm::orc::rt_bootstrap;
2078b083dbSLang Hames 
2178b083dbSLang Hames namespace {
2278b083dbSLang Hames 
incrementWrapper(const char * ArgData,size_t ArgSize)23213666f8SLang Hames orc::shared::CWrapperFunctionResult incrementWrapper(const char *ArgData,
24213666f8SLang Hames                                                      size_t ArgSize) {
25089acf25SLang Hames   return WrapperFunction<SPSError(SPSExecutorAddr)>::handle(
26089acf25SLang Hames              ArgData, ArgSize,
27089acf25SLang Hames              [](ExecutorAddr A) -> Error {
28089acf25SLang Hames                *A.toPtr<int *>() += 1;
29089acf25SLang Hames                return Error::success();
30089acf25SLang Hames              })
3178b083dbSLang Hames       .release();
3278b083dbSLang Hames }
3378b083dbSLang Hames 
TEST(SimpleExecutorMemoryManagerTest,AllocFinalizeFree)3478b083dbSLang Hames TEST(SimpleExecutorMemoryManagerTest, AllocFinalizeFree) {
3578b083dbSLang Hames   SimpleExecutorMemoryManager MemMgr;
3678b083dbSLang Hames 
3778b083dbSLang Hames   constexpr unsigned AllocSize = 16384;
3878b083dbSLang Hames   auto Mem = MemMgr.allocate(AllocSize);
3978b083dbSLang Hames   EXPECT_THAT_ERROR(Mem.takeError(), Succeeded());
4078b083dbSLang Hames 
4178b083dbSLang Hames   std::string HW = "Hello, world!";
4278b083dbSLang Hames 
4378b083dbSLang Hames   int FinalizeCounter = 0;
4478b083dbSLang Hames   int DeallocateCounter = 0;
4578b083dbSLang Hames 
4678b083dbSLang Hames   tpctypes::FinalizeRequest FR;
4778b083dbSLang Hames   FR.Segments.push_back(
48*d3d9f7caSLang Hames       tpctypes::SegFinalizeRequest{MemProt::Read | MemProt::Write,
4978b083dbSLang Hames                                    *Mem,
5078b083dbSLang Hames                                    AllocSize,
5178b083dbSLang Hames                                    {HW.data(), HW.size() + 1}});
5278b083dbSLang Hames   FR.Actions.push_back(
5378b083dbSLang Hames       {/* Finalize: */
54089acf25SLang Hames        cantFail(WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddr>>(
55089acf25SLang Hames            ExecutorAddr::fromPtr(incrementWrapper),
56089acf25SLang Hames            ExecutorAddr::fromPtr(&FinalizeCounter))),
5778b083dbSLang Hames        /*  Deallocate: */
58089acf25SLang Hames        cantFail(WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddr>>(
59089acf25SLang Hames            ExecutorAddr::fromPtr(incrementWrapper),
60089acf25SLang Hames            ExecutorAddr::fromPtr(&DeallocateCounter)))});
6178b083dbSLang Hames 
6278b083dbSLang Hames   EXPECT_EQ(FinalizeCounter, 0);
6378b083dbSLang Hames   EXPECT_EQ(DeallocateCounter, 0);
6478b083dbSLang Hames 
6578b083dbSLang Hames   auto FinalizeErr = MemMgr.finalize(FR);
6678b083dbSLang Hames   EXPECT_THAT_ERROR(std::move(FinalizeErr), Succeeded());
6778b083dbSLang Hames 
6878b083dbSLang Hames   EXPECT_EQ(FinalizeCounter, 1);
6978b083dbSLang Hames   EXPECT_EQ(DeallocateCounter, 0);
7078b083dbSLang Hames 
7178b083dbSLang Hames   EXPECT_EQ(HW, std::string(Mem->toPtr<const char *>()));
7278b083dbSLang Hames 
7378b083dbSLang Hames   auto DeallocateErr = MemMgr.deallocate({*Mem});
7478b083dbSLang Hames   EXPECT_THAT_ERROR(std::move(DeallocateErr), Succeeded());
7578b083dbSLang Hames 
7678b083dbSLang Hames   EXPECT_EQ(FinalizeCounter, 1);
7778b083dbSLang Hames   EXPECT_EQ(DeallocateCounter, 1);
7878b083dbSLang Hames }
7978b083dbSLang Hames 
8078b083dbSLang Hames } // namespace
81