xref: /aosp_15_r20/external/llvm/unittests/ExecutionEngine/MCJIT/MCJITMemoryManagerTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- MCJITMemoryManagerTest.cpp - Unit tests for the JIT memory manager -===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/SectionMemoryManager.h"
11*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
12*9880d681SAndroid Build Coastguard Worker 
13*9880d681SAndroid Build Coastguard Worker using namespace llvm;
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker namespace {
16*9880d681SAndroid Build Coastguard Worker 
TEST(MCJITMemoryManagerTest,BasicAllocations)17*9880d681SAndroid Build Coastguard Worker TEST(MCJITMemoryManagerTest, BasicAllocations) {
18*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker   uint8_t *code1 = MemMgr->allocateCodeSection(256, 0, 1, "");
21*9880d681SAndroid Build Coastguard Worker   uint8_t *data1 = MemMgr->allocateDataSection(256, 0, 2, "", true);
22*9880d681SAndroid Build Coastguard Worker   uint8_t *code2 = MemMgr->allocateCodeSection(256, 0, 3, "");
23*9880d681SAndroid Build Coastguard Worker   uint8_t *data2 = MemMgr->allocateDataSection(256, 0, 4, "", false);
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, code1);
26*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, code2);
27*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, data1);
28*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, data2);
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker   // Initialize the data
31*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 256; ++i) {
32*9880d681SAndroid Build Coastguard Worker     code1[i] = 1;
33*9880d681SAndroid Build Coastguard Worker     code2[i] = 2;
34*9880d681SAndroid Build Coastguard Worker     data1[i] = 3;
35*9880d681SAndroid Build Coastguard Worker     data2[i] = 4;
36*9880d681SAndroid Build Coastguard Worker   }
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker   // Verify the data (this is checking for overlaps in the addresses)
39*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 256; ++i) {
40*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(1, code1[i]);
41*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(2, code2[i]);
42*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(3, data1[i]);
43*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(4, data2[i]);
44*9880d681SAndroid Build Coastguard Worker   }
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker   std::string Error;
47*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(MemMgr->finalizeMemory(&Error));
48*9880d681SAndroid Build Coastguard Worker }
49*9880d681SAndroid Build Coastguard Worker 
TEST(MCJITMemoryManagerTest,LargeAllocations)50*9880d681SAndroid Build Coastguard Worker TEST(MCJITMemoryManagerTest, LargeAllocations) {
51*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker   uint8_t *code1 = MemMgr->allocateCodeSection(0x100000, 0, 1, "");
54*9880d681SAndroid Build Coastguard Worker   uint8_t *data1 = MemMgr->allocateDataSection(0x100000, 0, 2, "", true);
55*9880d681SAndroid Build Coastguard Worker   uint8_t *code2 = MemMgr->allocateCodeSection(0x100000, 0, 3, "");
56*9880d681SAndroid Build Coastguard Worker   uint8_t *data2 = MemMgr->allocateDataSection(0x100000, 0, 4, "", false);
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, code1);
59*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, code2);
60*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, data1);
61*9880d681SAndroid Build Coastguard Worker   EXPECT_NE((uint8_t*)nullptr, data2);
62*9880d681SAndroid Build Coastguard Worker 
63*9880d681SAndroid Build Coastguard Worker   // Initialize the data
64*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 0x100000; ++i) {
65*9880d681SAndroid Build Coastguard Worker     code1[i] = 1;
66*9880d681SAndroid Build Coastguard Worker     code2[i] = 2;
67*9880d681SAndroid Build Coastguard Worker     data1[i] = 3;
68*9880d681SAndroid Build Coastguard Worker     data2[i] = 4;
69*9880d681SAndroid Build Coastguard Worker   }
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker   // Verify the data (this is checking for overlaps in the addresses)
72*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 0x100000; ++i) {
73*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(1, code1[i]);
74*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(2, code2[i]);
75*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(3, data1[i]);
76*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(4, data2[i]);
77*9880d681SAndroid Build Coastguard Worker   }
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker   std::string Error;
80*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(MemMgr->finalizeMemory(&Error));
81*9880d681SAndroid Build Coastguard Worker }
82*9880d681SAndroid Build Coastguard Worker 
TEST(MCJITMemoryManagerTest,ManyAllocations)83*9880d681SAndroid Build Coastguard Worker TEST(MCJITMemoryManagerTest, ManyAllocations) {
84*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   uint8_t* code[10000];
87*9880d681SAndroid Build Coastguard Worker   uint8_t* data[10000];
88*9880d681SAndroid Build Coastguard Worker 
89*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 10000; ++i) {
90*9880d681SAndroid Build Coastguard Worker     const bool isReadOnly = i % 2 == 0;
91*9880d681SAndroid Build Coastguard Worker 
92*9880d681SAndroid Build Coastguard Worker     code[i] = MemMgr->allocateCodeSection(32, 0, 1, "");
93*9880d681SAndroid Build Coastguard Worker     data[i] = MemMgr->allocateDataSection(32, 0, 2, "", isReadOnly);
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker     for (unsigned j = 0; j < 32; j++) {
96*9880d681SAndroid Build Coastguard Worker       code[i][j] = 1 + (i % 254);
97*9880d681SAndroid Build Coastguard Worker       data[i][j] = 2 + (i % 254);
98*9880d681SAndroid Build Coastguard Worker     }
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker     EXPECT_NE((uint8_t *)nullptr, code[i]);
101*9880d681SAndroid Build Coastguard Worker     EXPECT_NE((uint8_t *)nullptr, data[i]);
102*9880d681SAndroid Build Coastguard Worker   }
103*9880d681SAndroid Build Coastguard Worker 
104*9880d681SAndroid Build Coastguard Worker   // Verify the data (this is checking for overlaps in the addresses)
105*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 10000; ++i) {
106*9880d681SAndroid Build Coastguard Worker     for (unsigned j = 0; j < 32;j++ ) {
107*9880d681SAndroid Build Coastguard Worker       uint8_t ExpectedCode = 1 + (i % 254);
108*9880d681SAndroid Build Coastguard Worker       uint8_t ExpectedData = 2 + (i % 254);
109*9880d681SAndroid Build Coastguard Worker       EXPECT_EQ(ExpectedCode, code[i][j]);
110*9880d681SAndroid Build Coastguard Worker       EXPECT_EQ(ExpectedData, data[i][j]);
111*9880d681SAndroid Build Coastguard Worker     }
112*9880d681SAndroid Build Coastguard Worker   }
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker   std::string Error;
115*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(MemMgr->finalizeMemory(&Error));
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker 
TEST(MCJITMemoryManagerTest,ManyVariedAllocations)118*9880d681SAndroid Build Coastguard Worker TEST(MCJITMemoryManagerTest, ManyVariedAllocations) {
119*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<SectionMemoryManager> MemMgr(new SectionMemoryManager());
120*9880d681SAndroid Build Coastguard Worker 
121*9880d681SAndroid Build Coastguard Worker   uint8_t* code[10000];
122*9880d681SAndroid Build Coastguard Worker   uint8_t* data[10000];
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 10000; ++i) {
125*9880d681SAndroid Build Coastguard Worker     uintptr_t CodeSize = i % 16 + 1;
126*9880d681SAndroid Build Coastguard Worker     uintptr_t DataSize = i % 8 + 1;
127*9880d681SAndroid Build Coastguard Worker 
128*9880d681SAndroid Build Coastguard Worker     bool isReadOnly = i % 3 == 0;
129*9880d681SAndroid Build Coastguard Worker     unsigned Align = 8 << (i % 4);
130*9880d681SAndroid Build Coastguard Worker 
131*9880d681SAndroid Build Coastguard Worker     code[i] = MemMgr->allocateCodeSection(CodeSize, Align, i, "");
132*9880d681SAndroid Build Coastguard Worker     data[i] = MemMgr->allocateDataSection(DataSize, Align, i + 10000, "",
133*9880d681SAndroid Build Coastguard Worker                                           isReadOnly);
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker     for (unsigned j = 0; j < CodeSize; j++) {
136*9880d681SAndroid Build Coastguard Worker       code[i][j] = 1 + (i % 254);
137*9880d681SAndroid Build Coastguard Worker     }
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker     for (unsigned j = 0; j < DataSize; j++) {
140*9880d681SAndroid Build Coastguard Worker       data[i][j] = 2 + (i % 254);
141*9880d681SAndroid Build Coastguard Worker     }
142*9880d681SAndroid Build Coastguard Worker 
143*9880d681SAndroid Build Coastguard Worker     EXPECT_NE((uint8_t *)nullptr, code[i]);
144*9880d681SAndroid Build Coastguard Worker     EXPECT_NE((uint8_t *)nullptr, data[i]);
145*9880d681SAndroid Build Coastguard Worker 
146*9880d681SAndroid Build Coastguard Worker     uintptr_t CodeAlign = Align ? (uintptr_t)code[i] % Align : 0;
147*9880d681SAndroid Build Coastguard Worker     uintptr_t DataAlign = Align ? (uintptr_t)data[i] % Align : 0;
148*9880d681SAndroid Build Coastguard Worker 
149*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ((uintptr_t)0, CodeAlign);
150*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ((uintptr_t)0, DataAlign);
151*9880d681SAndroid Build Coastguard Worker   }
152*9880d681SAndroid Build Coastguard Worker 
153*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < 10000; ++i) {
154*9880d681SAndroid Build Coastguard Worker     uintptr_t CodeSize = i % 16 + 1;
155*9880d681SAndroid Build Coastguard Worker     uintptr_t DataSize = i % 8 + 1;
156*9880d681SAndroid Build Coastguard Worker 
157*9880d681SAndroid Build Coastguard Worker     for (unsigned j = 0; j < CodeSize; j++) {
158*9880d681SAndroid Build Coastguard Worker       uint8_t ExpectedCode = 1 + (i % 254);
159*9880d681SAndroid Build Coastguard Worker       EXPECT_EQ(ExpectedCode, code[i][j]);
160*9880d681SAndroid Build Coastguard Worker     }
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker     for (unsigned j = 0; j < DataSize; j++) {
163*9880d681SAndroid Build Coastguard Worker       uint8_t ExpectedData = 2 + (i % 254);
164*9880d681SAndroid Build Coastguard Worker       EXPECT_EQ(ExpectedData, data[i][j]);
165*9880d681SAndroid Build Coastguard Worker     }
166*9880d681SAndroid Build Coastguard Worker   }
167*9880d681SAndroid Build Coastguard Worker }
168*9880d681SAndroid Build Coastguard Worker 
169*9880d681SAndroid Build Coastguard Worker } // Namespace
170*9880d681SAndroid Build Coastguard Worker 
171