diff options
Diffstat (limited to 'llvm/lib/DebugInfo/MSF/MSFBuilder.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/MSF/MSFBuilder.cpp | 38 |
1 files changed, 6 insertions, 32 deletions
diff --git a/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp b/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp index 9cd22ab7d88..919f870b34a 100644 --- a/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp +++ b/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp @@ -29,7 +29,7 @@ static const uint32_t kFreePageMap0Block = 1; static const uint32_t kFreePageMap1Block = 2; static const uint32_t kNumReservedPages = 3; -static const uint32_t kDefaultFreePageMap = kFreePageMap0Block; +static const uint32_t kDefaultFreePageMap = kFreePageMap1Block; static const uint32_t kDefaultBlockMapAddr = kNumReservedPages; MSFBuilder::MSFBuilder(uint32_t BlockSize, uint32_t MinBlockCount, bool CanGrow, @@ -112,11 +112,11 @@ Error MSFBuilder::allocateBlocks(uint32_t NumBlocks, FreeBlocks.resize(NewBlockCount, true); // If we crossed over an fpm page, we actually need to allocate 2 extra // blocks for each FPM group crossed and mark both blocks from the group as - // used. We may not actually use them since there are many more FPM blocks - // present than are required to represent all blocks in a given PDB, but we - // need to make sure they aren't allocated to a stream or something else. - // At the end when committing the PDB, we'll go through and mark the - // extraneous ones unused. + // used. FPM blocks are marked as allocated regardless of whether or not + // they ultimately describe the status of blocks in the file. This means + // that not only are extraneous blocks at the end of the main FPM marked as + // allocated, but also blocks from the alternate FPM are always marked as + // allocated. while (NextFpmBlock < NewBlockCount) { NewBlockCount += 2; FreeBlocks.resize(NewBlockCount, true); @@ -244,19 +244,6 @@ uint32_t MSFBuilder::computeDirectoryByteSize() const { return Size; } -static void finalizeFpmBlockStatus(uint32_t B, ArrayRef<ulittle32_t> &FpmBlocks, - BitVector &Fpm) { - if (FpmBlocks.empty() || FpmBlocks.front() != B) { - Fpm.set(B); - return; - } - - // If the next block in the actual layout is this block, it should *not* be - // free. - assert(!Fpm.test(B)); - FpmBlocks = FpmBlocks.drop_front(); -} - Expected<MSFLayout> MSFBuilder::build() { SuperBlock *SB = Allocator.Allocate<SuperBlock>(); MSFLayout L; @@ -315,19 +302,6 @@ Expected<MSFLayout> MSFBuilder::build() { } } - // FPM blocks occur in pairs at every `BlockLength` interval. While blocks of - // this form are reserved for FPM blocks, not all blocks of this form will - // actually be needed for FPM data because there are more blocks of this form - // than are required to represent a PDB file with a given number of blocks. - // So we need to find out which blocks are *actually* going to be real FPM - // blocks, then mark the reset of the reserved blocks as unallocated. - MSFStreamLayout FpmLayout = msf::getFpmStreamLayout(L, true); - auto FpmBlocks = makeArrayRef(FpmLayout.Blocks); - for (uint32_t B = kFreePageMap0Block; B < SB->NumBlocks; - B += msf::getFpmIntervalLength(L)) { - finalizeFpmBlockStatus(B, FpmBlocks, FreeBlocks); - finalizeFpmBlockStatus(B + 1, FpmBlocks, FreeBlocks); - } L.FreePageMap = FreeBlocks; return L; |