summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/test/tools/llvm-pdbdump/explain.test3
-rw-r--r--llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp40
2 files changed, 36 insertions, 7 deletions
diff --git a/llvm/test/tools/llvm-pdbdump/explain.test b/llvm/test/tools/llvm-pdbdump/explain.test
index e65027bdabb..d76e86add2d 100644
--- a/llvm/test/tools/llvm-pdbdump/explain.test
+++ b/llvm/test/tools/llvm-pdbdump/explain.test
@@ -40,6 +40,7 @@ FORTY: Block:Offset = 0:0028.
FORTY-NEXT: Address is in block 0 (allocated).
FORTY-NEXT: This corresponds to offset 40 of the MSF super block,
FORTY-NEXT: which contains the number of blocks in the file.
+FORTY-NEXT: The current value is 29.
SIXTY: Block:Offset = 0:003C.
SIXTY-NEXT: Address is in block 0 (allocated).
@@ -50,6 +51,7 @@ FPM1: Block:Offset = 1:0000.
FPM1-NEXT: Address is in block 1 (allocated).
FPM1-NEXT: Address is in FPM1 (Alt FPM)
FPM1-NEXT: Address describes the allocation status of blocks [0,8)
+FPM1-NEXT: Status = 00000011 (Note: 0 = allocated, 1 = free)
EXTRANEOUSFPM: Block:Offset = 1:0100.
EXTRANEOUSFPM-NEXT: Address is in block 1 (allocated).
@@ -60,6 +62,7 @@ FPM2: Block:Offset = 2:0000.
FPM2-NEXT: Address is in block 2 (allocated).
FPM2-NEXT: Address is in FPM2 (Main FPM)
FPM2-NEXT: Address describes the allocation status of blocks [0,8)
+FPM2-NEXT: Status = 00011100 (Note: 0 = allocated, 1 = free)
UNALLOCATED: Block:Offset = 3:0000.
UNALLOCATED-NEXT: Address is in block 3 (unallocated).
diff --git a/llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp b/llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp
index 229cf9f9ffb..c4fbde22e75 100644
--- a/llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp
@@ -103,25 +103,47 @@ void ExplainOutputStyle::explainSuperBlockOffset() {
OffsetInBlock);
if (OffsetInBlock < endof(SuperBlock, MagicBytes))
P.printLine("which is part of the MSF file magic.");
- else if (OffsetInBlock < endof(SuperBlock, BlockSize))
+ else if (OffsetInBlock < endof(SuperBlock, BlockSize)) {
P.printLine("which contains the block size of the file.");
- else if (OffsetInBlock < endof(SuperBlock, FreeBlockMapBlock))
+ P.formatLine("The current value is {0}.",
+ uint32_t(File.getMsfLayout().SB->BlockSize));
+ } else if (OffsetInBlock < endof(SuperBlock, FreeBlockMapBlock)) {
P.printLine("which contains the index of the FPM block (e.g. 1 or 2).");
- else if (OffsetInBlock < endof(SuperBlock, NumBlocks))
+ P.formatLine("The current value is {0}.",
+ uint32_t(File.getMsfLayout().SB->FreeBlockMapBlock));
+ } else if (OffsetInBlock < endof(SuperBlock, NumBlocks)) {
P.printLine("which contains the number of blocks in the file.");
- else if (OffsetInBlock < endof(SuperBlock, NumDirectoryBytes))
+ P.formatLine("The current value is {0}.",
+ uint32_t(File.getMsfLayout().SB->NumBlocks));
+ } else if (OffsetInBlock < endof(SuperBlock, NumDirectoryBytes)) {
P.printLine("which contains the number of bytes in the stream directory.");
- else if (OffsetInBlock < endof(SuperBlock, Unknown1))
+ P.formatLine("The current value is {0}.",
+ uint32_t(File.getMsfLayout().SB->NumDirectoryBytes));
+ } else if (OffsetInBlock < endof(SuperBlock, Unknown1)) {
P.printLine("whose purpose is unknown.");
- else if (OffsetInBlock < endof(SuperBlock, BlockMapAddr))
+ P.formatLine("The current value is {0}.",
+ uint32_t(File.getMsfLayout().SB->Unknown1));
+ } else if (OffsetInBlock < endof(SuperBlock, BlockMapAddr)) {
P.printLine("which contains the file offset of the block map.");
- else {
+ P.formatLine("The current value is {0}.",
+ uint32_t(File.getMsfLayout().SB->BlockMapAddr));
+ } else {
assert(OffsetInBlock > sizeof(SuperBlock));
P.printLine(
"which is outside the range of valid data for the super block.");
}
}
+static std::string toBinaryString(uint8_t Byte) {
+ char Result[9] = {0};
+ for (int I = 0; I < 8; ++I) {
+ char C = (Byte & 1) ? '1' : '0';
+ Result[I] = C;
+ Byte >>= 1;
+ }
+ return std::string(Result);
+}
+
void ExplainOutputStyle::explainFpmBlockOffset() {
const MSFLayout &Layout = File.getMsfLayout();
uint32_t MainFpm = Layout.mainFpmBlock();
@@ -143,6 +165,10 @@ void ExplainOutputStyle::explainFpmBlockOffset() {
P.formatLine("Address describes the allocation status of blocks [{0},{1})",
DescribedBlockStart, DescribedBlockStart + 8);
+ ArrayRef<uint8_t> Bytes;
+ cantFail(File.getMsfBuffer().readBytes(FileOffset, 1, Bytes));
+ P.formatLine("Status = {0} (Note: 0 = allocated, 1 = free)",
+ toBinaryString(Bytes[0]));
}
void ExplainOutputStyle::explainBlockMapOffset() {
OpenPOWER on IntegriCloud