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