<div dir="ltr">If you are talking about FPMs for larger files, yes, but before that we need to figure out the exact file format.</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 29, 2016 at 2:52 PM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Do you intend to implement reading of the second fpm in a later patch?<div class="HOEnZb"><div class="h5"><span></span><br><br>On Friday, July 29, 2016, Rui Ueyama via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Fri Jul 29 16:38:00 2016<br>
New Revision: 277216<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=277216&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=277216&view=rev</a><br>
Log:<br>
pdbdump: Dump Free Page Map contents.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D22974" target="_blank">https://reviews.llvm.org/D22974</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/DebugInfo/MSF/MSFCommon.h<br>
    llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp<br>
    llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test<br>
    llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp<br>
    llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h<br>
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp<br>
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h<br>
<br>
Modified: llvm/trunk/include/llvm/DebugInfo/MSF/MSFCommon.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/MSFCommon.h?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/MSFCommon.h?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/DebugInfo/MSF/MSFCommon.h (original)<br>
+++ llvm/trunk/include/llvm/DebugInfo/MSF/MSFCommon.h Fri Jul 29 16:38:00 2016<br>
@@ -11,6 +11,7 @@<br>
 #define LLVM_DEBUGINFO_MSF_MSFCOMMON_H<br>
<br>
 #include "llvm/ADT/ArrayRef.h"<br>
+#include "llvm/ADT/BitVector.h"<br>
<br>
 #include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/Error.h"<br>
