]> granicus.if.org Git - llvm/commitdiff
Do not pass a superblock to PDBFileBuilder.
authorRui Ueyama <ruiu@google.com>
Fri, 30 Sep 2016 20:52:12 +0000 (20:52 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 30 Sep 2016 20:52:12 +0000 (20:52 +0000)
When we create a PDB file using PDBFileBuilder, the information
in the superblock, such as the size of the resulting file, is not
available.

Previously, PDBFileBuilder::initialize took a superblock assuming
that all the members of the struct are correct. That is useful when
you want to restore the exact information from a YAML file, but
that's probably the only use case in which that is useful.
When we are creating a PDB file on the fly, we have to backfill the
members.

This patch redefines PDBFileBuilder::initialize to take only a
block size. Now all the other members are left as default values,
so that they'll be updated when commit() is called.

Differential Revision: https://reviews.llvm.org/D25108

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282944 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/MSF/MSFBuilder.h
include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h
lib/DebugInfo/MSF/MSFBuilder.cpp
lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp
test/DebugInfo/PDB/pdbdump-readwrite.test
tools/llvm-pdbdump/llvm-pdbdump.cpp

index 540050ca6afa6267f7ab29e168c1a950cbdfacfb..6d067cc1c23810be554a3402911befb156797534 100644 (file)
@@ -128,7 +128,7 @@ private:
 
   bool IsGrowable;
   uint32_t FreePageMap;
-  uint32_t Unknown1;
+  uint32_t Unknown1 = 0;
   uint32_t BlockSize;
   uint32_t MininumBlocks;
   uint32_t BlockMapAddr;
index 843ea97aa5f5534097ca0d2e71476475d8df030b..ce5e3ff1da47fdabec95f5e487a0ba099ad15f7d 100644 (file)
@@ -36,7 +36,7 @@ public:
   PDBFileBuilder(const PDBFileBuilder &) = delete;
   PDBFileBuilder &operator=(const PDBFileBuilder &) = delete;
 
-  Error initialize(const msf::SuperBlock &Super);
+  Error initialize(uint32_t BlockSize);
 
   msf::MSFBuilder &getMsfBuilder();
   InfoStreamBuilder &getInfoBuilder();
index 0b378db51ffb1d5d3c9145d57b02f62487b7474c..5b1b5d8dc4d550ae0bffadf4df15e166079aedff 100644 (file)
@@ -19,12 +19,14 @@ const uint32_t kFreePageMap0Block = 1;
 const uint32_t kFreePageMap1Block = 2;
 const uint32_t kNumReservedPages = 3;
 
+const uint32_t kDefaultFreePageMap = kFreePageMap0Block;
 const uint32_t kDefaultBlockMapAddr = kNumReservedPages;
 }
 
 MSFBuilder::MSFBuilder(uint32_t BlockSize, uint32_t MinBlockCount, bool CanGrow,
                        BumpPtrAllocator &Allocator)
-    : Allocator(Allocator), IsGrowable(CanGrow), BlockSize(BlockSize),
+    : Allocator(Allocator), IsGrowable(CanGrow),
+      FreePageMap(kDefaultFreePageMap), BlockSize(BlockSize),
       MininumBlocks(MinBlockCount), BlockMapAddr(kDefaultBlockMapAddr),
       FreeBlocks(MinBlockCount, true) {
   FreeBlocks[kSuperBlockBlock] = false;
index 5b9f94616081855d491e49fd441c2978ef6b77f8..dcd8662913cc4d7cf6832ff350fceb9d55e736a1 100644 (file)
@@ -32,18 +32,11 @@ using namespace llvm::support;
 PDBFileBuilder::PDBFileBuilder(BumpPtrAllocator &Allocator)
     : Allocator(Allocator) {}
 
-Error PDBFileBuilder::initialize(const msf::SuperBlock &Super) {
-  auto ExpectedMsf =
-      MSFBuilder::create(Allocator, Super.BlockSize, Super.NumBlocks);
+Error PDBFileBuilder::initialize(uint32_t BlockSize) {
+  auto ExpectedMsf = MSFBuilder::create(Allocator, BlockSize);
   if (!ExpectedMsf)
     return ExpectedMsf.takeError();
-
-  auto &MsfResult = *ExpectedMsf;
-  if (auto EC = MsfResult.setBlockMapAddr(Super.BlockMapAddr))
-    return EC;
-  Msf = llvm::make_unique<MSFBuilder>(std::move(MsfResult));
-  Msf->setFreePageMap(Super.FreeBlockMapBlock);
-  Msf->setUnknown1(Super.Unknown1);
+  Msf = llvm::make_unique<MSFBuilder>(std::move(*ExpectedMsf));
   return Error::success();
 }
 
index d378ffa5d014790e1e931719d7a81446922b609c..b2f1debd5336067e9d033b64d2e9738515909b57 100644 (file)
@@ -8,8 +8,8 @@ RUN: llvm-pdbdump raw -headers -tpi-records %t.2 | FileCheck %s
 
 CHECK:      FileHeaders {
 CHECK-NEXT:   BlockSize: 4096
-CHECK-NEXT:   FreeBlockMap: 2
-CHECK-NEXT:   NumBlocks: 25
+CHECK-NEXT:   FreeBlockMap:
+CHECK-NEXT:   NumBlocks:
 CHECK-NEXT:   NumDirectoryBytes:
 CHECK-NEXT:   Unknown1: 0
 CHECK-NEXT:   BlockMapAddr:
index bfd9058627f971f6648bc67f9b0394f89a1b9d76..14c6f40b50f4f955e47782143624cfb65de5985f 100644 (file)
@@ -323,7 +323,7 @@ static void yamlToPdb(StringRef Path) {
 
   PDBFileBuilder Builder(Allocator);
 
-  ExitOnErr(Builder.initialize(YamlObj.Headers->SuperBlock));
+  ExitOnErr(Builder.initialize(YamlObj.Headers->SuperBlock.BlockSize));
   // Add each of the reserved streams.  We ignore stream metadata in the
   // yaml, because we will reconstruct our own view of the streams.  For
   // example, the YAML may say that there were 20 streams in the original