1ab5ba51aSAndrew Kaylor //===- MCJITMemoryManagerTest.cpp - Unit tests for the JIT memory manager -===//
2ab5ba51aSAndrew Kaylor //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ab5ba51aSAndrew Kaylor //
7ab5ba51aSAndrew Kaylor //===----------------------------------------------------------------------===//
8ab5ba51aSAndrew Kaylor
9ab5ba51aSAndrew Kaylor #include "llvm/ExecutionEngine/SectionMemoryManager.h"
10130cec21SChandler Carruth #include "gtest/gtest.h"
11ab5ba51aSAndrew Kaylor
12ab5ba51aSAndrew Kaylor using namespace llvm;
13ab5ba51aSAndrew Kaylor
14ab5ba51aSAndrew Kaylor namespace {
15ab5ba51aSAndrew Kaylor
TEST(MCJITMemoryManagerTest,BasicAllocations)16ab5ba51aSAndrew Kaylor TEST(MCJITMemoryManagerTest, BasicAllocations) {
1756440fd8SAhmed Charles std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
18ab5ba51aSAndrew Kaylor
197aa695e0SFilip Pizlo uint8_t *code1 = MemMgr->allocateCodeSection(256, 0, 1, "");
207aa695e0SFilip Pizlo uint8_t *data1 = MemMgr->allocateDataSection(256, 0, 2, "", true);
217aa695e0SFilip Pizlo uint8_t *code2 = MemMgr->allocateCodeSection(256, 0, 3, "");
227aa695e0SFilip Pizlo uint8_t *data2 = MemMgr->allocateDataSection(256, 0, 4, "", false);
23ab5ba51aSAndrew Kaylor
2466f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, code1);
2566f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, code2);
2666f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, data1);
2766f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, data2);
28ab5ba51aSAndrew Kaylor
29ab5ba51aSAndrew Kaylor // Initialize the data
30ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 256; ++i) {
31ab5ba51aSAndrew Kaylor code1[i] = 1;
32ab5ba51aSAndrew Kaylor code2[i] = 2;
33ab5ba51aSAndrew Kaylor data1[i] = 3;
34ab5ba51aSAndrew Kaylor data2[i] = 4;
35ab5ba51aSAndrew Kaylor }
36ab5ba51aSAndrew Kaylor
37ab5ba51aSAndrew Kaylor // Verify the data (this is checking for overlaps in the addresses)
38ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 256; ++i) {
39ab5ba51aSAndrew Kaylor EXPECT_EQ(1, code1[i]);
40ab5ba51aSAndrew Kaylor EXPECT_EQ(2, code2[i]);
41ab5ba51aSAndrew Kaylor EXPECT_EQ(3, data1[i]);
42ab5ba51aSAndrew Kaylor EXPECT_EQ(4, data2[i]);
43ab5ba51aSAndrew Kaylor }
44ab5ba51aSAndrew Kaylor
45ab5ba51aSAndrew Kaylor std::string Error;
462e7efeddSDavid Tweed EXPECT_FALSE(MemMgr->finalizeMemory(&Error));
47ab5ba51aSAndrew Kaylor }
48ab5ba51aSAndrew Kaylor
TEST(MCJITMemoryManagerTest,LargeAllocations)49ab5ba51aSAndrew Kaylor TEST(MCJITMemoryManagerTest, LargeAllocations) {
5056440fd8SAhmed Charles std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
51ab5ba51aSAndrew Kaylor
527aa695e0SFilip Pizlo uint8_t *code1 = MemMgr->allocateCodeSection(0x100000, 0, 1, "");
537aa695e0SFilip Pizlo uint8_t *data1 = MemMgr->allocateDataSection(0x100000, 0, 2, "", true);
547aa695e0SFilip Pizlo uint8_t *code2 = MemMgr->allocateCodeSection(0x100000, 0, 3, "");
557aa695e0SFilip Pizlo uint8_t *data2 = MemMgr->allocateDataSection(0x100000, 0, 4, "", false);
56ab5ba51aSAndrew Kaylor
5766f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, code1);
5866f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, code2);
5966f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, data1);
6066f09ad0SCraig Topper EXPECT_NE((uint8_t*)nullptr, data2);
61ab5ba51aSAndrew Kaylor
62ab5ba51aSAndrew Kaylor // Initialize the data
63ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 0x100000; ++i) {
64ab5ba51aSAndrew Kaylor code1[i] = 1;
65ab5ba51aSAndrew Kaylor code2[i] = 2;
66ab5ba51aSAndrew Kaylor data1[i] = 3;
67ab5ba51aSAndrew Kaylor data2[i] = 4;
68ab5ba51aSAndrew Kaylor }
69ab5ba51aSAndrew Kaylor
70ab5ba51aSAndrew Kaylor // Verify the data (this is checking for overlaps in the addresses)
71ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 0x100000; ++i) {
72ab5ba51aSAndrew Kaylor EXPECT_EQ(1, code1[i]);
73ab5ba51aSAndrew Kaylor EXPECT_EQ(2, code2[i]);
74ab5ba51aSAndrew Kaylor EXPECT_EQ(3, data1[i]);
75ab5ba51aSAndrew Kaylor EXPECT_EQ(4, data2[i]);
76ab5ba51aSAndrew Kaylor }
77ab5ba51aSAndrew Kaylor
78ab5ba51aSAndrew Kaylor std::string Error;
792e7efeddSDavid Tweed EXPECT_FALSE(MemMgr->finalizeMemory(&Error));
80ab5ba51aSAndrew Kaylor }
81ab5ba51aSAndrew Kaylor
TEST(MCJITMemoryManagerTest,ManyAllocations)82ab5ba51aSAndrew Kaylor TEST(MCJITMemoryManagerTest, ManyAllocations) {
8356440fd8SAhmed Charles std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
84ab5ba51aSAndrew Kaylor
85ab5ba51aSAndrew Kaylor uint8_t* code[10000];
86ab5ba51aSAndrew Kaylor uint8_t* data[10000];
87ab5ba51aSAndrew Kaylor
88ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 10000; ++i) {
89ab5ba51aSAndrew Kaylor const bool isReadOnly = i % 2 == 0;
90ab5ba51aSAndrew Kaylor
917aa695e0SFilip Pizlo code[i] = MemMgr->allocateCodeSection(32, 0, 1, "");
927aa695e0SFilip Pizlo data[i] = MemMgr->allocateDataSection(32, 0, 2, "", isReadOnly);
93ab5ba51aSAndrew Kaylor
94ab5ba51aSAndrew Kaylor for (unsigned j = 0; j < 32; j++) {
95ab5ba51aSAndrew Kaylor code[i][j] = 1 + (i % 254);
96ab5ba51aSAndrew Kaylor data[i][j] = 2 + (i % 254);
97ab5ba51aSAndrew Kaylor }
98ab5ba51aSAndrew Kaylor
9966f09ad0SCraig Topper EXPECT_NE((uint8_t *)nullptr, code[i]);
10066f09ad0SCraig Topper EXPECT_NE((uint8_t *)nullptr, data[i]);
101ab5ba51aSAndrew Kaylor }
102ab5ba51aSAndrew Kaylor
103ab5ba51aSAndrew Kaylor // Verify the data (this is checking for overlaps in the addresses)
104ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 10000; ++i) {
105ab5ba51aSAndrew Kaylor for (unsigned j = 0; j < 32;j++ ) {
106ab5ba51aSAndrew Kaylor uint8_t ExpectedCode = 1 + (i % 254);
107ab5ba51aSAndrew Kaylor uint8_t ExpectedData = 2 + (i % 254);
108ab5ba51aSAndrew Kaylor EXPECT_EQ(ExpectedCode, code[i][j]);
109ab5ba51aSAndrew Kaylor EXPECT_EQ(ExpectedData, data[i][j]);
110ab5ba51aSAndrew Kaylor }
111ab5ba51aSAndrew Kaylor }
112ab5ba51aSAndrew Kaylor
113ab5ba51aSAndrew Kaylor std::string Error;
1142e7efeddSDavid Tweed EXPECT_FALSE(MemMgr->finalizeMemory(&Error));
115ab5ba51aSAndrew Kaylor }
116ab5ba51aSAndrew Kaylor
TEST(MCJITMemoryManagerTest,ManyVariedAllocations)117ab5ba51aSAndrew Kaylor TEST(MCJITMemoryManagerTest, ManyVariedAllocations) {
11856440fd8SAhmed Charles std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
119ab5ba51aSAndrew Kaylor
120ab5ba51aSAndrew Kaylor uint8_t* code[10000];
121ab5ba51aSAndrew Kaylor uint8_t* data[10000];
122ab5ba51aSAndrew Kaylor
123ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 10000; ++i) {
124ab5ba51aSAndrew Kaylor uintptr_t CodeSize = i % 16 + 1;
125ab5ba51aSAndrew Kaylor uintptr_t DataSize = i % 8 + 1;
126ab5ba51aSAndrew Kaylor
127ab5ba51aSAndrew Kaylor bool isReadOnly = i % 3 == 0;
128ab5ba51aSAndrew Kaylor unsigned Align = 8 << (i % 4);
129ab5ba51aSAndrew Kaylor
1307aa695e0SFilip Pizlo code[i] = MemMgr->allocateCodeSection(CodeSize, Align, i, "");
1317aa695e0SFilip Pizlo data[i] = MemMgr->allocateDataSection(DataSize, Align, i + 10000, "",
132ab5ba51aSAndrew Kaylor isReadOnly);
133ab5ba51aSAndrew Kaylor
134ab5ba51aSAndrew Kaylor for (unsigned j = 0; j < CodeSize; j++) {
135ab5ba51aSAndrew Kaylor code[i][j] = 1 + (i % 254);
136ab5ba51aSAndrew Kaylor }
137ab5ba51aSAndrew Kaylor
138ab5ba51aSAndrew Kaylor for (unsigned j = 0; j < DataSize; j++) {
139ab5ba51aSAndrew Kaylor data[i][j] = 2 + (i % 254);
140ab5ba51aSAndrew Kaylor }
141ab5ba51aSAndrew Kaylor
14266f09ad0SCraig Topper EXPECT_NE((uint8_t *)nullptr, code[i]);
14366f09ad0SCraig Topper EXPECT_NE((uint8_t *)nullptr, data[i]);
144ab5ba51aSAndrew Kaylor
145ab5ba51aSAndrew Kaylor uintptr_t CodeAlign = Align ? (uintptr_t)code[i] % Align : 0;
146ab5ba51aSAndrew Kaylor uintptr_t DataAlign = Align ? (uintptr_t)data[i] % Align : 0;
147ab5ba51aSAndrew Kaylor
148ab5ba51aSAndrew Kaylor EXPECT_EQ((uintptr_t)0, CodeAlign);
149ab5ba51aSAndrew Kaylor EXPECT_EQ((uintptr_t)0, DataAlign);
150ab5ba51aSAndrew Kaylor }
151ab5ba51aSAndrew Kaylor
152ab5ba51aSAndrew Kaylor for (unsigned i = 0; i < 10000; ++i) {
153ab5ba51aSAndrew Kaylor uintptr_t CodeSize = i % 16 + 1;
154ab5ba51aSAndrew Kaylor uintptr_t DataSize = i % 8 + 1;
155ab5ba51aSAndrew Kaylor
156ab5ba51aSAndrew Kaylor for (unsigned j = 0; j < CodeSize; j++) {
157ab5ba51aSAndrew Kaylor uint8_t ExpectedCode = 1 + (i % 254);
158ab5ba51aSAndrew Kaylor EXPECT_EQ(ExpectedCode, code[i][j]);
159ab5ba51aSAndrew Kaylor }
160ab5ba51aSAndrew Kaylor
161ab5ba51aSAndrew Kaylor for (unsigned j = 0; j < DataSize; j++) {
162ab5ba51aSAndrew Kaylor uint8_t ExpectedData = 2 + (i % 254);
163ab5ba51aSAndrew Kaylor EXPECT_EQ(ExpectedData, data[i][j]);
164ab5ba51aSAndrew Kaylor }
165ab5ba51aSAndrew Kaylor }
166ab5ba51aSAndrew Kaylor }
167ab5ba51aSAndrew Kaylor
168ab5ba51aSAndrew Kaylor } // Namespace
169ab5ba51aSAndrew Kaylor
170