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