110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner//===- JITMemoryManagerTest.cpp - Unit tests for the JIT memory manager ---===// 210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// 310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// The LLVM Compiler Infrastructure 410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// 510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// This file is distributed under the University of Illinois Open Source 610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// License. See LICENSE.TXT for details. 710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// 810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner//===----------------------------------------------------------------------===// 910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 1010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner#include "gtest/gtest.h" 1110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner#include "llvm/ADT/OwningPtr.h" 1210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner#include "llvm/ExecutionEngine/JITMemoryManager.h" 1310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner#include "llvm/DerivedTypes.h" 1410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner#include "llvm/Function.h" 1510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner#include "llvm/GlobalValue.h" 16f3523592b21af09a5a0032f8261f2f61c302fbd9Chris Lattner#include "llvm/LLVMContext.h" 17e817127e0a413bd934546b7d9b79a2b589c180b3Chris Lattner#include "llvm/ADT/ArrayRef.h" 1810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 1910b4fc552f984dc978298d50c09c97c0764962fcReid Klecknerusing namespace llvm; 2010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 2110b4fc552f984dc978298d50c09c97c0764962fcReid Klecknernamespace { 2210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 2310b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerFunction *makeFakeFunction() { 245fdd6c8793462549e3593890ec61573da06e3346Jay Foad std::vector<Type*> params; 25db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FTy = 261d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson FunctionType::get(Type::getVoidTy(getGlobalContext()), params, false); 2710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner return Function::Create(FTy, GlobalValue::ExternalLinkage); 2810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 2910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 3010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// Allocate three simple functions that fit in the initial slab. This exercises 3110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// the code in the case that we don't have to allocate more memory to store the 3210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// function bodies. 3310b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerTEST(JITMemoryManagerTest, NoAllocations) { 3410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<JITMemoryManager> MemMgr( 3510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner JITMemoryManager::CreateDefaultMemManager()); 3610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uintptr_t size; 3710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner std::string Error; 3810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 3910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Allocate the functions. 4010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F1(makeFakeFunction()); 4110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = 1024; 421e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody1 = MemMgr->startFunctionBody(F1.get(), size); 431e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody1, 0xFF, 1024); 441e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F1.get(), FunctionBody1, FunctionBody1 + 1024); 4510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 4610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 4710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F2(makeFakeFunction()); 4810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = 1024; 491e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody2 = MemMgr->startFunctionBody(F2.get(), size); 501e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody2, 0xFF, 1024); 511e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F2.get(), FunctionBody2, FunctionBody2 + 1024); 5210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 5310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 5410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F3(makeFakeFunction()); 5510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = 1024; 561e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody3 = MemMgr->startFunctionBody(F3.get(), size); 571e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody3, 0xFF, 1024); 581e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F3.get(), FunctionBody3, FunctionBody3 + 1024); 5910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 6010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 6110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Deallocate them out of order, in case that matters. 621e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody2); 6310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 641e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody1); 6510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 661e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody3); 6710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 6810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 6910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 7010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// Make three large functions that take up most of the space in the slab. Then 7110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// try allocating three smaller functions that don't require additional slabs. 7210b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerTEST(JITMemoryManagerTest, TestCodeAllocation) { 7310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<JITMemoryManager> MemMgr( 7410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner JITMemoryManager::CreateDefaultMemManager()); 7510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uintptr_t size; 7610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner std::string Error; 7710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 7810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Big functions are a little less than the largest block size. 7910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner const uintptr_t smallFuncSize = 1024; 8010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner const uintptr_t bigFuncSize = (MemMgr->GetDefaultCodeSlabSize() - 8110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner smallFuncSize * 2); 8210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 8310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Allocate big functions 8410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F1(makeFakeFunction()); 8510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = bigFuncSize; 861e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody1 = MemMgr->startFunctionBody(F1.get(), size); 8710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner ASSERT_LE(bigFuncSize, size); 881e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody1, 0xFF, bigFuncSize); 891e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F1.get(), FunctionBody1, FunctionBody1 + bigFuncSize); 9010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 9110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 9210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F2(makeFakeFunction()); 9310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = bigFuncSize; 941e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody2 = MemMgr->startFunctionBody(F2.get(), size); 9510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner ASSERT_LE(bigFuncSize, size); 961e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody2, 0xFF, bigFuncSize); 971e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F2.get(), FunctionBody2, FunctionBody2 + bigFuncSize); 9810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 9910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 10010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F3(makeFakeFunction()); 10110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = bigFuncSize; 1021e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody3 = MemMgr->startFunctionBody(F3.get(), size); 10310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner ASSERT_LE(bigFuncSize, size); 1041e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody3, 0xFF, bigFuncSize); 1051e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F3.get(), FunctionBody3, FunctionBody3 + bigFuncSize); 10610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 10710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 10810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Check that each large function took it's own slab. 10910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(3U, MemMgr->GetNumCodeSlabs()); 11010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 11110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Allocate small functions 11210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F4(makeFakeFunction()); 11310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = smallFuncSize; 1141e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody4 = MemMgr->startFunctionBody(F4.get(), size); 11510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner ASSERT_LE(smallFuncSize, size); 1161e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody4, 0xFF, smallFuncSize); 1171e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F4.get(), FunctionBody4, 1181e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin FunctionBody4 + smallFuncSize); 11910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 12010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 12110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F5(makeFakeFunction()); 12210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = smallFuncSize; 1231e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody5 = MemMgr->startFunctionBody(F5.get(), size); 12410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner ASSERT_LE(smallFuncSize, size); 1251e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody5, 0xFF, smallFuncSize); 1261e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F5.get(), FunctionBody5, 1271e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin FunctionBody5 + smallFuncSize); 12810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 12910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 13010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<Function> F6(makeFakeFunction()); 13110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size = smallFuncSize; 1321e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin uint8_t *FunctionBody6 = MemMgr->startFunctionBody(F6.get(), size); 13310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner ASSERT_LE(smallFuncSize, size); 1341e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin memset(FunctionBody6, 0xFF, smallFuncSize); 1351e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->endFunctionBody(F6.get(), FunctionBody6, 1361e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin FunctionBody6 + smallFuncSize); 13710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 13810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 13910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Check that the small functions didn't allocate any new slabs. 14010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(3U, MemMgr->GetNumCodeSlabs()); 14110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 14210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Deallocate them out of order, in case that matters. 1431e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody2); 14410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 1451e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody1); 14610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 1471e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody4); 14810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 1491e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody3); 15010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 1511e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody5); 15210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 1531e8613212286a8066001c8a3f516da89d250e05dJeffrey Yasskin MemMgr->deallocateFunctionBody(FunctionBody6); 15410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_TRUE(MemMgr->CheckInvariants(Error)) << Error; 15510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 15610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 15710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// Allocate five global ints of varying widths and alignment, and check their 15810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// alignment and overlap. 15910b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerTEST(JITMemoryManagerTest, TestSmallGlobalInts) { 16010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<JITMemoryManager> MemMgr( 16110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner JITMemoryManager::CreateDefaultMemManager()); 16210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint8_t *a = (uint8_t *)MemMgr->allocateGlobal(8, 0); 16310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint16_t *b = (uint16_t*)MemMgr->allocateGlobal(16, 2); 16410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint32_t *c = (uint32_t*)MemMgr->allocateGlobal(32, 4); 16510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint64_t *d = (uint64_t*)MemMgr->allocateGlobal(64, 8); 16610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 16710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Check the alignment. 16810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, ((uintptr_t)b) & 0x1); 16910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, ((uintptr_t)c) & 0x3); 17010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, ((uintptr_t)d) & 0x7); 17110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 17210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Initialize them each one at a time and make sure they don't overlap. 17310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *a = 0xff; 17410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *b = 0U; 17510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *c = 0U; 17610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *d = 0U; 17710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0xffU, *a); 17810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *b); 17910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *c); 18010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *d); 18110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *a = 0U; 18210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *b = 0xffffU; 18310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *a); 18410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0xffffU, *b); 18510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *c); 18610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *d); 18710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *b = 0U; 18810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *c = 0xffffffffU; 18910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *a); 19010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *b); 19110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0xffffffffU, *c); 19210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *d); 19310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner *c = 0U; 194535c9c3c9dda57c8aa2d96403864c57a55cd1bf3Reid Kleckner *d = 0xffffffffffffffffULL; 19510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *a); 19610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *b); 19710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, *c); 198535c9c3c9dda57c8aa2d96403864c57a55cd1bf3Reid Kleckner EXPECT_EQ(0xffffffffffffffffULL, *d); 19910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 20010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Make sure we didn't allocate any extra slabs for this tiny amount of data. 20110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(1U, MemMgr->GetNumDataSlabs()); 20210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 20310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 20410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// Allocate a small global, a big global, and a third global, and make sure we 20510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// only use two slabs for that. 20610b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerTEST(JITMemoryManagerTest, TestLargeGlobalArray) { 20710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<JITMemoryManager> MemMgr( 20810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner JITMemoryManager::CreateDefaultMemManager()); 20910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size_t Size = 4 * MemMgr->GetDefaultDataSlabSize(); 21010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint64_t *a = (uint64_t*)MemMgr->allocateGlobal(64, 8); 21110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint8_t *g = MemMgr->allocateGlobal(Size, 8); 21210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner uint64_t *b = (uint64_t*)MemMgr->allocateGlobal(64, 8); 21310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 21410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Check the alignment. 21510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, ((uintptr_t)a) & 0x7); 21610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, ((uintptr_t)g) & 0x7); 21710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0U, ((uintptr_t)b) & 0x7); 21810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 21910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Initialize them to make sure we don't segfault and make sure they don't 22010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // overlap. 22110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner memset(a, 0x1, 8); 22210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner memset(g, 0x2, Size); 22310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner memset(b, 0x3, 8); 224535c9c3c9dda57c8aa2d96403864c57a55cd1bf3Reid Kleckner EXPECT_EQ(0x0101010101010101ULL, *a); 22510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Just check the edges. 22610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0x02U, g[0]); 22710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(0x02U, g[Size - 1]); 228535c9c3c9dda57c8aa2d96403864c57a55cd1bf3Reid Kleckner EXPECT_EQ(0x0303030303030303ULL, *b); 22910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 23010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // Check the number of slabs. 23110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(2U, MemMgr->GetNumDataSlabs()); 23210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 23310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 23410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// Allocate lots of medium globals so that we can test moving the bump allocator 23510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// to a new slab. 23610b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerTEST(JITMemoryManagerTest, TestManyGlobals) { 23710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<JITMemoryManager> MemMgr( 23810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner JITMemoryManager::CreateDefaultMemManager()); 23910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size_t SlabSize = MemMgr->GetDefaultDataSlabSize(); 24010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size_t Size = 128; 24110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner int Iters = (SlabSize / Size) + 1; 24210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 243f3a3b0fc0e6be9c45add0aa6624f0cb900548dccBenjamin Kramer // We should start with no slabs. 244f3a3b0fc0e6be9c45add0aa6624f0cb900548dccBenjamin Kramer EXPECT_EQ(0U, MemMgr->GetNumDataSlabs()); 24510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 24610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // After allocating a bunch of globals, we should have two. 24710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner for (int I = 0; I < Iters; ++I) 24810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner MemMgr->allocateGlobal(Size, 8); 24910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(2U, MemMgr->GetNumDataSlabs()); 25010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 25110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // And after much more, we should have three. 25210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner for (int I = 0; I < Iters; ++I) 25310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner MemMgr->allocateGlobal(Size, 8); 25410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(3U, MemMgr->GetNumDataSlabs()); 25510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 25610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 25710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// Allocate lots of function stubs so that we can test moving the stub bump 25810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner// allocator to a new slab. 25910b4fc552f984dc978298d50c09c97c0764962fcReid KlecknerTEST(JITMemoryManagerTest, TestManyStubs) { 26010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner OwningPtr<JITMemoryManager> MemMgr( 26110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner JITMemoryManager::CreateDefaultMemManager()); 26210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size_t SlabSize = MemMgr->GetDefaultStubSlabSize(); 26310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner size_t Size = 128; 26410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner int Iters = (SlabSize / Size) + 1; 26510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 266f3a3b0fc0e6be9c45add0aa6624f0cb900548dccBenjamin Kramer // We should start with no slabs. 267f3a3b0fc0e6be9c45add0aa6624f0cb900548dccBenjamin Kramer EXPECT_EQ(0U, MemMgr->GetNumDataSlabs()); 26810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 26910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // After allocating a bunch of stubs, we should have two. 27010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner for (int I = 0; I < Iters; ++I) 27110b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner MemMgr->allocateStub(NULL, Size, 8); 27210b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(2U, MemMgr->GetNumStubSlabs()); 27310b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 27410b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner // And after much more, we should have three. 27510b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner for (int I = 0; I < Iters; ++I) 27610b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner MemMgr->allocateStub(NULL, Size, 8); 27710b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner EXPECT_EQ(3U, MemMgr->GetNumStubSlabs()); 27810b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 27910b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner 28010b4fc552f984dc978298d50c09c97c0764962fcReid Kleckner} 281