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