diff options
author | Rui Ueyama <ruiu@google.com> | 2016-07-29 21:38:00 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-07-29 21:38:00 +0000 |
commit | 7a5cdc6225b9dec81d1e696c7904ed61d541b48d (patch) | |
tree | af487d899585f2a2ad0eca419417db241118983a | |
parent | 1ed39291a5e87082461cf6c93b7516ccd0f20c96 (diff) | |
download | bcm5719-llvm-7a5cdc6225b9dec81d1e696c7904ed61d541b48d.tar.gz bcm5719-llvm-7a5cdc6225b9dec81d1e696c7904ed61d541b48d.zip |
pdbdump: Dump Free Page Map contents.
Differential Revision: https://reviews.llvm.org/D22974
llvm-svn: 277216
-rw-r--r-- | llvm/include/llvm/DebugInfo/MSF/MSFCommon.h | 2 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp | 11 | ||||
-rw-r--r-- | llvm/test/DebugInfo/PDB/pdbdump-headers.test | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp | 19 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/LLVMOutputStyle.h | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.h | 1 |
7 files changed, 40 insertions, 1 deletions
diff --git a/llvm/include/llvm/DebugInfo/MSF/MSFCommon.h b/llvm/include/llvm/DebugInfo/MSF/MSFCommon.h index 58e6a1af426..5cf784e5868 100644 --- a/llvm/include/llvm/DebugInfo/MSF/MSFCommon.h +++ b/llvm/include/llvm/DebugInfo/MSF/MSFCommon.h @@ -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; diff --git a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp index ddc8102d1fe..533242fdb81 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp @@ -104,6 +104,7 @@ Error PDBFile::setBlockData(uint32_t BlockIndex, uint32_t Offset, 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())) diff --git a/llvm/test/DebugInfo/PDB/pdbdump-headers.test b/llvm/test/DebugInfo/PDB/pdbdump-headers.test index dc8119eb756..c94ebbb1d8c 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-headers.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-headers.test @@ -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] diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp index 9ce6a51ca91..f8eff769947 100644 --- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp +++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp @@ -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(); diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h index 77935d10220..6e7783325ff 100644 --- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h +++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h @@ -26,6 +26,7 @@ public: private: Error dumpFileHeaders(); Error dumpStreamSummary(); + Error dumpFreePageMap(); Error dumpStreamBlocks(); Error dumpStreamData(); Error dumpInfoStream(); diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index 896c9cee557..2b39dcf9e0d 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -167,6 +167,8 @@ cl::opt<bool> DumpStreamBlocks("stream-blocks", 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; diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h index 510dd465080..89c7417d3e2 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h @@ -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; |