[llvm] r276460 - Make PDBFile store an msf::Layout.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 22 12:56:34 PDT 2016


Author: zturner
Date: Fri Jul 22 14:56:33 2016
New Revision: 276460

URL: http://llvm.org/viewvc/llvm-project?rev=276460&view=rev
Log:
Make PDBFile store an msf::Layout.

Previously it was storing all the fields of an msf::Layout as
separate members.  This is a trivial cleanup to make it store
an msf::Layout directly.  This makes the code more readable
since it becomes clear which fields of PDBFile are actually the
msf specific layout information in a sea of other bookkeeping
fields.

Modified:
    llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h
    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h
    llvm/trunk/lib/DebugInfo/Msf/MsfBuilder.cpp
    llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp
    llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp

Modified: llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h?rev=276460&r1=276459&r2=276460&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h Fri Jul 22 14:56:33 2016
@@ -49,7 +49,8 @@ struct SuperBlock {
 };
 
 struct Layout {
-  SuperBlock *SB;
+  Layout() : SB(nullptr) {}
+  const SuperBlock *SB;
   ArrayRef<support::ulittle32_t> DirectoryBlocks;
   ArrayRef<support::ulittle32_t> StreamSizes;
   std::vector<ArrayRef<support::ulittle32_t>> StreamMap;

Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h?rev=276460&r1=276459&r2=276460&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h Fri Jul 22 14:56:33 2016
@@ -67,9 +67,11 @@ public:
   Error setBlockData(uint32_t BlockIndex, uint32_t Offset,
                      ArrayRef<uint8_t> Data) const override;
 
-  ArrayRef<support::ulittle32_t> getStreamSizes() const { return StreamSizes; }
+  ArrayRef<support::ulittle32_t> getStreamSizes() const {
+    return MsfLayout.StreamSizes;
+  }
   ArrayRef<ArrayRef<support::ulittle32_t>> getStreamMap() const {
-    return StreamMap;
+    return MsfLayout.StreamMap;
   }
 
   ArrayRef<support::ulittle32_t> getDirectoryBlockArray() const;
@@ -88,15 +90,11 @@ public:
   Error commit();
 
 private:
-  Error setSuperBlock(const msf::SuperBlock *Block);
-
   BumpPtrAllocator &Allocator;
 
   std::unique_ptr<msf::StreamInterface> Buffer;
-  const msf::SuperBlock *SB;
-  ArrayRef<support::ulittle32_t> StreamSizes;
-  ArrayRef<support::ulittle32_t> DirectoryBlocks;
-  std::vector<ArrayRef<support::ulittle32_t>> StreamMap;
+
+  msf::Layout MsfLayout;
 
   std::unique_ptr<InfoStream> Info;
   std::unique_ptr<DbiStream> Dbi;

Modified: llvm/trunk/lib/DebugInfo/Msf/MsfBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/Msf/MsfBuilder.cpp?rev=276460&r1=276459&r2=276460&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/Msf/MsfBuilder.cpp (original)
+++ llvm/trunk/lib/DebugInfo/Msf/MsfBuilder.cpp Fri Jul 22 14:56:33 2016
@@ -219,17 +219,18 @@ uint32_t MsfBuilder::computeDirectoryByt
 }
 
 Expected<Layout> MsfBuilder::build() {
+  SuperBlock *SB = Allocator.Allocate<SuperBlock>();
   Layout L;
-  L.SB = Allocator.Allocate<SuperBlock>();
-  std::memcpy(L.SB->MagicBytes, Magic, sizeof(Magic));
-  L.SB->BlockMapAddr = BlockMapAddr;
-  L.SB->BlockSize = BlockSize;
-  L.SB->NumDirectoryBytes = computeDirectoryByteSize();
-  L.SB->FreeBlockMapBlock = FreePageMap;
-  L.SB->Unknown1 = Unknown1;
+  L.SB = SB;
 
-  uint32_t NumDirectoryBlocks =
-      bytesToBlocks(L.SB->NumDirectoryBytes, BlockSize);
+  std::memcpy(SB->MagicBytes, Magic, sizeof(Magic));
+  SB->BlockMapAddr = BlockMapAddr;
+  SB->BlockSize = BlockSize;
+  SB->NumDirectoryBytes = computeDirectoryByteSize();
+  SB->FreeBlockMapBlock = FreePageMap;
+  SB->Unknown1 = Unknown1;
+
+  uint32_t NumDirectoryBlocks = bytesToBlocks(SB->NumDirectoryBytes, BlockSize);
   if (NumDirectoryBlocks > DirectoryBlocks.size()) {
     // Our hint wasn't enough to satisfy the entire directory.  Allocate
     // remaining pages.
@@ -251,7 +252,7 @@ Expected<Layout> MsfBuilder::build() {
   // Don't set the number of blocks in the file until after allocating Blocks
   // for the directory, since the allocation might cause the file to need to
   // grow.
-  L.SB->NumBlocks = FreeBlocks.size();
+  SB->NumBlocks = FreeBlocks.size();
 
   ulittle32_t *DirBlocks = Allocator.Allocate<ulittle32_t>(NumDirectoryBlocks);
   std::uninitialized_copy_n(DirectoryBlocks.begin(), NumDirectoryBlocks,

Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp?rev=276460&r1=276459&r2=276460&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp (original)
+++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp Fri Jul 22 14:56:33 2016
@@ -38,39 +38,46 @@ typedef FixedStreamArray<support::ulittl
 
 PDBFile::PDBFile(std::unique_ptr<StreamInterface> PdbFileBuffer,
                  BumpPtrAllocator &Allocator)
-    : Allocator(Allocator), Buffer(std::move(PdbFileBuffer)), SB(nullptr) {}
+    : Allocator(Allocator), Buffer(std::move(PdbFileBuffer)) {}
 
 PDBFile::~PDBFile() {}
 
-uint32_t PDBFile::getBlockSize() const { return SB->BlockSize; }
+uint32_t PDBFile::getBlockSize() const { return MsfLayout.SB->BlockSize; }
 
-uint32_t PDBFile::getFreeBlockMapBlock() const { return SB->FreeBlockMapBlock; }
+uint32_t PDBFile::getFreeBlockMapBlock() const {
+  return MsfLayout.SB->FreeBlockMapBlock;
+}
 
-uint32_t PDBFile::getBlockCount() const { return SB->NumBlocks; }
+uint32_t PDBFile::getBlockCount() const { return MsfLayout.SB->NumBlocks; }
 
-uint32_t PDBFile::getNumDirectoryBytes() const { return SB->NumDirectoryBytes; }
+uint32_t PDBFile::getNumDirectoryBytes() const {
+  return MsfLayout.SB->NumDirectoryBytes;
+}
 
-uint32_t PDBFile::getBlockMapIndex() const { return SB->BlockMapAddr; }
+uint32_t PDBFile::getBlockMapIndex() const {
+  return MsfLayout.SB->BlockMapAddr;
+}
 
-uint32_t PDBFile::getUnknown1() const { return SB->Unknown1; }
+uint32_t PDBFile::getUnknown1() const { return MsfLayout.SB->Unknown1; }
 
 uint32_t PDBFile::getNumDirectoryBlocks() const {
-  return msf::bytesToBlocks(SB->NumDirectoryBytes, SB->BlockSize);
+  return msf::bytesToBlocks(MsfLayout.SB->NumDirectoryBytes,
+                            MsfLayout.SB->BlockSize);
 }
 
 uint64_t PDBFile::getBlockMapOffset() const {
-  return (uint64_t)SB->BlockMapAddr * SB->BlockSize;
+  return (uint64_t)MsfLayout.SB->BlockMapAddr * MsfLayout.SB->BlockSize;
 }
 
-uint32_t PDBFile::getNumStreams() const { return StreamSizes.size(); }
+uint32_t PDBFile::getNumStreams() const { return MsfLayout.StreamSizes.size(); }
 
 uint32_t PDBFile::getStreamByteSize(uint32_t StreamIndex) const {
-  return StreamSizes[StreamIndex];
+  return MsfLayout.StreamSizes[StreamIndex];
 }
 
 ArrayRef<support::ulittle32_t>
 PDBFile::getStreamBlockList(uint32_t StreamIndex) const {
-  return StreamMap[StreamIndex];
+  return MsfLayout.StreamMap[StreamIndex];
 }
 
 uint32_t PDBFile::getFileSize() const { return Buffer->getLength(); }
@@ -104,24 +111,31 @@ Error PDBFile::setBlockData(uint32_t Blo
 Error PDBFile::parseFileHeaders() {
   StreamReader Reader(*Buffer);
 
+  const msf::SuperBlock *SB = nullptr;
   if (auto EC = Reader.readObject(SB)) {
     consumeError(std::move(EC));
     return make_error<RawError>(raw_error_code::corrupt_file,
                                 "Does not contain superblock");
   }
 
-  if (auto EC = setSuperBlock(SB))
+  if (auto EC = msf::validateSuperBlock(*SB))
     return EC;
 
+  if (Buffer->getLength() % SB->BlockSize != 0)
+    return make_error<RawError>(raw_error_code::corrupt_file,
+                                "File size is not a multiple of block size");
+  MsfLayout.SB = SB;
+
   Reader.setOffset(getBlockMapOffset());
-  if (auto EC = Reader.readArray(DirectoryBlocks, getNumDirectoryBlocks()))
+  if (auto EC =
+          Reader.readArray(MsfLayout.DirectoryBlocks, getNumDirectoryBlocks()))
     return EC;
 
   return Error::success();
 }
 
 Error PDBFile::parseStreamData() {
-  assert(SB);
+  assert(MsfLayout.SB);
   if (DirectoryStream)
     return Error::success();
 
@@ -133,21 +147,22 @@ Error PDBFile::parseStreamData() {
   // subclass of IPDBStreamData which only accesses the fields that have already
   // been parsed, we can avoid this and reuse MappedBlockStream.
   auto DS = MappedBlockStream::createDirectoryStream(
-      SB->NumDirectoryBytes, getDirectoryBlockArray(), *this);
+      MsfLayout.SB->NumDirectoryBytes, getDirectoryBlockArray(), *this);
   if (!DS)
     return DS.takeError();
   StreamReader Reader(**DS);
   if (auto EC = Reader.readInteger(NumStreams))
     return EC;
 
-  if (auto EC = Reader.readArray(StreamSizes, NumStreams))
+  if (auto EC = Reader.readArray(MsfLayout.StreamSizes, NumStreams))
     return EC;
   for (uint32_t I = 0; I < NumStreams; ++I) {
     uint32_t StreamSize = getStreamByteSize(I);
     // FIXME: What does StreamSize ~0U mean?
     uint64_t NumExpectedStreamBlocks =
-        StreamSize == UINT32_MAX ? 0 : msf::bytesToBlocks(StreamSize,
-                                                          SB->BlockSize);
+        StreamSize == UINT32_MAX
+            ? 0
+            : msf::bytesToBlocks(StreamSize, MsfLayout.SB->BlockSize);
 
     // For convenience, we store the block array contiguously.  This is because
     // if someone calls setStreamMap(), it is more convenient to be able to call
@@ -159,12 +174,12 @@ Error PDBFile::parseStreamData() {
     if (auto EC = Reader.readArray(Blocks, NumExpectedStreamBlocks))
       return EC;
     for (uint32_t Block : Blocks) {
-      uint64_t BlockEndOffset = (uint64_t)(Block + 1) * SB->BlockSize;
+      uint64_t BlockEndOffset = (uint64_t)(Block + 1) * MsfLayout.SB->BlockSize;
       if (BlockEndOffset > getFileSize())
         return make_error<RawError>(raw_error_code::corrupt_file,
                                     "Stream block map is corrupt.");
     }
-    StreamMap.push_back(Blocks);
+    MsfLayout.StreamMap.push_back(Blocks);
   }
 
   // We should have read exactly SB->NumDirectoryBytes bytes.
@@ -174,7 +189,7 @@ Error PDBFile::parseStreamData() {
 }
 
 llvm::ArrayRef<support::ulittle32_t> PDBFile::getDirectoryBlockArray() const {
-  return DirectoryBlocks;
+  return MsfLayout.DirectoryBlocks;
 }
 
 Expected<InfoStream &> PDBFile::getPDBInfoStream() {
@@ -297,29 +312,17 @@ Expected<NameHashTable &> PDBFile::getSt
   return *StringTable;
 }
 
-Error PDBFile::setSuperBlock(const msf::SuperBlock *Block) {
-  if (auto EC = msf::validateSuperBlock(*Block))
-    return EC;
-
-  if (Buffer->getLength() % SB->BlockSize != 0)
-    return make_error<RawError>(raw_error_code::corrupt_file,
-                                "File size is not a multiple of block size");
-
-  SB = Block;
-  return Error::success();
-}
-
 Error PDBFile::commit() {
   StreamWriter Writer(*Buffer);
 
-  if (auto EC = Writer.writeObject(*SB))
+  if (auto EC = Writer.writeObject(*MsfLayout.SB))
     return EC;
   Writer.setOffset(getBlockMapOffset());
-  if (auto EC = Writer.writeArray(DirectoryBlocks))
+  if (auto EC = Writer.writeArray(MsfLayout.DirectoryBlocks))
     return EC;
 
   auto DS = MappedBlockStream::createDirectoryStream(
-      SB->NumDirectoryBytes, getDirectoryBlockArray(), *this);
+      MsfLayout.SB->NumDirectoryBytes, getDirectoryBlockArray(), *this);
   if (!DS)
     return DS.takeError();
   auto DirStream = std::move(*DS);
@@ -327,10 +330,10 @@ Error PDBFile::commit() {
   if (auto EC = DW.writeInteger(this->getNumStreams()))
     return EC;
 
-  if (auto EC = DW.writeArray(StreamSizes))
+  if (auto EC = DW.writeArray(MsfLayout.StreamSizes))
     return EC;
 
-  for (const auto &Blocks : StreamMap) {
+  for (const auto &Blocks : MsfLayout.StreamMap) {
     if (auto EC = DW.writeArray(Blocks))
       return EC;
   }

Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp?rev=276460&r1=276459&r2=276460&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp (original)
+++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp Fri Jul 22 14:56:33 2016
@@ -76,11 +76,7 @@ PDBFileBuilder::build(std::unique_ptr<ms
     return ExpectedLayout.takeError();
 
   auto File = llvm::make_unique<PDBFile>(std::move(PdbFileBuffer), Allocator);
-  const msf::Layout &L = *ExpectedLayout;
-  File->StreamMap = L.StreamMap;
-  File->StreamSizes = L.StreamSizes;
-  File->DirectoryBlocks = L.DirectoryBlocks;
-  File->SB = L.SB;
+  File->MsfLayout = *ExpectedLayout;
 
   if (Info) {
     auto ExpectedInfo = Info->build(*File);




More information about the llvm-commits mailing list