summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp')
-rw-r--r--llvm/tools/llvm-pdbutil/ExplainOutputStyle.cpp40
1 files changed, 33 insertions, 7 deletions
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