@@ -51,6 +52,7 @@ struct SuperBlock {<br>
 struct MSFLayout {<br>
   MSFLayout() : SB(nullptr) {}<br>
   const SuperBlock *SB;<br>
+  BitVector FreePageMap;<br>
   ArrayRef<support::ulittle32_t> DirectoryBlocks;<br>
   ArrayRef<support::ulittle32_t> StreamSizes;<br>
   std::vector<ArrayRef<support::ulittle32_t>> StreamMap;<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp Fri Jul 29 16:38:00 2016<br>
@@ -104,6 +104,7 @@ Error PDBFile::setBlockData(uint32_t Blo<br>
 Error PDBFile::parseFileHeaders() {<br>
   StreamReader Reader(*Buffer);<br>
<br>
+  // Initialize SB.<br>
   const msf::SuperBlock *SB = nullptr;<br>
   if (auto EC = Reader.readObject(SB)) {<br>
     consumeError(std::move(EC));<br>
@@ -119,6 +120,16 @@ Error PDBFile::parseFileHeaders() {<br>
                                 "File size is not a multiple of block size");<br>
   ContainerLayout.SB = SB;<br>
<br>
+  // Initialize Free Page Map.<br>
+  ContainerLayout.FreePageMap.resize(getBlockSize() * 8);<br>
+  uint64_t FPMOffset = SB->FreeBlockMapBlock * getBlockSize();<br>
+  ArrayRef<uint8_t> FPMBlock;<br>
+  if (auto EC = Buffer->readBytes(FPMOffset, getBlockSize(), FPMBlock))<br>
+    return EC;<br>
+  for (uint32_t I = 0, E = getBlockSize() * 8; I != E; ++I)<br>
+    if (FPMBlock[I / 8] & (1 << (I % 8)))<br>
+      ContainerLayout.FreePageMap[I] = true;<br>
+<br>
   Reader.setOffset(getBlockMapOffset());<br>
   if (auto EC = Reader.readArray(ContainerLayout.DirectoryBlocks,<br>
                                  getNumDirectoryBlocks()))<br>
<br>
Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test (original)<br>
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test Fri Jul 29 16:38:00 2016<br>
@@ -2,7 +2,7 @@<br>
 ; RUN:              -sym-record-bytes -publics -module-files -stream-name=/names \<br>
 ; RUN:              -stream-summary -stream-blocks -ipi-records -ipi-record-bytes \<br>
 ; RUN:              -section-contribs -section-map -section-headers -line-info \<br>
-; RUN:              -tpi-hash -fpo %p/Inputs/empty.pdb | FileCheck -check-prefix=EMPTY %s<br>
+; RUN:              -tpi-hash -fpo -fpm %p/Inputs/empty.pdb | FileCheck -check-prefix=EMPTY %s<br>
 ; RUN: llvm-pdbdump raw -all %p/Inputs/empty.pdb | FileCheck -check-prefix=ALL %s<br>
 ; RUN: llvm-pdbdump raw -headers -stream-name=/names -modules -module-files \<br>
 ; RUN:              %p/Inputs/big-read.pdb | FileCheck -check-prefix=BIG %s<br>
@@ -38,6 +38,7 @@<br>
 ; EMPTY-NEXT:   Stream 15: [TPI Hash] (308 bytes)<br>
 ; EMPTY-NEXT:   Stream 16: [IPI Hash] (68 bytes)<br>
 ; EMPTY-NEXT: ]<br>
+; EMPTY-NEXT: Used Page Map: [0, 1, 2, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]<br>
 ; EMPTY-NEXT: StreamBlocks [<br>
 ; EMPTY-NEXT:   Stream 0: [8]<br>
 ; EMPTY-NEXT:   Stream 1: [19]<br>
@@ -973,6 +974,7 @@<br>
 ; ALL:   Stream 15: [TPI Hash] (308 bytes)<br>
 ; ALL:   Stream 16: [IPI Hash] (68 bytes)<br>
 ; ALL: ]<br>
+; ALL: Used Page Map: [0, 1, 2, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]<br>
 ; ALL: StreamBlocks [<br>
 ; ALL:   Stream 0: [8]<br>
 ; ALL:   Stream 1: [19]<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp Fri Jul 29 16:38:00 2016<br>
@@ -50,6 +50,9 @@ Error LLVMOutputStyle::dump() {<br>
   if (auto EC = dumpStreamSummary())<br>
     return EC;<br>
<br>
+  if (auto EC = dumpFreePageMap())<br>
+    return EC;<br>
+<br>
   if (auto EC = dumpStreamBlocks())<br>
     return EC;<br>
<br>
@@ -234,6 +237,22 @@ Error LLVMOutputStyle::dumpStreamSummary<br>
   return Error::success();<br>
 }<br>
<br>
+Error LLVMOutputStyle::dumpFreePageMap() {<br>
+  if (!opts::raw::DumpFreePageMap)<br>
+    return Error::success();<br>
+  const BitVector &FPM = File.getMsfLayout().FreePageMap;<br>
+<br>
+  std::vector<uint32_t> Vec;<br>
+  for (uint32_t I = 0, E = FPM.size(); I != E; ++I)<br>
+    if (!FPM[I])<br>
+      Vec.push_back(I);<br>
+<br>
+  // Prints out used pages instead of free pages because<br>
+  // the number of free pages is far larger than used pages.<br>
+  P.printList("Used Page Map", Vec);<br>
+  return Error::success();<br>
+}<br>
+<br>
 Error LLVMOutputStyle::dumpStreamBlocks() {<br>
   if (!opts::raw::DumpStreamBlocks)<br>
     return Error::success();<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h Fri Jul 29 16:38:00 2016<br>
@@ -26,6 +26,7 @@ public:<br>
 private:<br>
   Error dumpFileHeaders();<br>
   Error dumpStreamSummary();<br>
+  Error dumpFreePageMap();<br>
   Error dumpStreamBlocks();<br>
   Error dumpStreamData();<br>
   Error dumpInfoStream();<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Fri Jul 29 16:38:00 2016<br>
@@ -167,6 +167,8 @@ cl::opt<bool> DumpStreamBlocks("stream-b<br>
 cl::opt<bool> DumpStreamSummary("stream-summary",<br>
                                 cl::desc("dump summary of the PDB streams"),<br>
                                 cl::cat(MsfOptions), cl::sub(RawSubcommand));<br>
+cl::opt<bool> DumpFreePageMap("fpm", cl::desc("dump free page bitmap"),<br>
+                              cl::cat(MsfOptions), cl::sub(RawSubcommand));<br>
<br>
 // TYPE OPTIONS<br>
 cl::opt<bool><br>
@@ -542,6 +544,7 @@ int main(int argc_, const char *argv_[])<br>
     opts::raw::DumpPublics = true;<br>
     opts::raw::DumpSectionHeaders = true;<br>
     opts::raw::DumpStreamSummary = true;<br>
+    opts::raw::DumpFreePageMap = true;<br>
     opts::raw::DumpStreamBlocks = true;<br>
     opts::raw::DumpTpiRecords = true;<br>
     opts::raw::DumpTpiHash = true;<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h?rev=277216&r1=277215&r2=277216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h?rev=277216&r1=277215&r2=277216&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h Fri Jul 29 16:38:00 2016<br>
@@ -37,6 +37,7 @@ namespace raw {<br>
 extern llvm::cl::opt<bool> DumpHeaders;<br>
 extern llvm::cl::opt<bool> DumpStreamBlocks;<br>
 extern llvm::cl::opt<bool> DumpStreamSummary;<br>
+extern llvm::cl::opt<bool> DumpFreePageMap;<br>
 extern llvm::cl::opt<bool> DumpTpiHash;<br>
 extern llvm::cl::opt<bool> DumpTpiRecordBytes;<br>
 extern llvm::cl::opt<bool> DumpTpiRecords;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a>llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote>
</div></div></blockquote></div><br></div>