//===---------------- SimpleExecutorMemoryManagerTest.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 "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" #include #include using namespace llvm; using namespace llvm::orc; using namespace llvm::orc::shared; using namespace llvm::orc::rt_bootstrap; namespace { orc::shared::CWrapperFunctionResult incrementWrapper(const char *ArgData, size_t ArgSize) { return WrapperFunction::handle( ArgData, ArgSize, [](ExecutorAddr A) -> Error { *A.toPtr() += 1; return Error::success(); }) .release(); } TEST(SimpleExecutorMemoryManagerTest, AllocFinalizeFree) { SimpleExecutorMemoryManager MemMgr; constexpr unsigned AllocSize = 16384; auto Mem = MemMgr.allocate(AllocSize); EXPECT_THAT_ERROR(Mem.takeError(), Succeeded()); std::string HW = "Hello, world!"; int FinalizeCounter = 0; int DeallocateCounter = 0; tpctypes::FinalizeRequest FR; FR.Segments.push_back( tpctypes::SegFinalizeRequest{MemProt::Read | MemProt::Write, *Mem, AllocSize, {HW.data(), HW.size() + 1}}); FR.Actions.push_back( {/* Finalize: */ cantFail(WrapperFunctionCall::Create>( ExecutorAddr::fromPtr(incrementWrapper), ExecutorAddr::fromPtr(&FinalizeCounter))), /* Deallocate: */ cantFail(WrapperFunctionCall::Create>( ExecutorAddr::fromPtr(incrementWrapper), ExecutorAddr::fromPtr(&DeallocateCounter)))}); EXPECT_EQ(FinalizeCounter, 0); EXPECT_EQ(DeallocateCounter, 0); auto FinalizeErr = MemMgr.finalize(FR); EXPECT_THAT_ERROR(std::move(FinalizeErr), Succeeded()); EXPECT_EQ(FinalizeCounter, 1); EXPECT_EQ(DeallocateCounter, 0); EXPECT_EQ(HW, std::string(Mem->toPtr())); auto DeallocateErr = MemMgr.deallocate({*Mem}); EXPECT_THAT_ERROR(std::move(DeallocateErr), Succeeded()); EXPECT_EQ(FinalizeCounter, 1); EXPECT_EQ(DeallocateCounter, 1); } } // namespace