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