xref: /llvm-project/llvm/unittests/DebugInfo/MSF/MSFCommonTest.cpp (revision 9fb9d71d3e6a0515cb0ad416bc4400d47801888a)
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