1*9fb9d71dSZachary Turner //===- MSFBuilderTest.cpp Tests manipulation of MSF stream metadata ------===// 2*9fb9d71dSZachary Turner // 3*9fb9d71dSZachary Turner // The LLVM Compiler Infrastructure 4*9fb9d71dSZachary Turner // 5*9fb9d71dSZachary Turner // This file is distributed under the University of Illinois Open Source 6*9fb9d71dSZachary Turner // License. See LICENSE.TXT for details. 7*9fb9d71dSZachary Turner // 8*9fb9d71dSZachary Turner //===----------------------------------------------------------------------===// 9*9fb9d71dSZachary Turner 10*9fb9d71dSZachary Turner #include "llvm/DebugInfo/MSF/MSFCommon.h" 11*9fb9d71dSZachary Turner #include "llvm/Testing/Support/Error.h" 12*9fb9d71dSZachary Turner 13*9fb9d71dSZachary Turner #include "gtest/gtest.h" 14*9fb9d71dSZachary Turner 15*9fb9d71dSZachary Turner using namespace llvm; 16*9fb9d71dSZachary Turner using namespace llvm::msf; 17*9fb9d71dSZachary Turner 18*9fb9d71dSZachary Turner TEST(MSFCommonTest, BytesToBlocks) { 19*9fb9d71dSZachary Turner EXPECT_EQ(0ULL, bytesToBlocks(0, 4096)); 20*9fb9d71dSZachary Turner EXPECT_EQ(1ULL, bytesToBlocks(12, 4096)); 21*9fb9d71dSZachary Turner EXPECT_EQ(1ULL, bytesToBlocks(4096, 4096)); 22*9fb9d71dSZachary Turner EXPECT_EQ(2ULL, bytesToBlocks(4097, 4096)); 23*9fb9d71dSZachary Turner EXPECT_EQ(2ULL, bytesToBlocks(600, 512)); 24*9fb9d71dSZachary Turner } 25*9fb9d71dSZachary Turner 26*9fb9d71dSZachary Turner TEST(MSFCommonTest, FpmIntervals) { 27*9fb9d71dSZachary Turner SuperBlock SB; 28*9fb9d71dSZachary Turner SB.FreeBlockMapBlock = 1; 29*9fb9d71dSZachary Turner SB.BlockSize = 4096; 30*9fb9d71dSZachary Turner 31*9fb9d71dSZachary Turner MSFLayout L; 32*9fb9d71dSZachary Turner L.SB = &SB; 33*9fb9d71dSZachary Turner 34*9fb9d71dSZachary Turner SB.NumBlocks = 12; 35*9fb9d71dSZachary Turner EXPECT_EQ(1u, getNumFpmIntervals(L, false)); 36*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize; 37*9fb9d71dSZachary Turner EXPECT_EQ(1u, getNumFpmIntervals(L, false)); 38*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize + 1; 39*9fb9d71dSZachary Turner EXPECT_EQ(1u, getNumFpmIntervals(L, false)); 40*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize * 8; 41*9fb9d71dSZachary Turner EXPECT_EQ(1u, getNumFpmIntervals(L, false)); 42*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize * 8 + 1; 43*9fb9d71dSZachary Turner EXPECT_EQ(2u, getNumFpmIntervals(L, false)); 44*9fb9d71dSZachary Turner 45*9fb9d71dSZachary Turner SB.NumBlocks = 12; 46*9fb9d71dSZachary Turner EXPECT_EQ(1u, getNumFpmIntervals(L, true)); 47*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize; 48*9fb9d71dSZachary Turner EXPECT_EQ(1u, getNumFpmIntervals(L, true)); 49*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize + 1; 50*9fb9d71dSZachary Turner EXPECT_EQ(2u, getNumFpmIntervals(L, true)); 51*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize * 8; 52*9fb9d71dSZachary Turner EXPECT_EQ(8u, getNumFpmIntervals(L, true)); 53*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize * 8 + 1; 54*9fb9d71dSZachary Turner EXPECT_EQ(9u, getNumFpmIntervals(L, true)); 55*9fb9d71dSZachary Turner } 56*9fb9d71dSZachary Turner 57*9fb9d71dSZachary Turner TEST(MSFCommonTest, FpmStreamLayout) { 58*9fb9d71dSZachary Turner SuperBlock SB; 59*9fb9d71dSZachary Turner MSFLayout L; 60*9fb9d71dSZachary Turner L.SB = &SB; 61*9fb9d71dSZachary Turner SB.FreeBlockMapBlock = 1; 62*9fb9d71dSZachary Turner 63*9fb9d71dSZachary Turner // Each FPM block has 4096 bytes for a maximum of 4096*8 allocation states. 64*9fb9d71dSZachary Turner SB.BlockSize = 4096; 65*9fb9d71dSZachary Turner 66*9fb9d71dSZachary Turner // 1. When we're not including unused FPM data, the length of the FPM stream 67*9fb9d71dSZachary Turner // should be only long enough to contain 1 bit for each block. 68*9fb9d71dSZachary Turner 69*9fb9d71dSZachary Turner // 1a. When the PDB has <= 4096*8 blocks, there should only be one FPM block. 70*9fb9d71dSZachary Turner SB.NumBlocks = 8000; 71*9fb9d71dSZachary Turner MSFStreamLayout SL = getFpmStreamLayout(L, false, false); 72*9fb9d71dSZachary Turner EXPECT_EQ(1000u, SL.Length); 73*9fb9d71dSZachary Turner EXPECT_EQ(1u, SL.Blocks.size()); 74*9fb9d71dSZachary Turner EXPECT_EQ(SB.FreeBlockMapBlock, SL.Blocks.front()); 75*9fb9d71dSZachary Turner 76*9fb9d71dSZachary Turner SL = getFpmStreamLayout(L, false, true); 77*9fb9d71dSZachary Turner EXPECT_EQ(1000u, SL.Length); 78*9fb9d71dSZachary Turner EXPECT_EQ(1u, SL.Blocks.size()); 79*9fb9d71dSZachary Turner EXPECT_EQ(3u - SB.FreeBlockMapBlock, SL.Blocks.front()); 80*9fb9d71dSZachary Turner 81*9fb9d71dSZachary Turner // 1b. When the PDB has > 4096*8 blocks, there should be multiple FPM blocks. 82*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize * 8 + 1; 83*9fb9d71dSZachary Turner SL = getFpmStreamLayout(L, false, false); 84*9fb9d71dSZachary Turner EXPECT_EQ(SB.BlockSize + 1, SL.Length); 85*9fb9d71dSZachary Turner EXPECT_EQ(2u, SL.Blocks.size()); 86*9fb9d71dSZachary Turner EXPECT_EQ(SB.FreeBlockMapBlock, SL.Blocks[0]); 87*9fb9d71dSZachary Turner EXPECT_EQ(SB.FreeBlockMapBlock + SB.BlockSize, SL.Blocks[1]); 88*9fb9d71dSZachary Turner 89*9fb9d71dSZachary Turner SL = getFpmStreamLayout(L, false, true); 90*9fb9d71dSZachary Turner EXPECT_EQ(SB.BlockSize + 1, SL.Length); 91*9fb9d71dSZachary Turner EXPECT_EQ(2u, SL.Blocks.size()); 92*9fb9d71dSZachary Turner EXPECT_EQ(3u - SB.FreeBlockMapBlock, SL.Blocks[0]); 93*9fb9d71dSZachary Turner EXPECT_EQ(3u - SB.FreeBlockMapBlock + SB.BlockSize, SL.Blocks[1]); 94*9fb9d71dSZachary Turner 95*9fb9d71dSZachary Turner // 2. When we are including unused FPM data, there should be one FPM block 96*9fb9d71dSZachary Turner // at every BlockSize interval in the file, even if entire FPM blocks are 97*9fb9d71dSZachary Turner // unused. 98*9fb9d71dSZachary Turner SB.NumBlocks = SB.BlockSize * 8 + 1; 99*9fb9d71dSZachary Turner SL = getFpmStreamLayout(L, true, false); 100*9fb9d71dSZachary Turner EXPECT_EQ(SB.BlockSize * 9, SL.Length); 101*9fb9d71dSZachary Turner EXPECT_EQ(9u, SL.Blocks.size()); 102*9fb9d71dSZachary Turner for (int I = 0; I < 9; ++I) 103*9fb9d71dSZachary Turner EXPECT_EQ(I * SB.BlockSize + SB.FreeBlockMapBlock, SL.Blocks[I]); 104*9fb9d71dSZachary Turner } 105