[PDB] Fix a bug in the explain subcommand.

We were trying to dig into the super block fields and print a
description of the field at the specified offset, but we were
printing the wrong field due to an off-by-one-field-error.

llvm-svn: 328804
GitOrigin-RevId: 1b20416bfa4ed906d5b5f289aa8a4430b9620132
diff --git a/test/tools/llvm-pdbdump/explain.test b/test/tools/llvm-pdbdump/explain.test
index 9926eb0..e65027b 100644
--- a/test/tools/llvm-pdbdump/explain.test
+++ b/test/tools/llvm-pdbdump/explain.test
@@ -33,17 +33,17 @@
 
 ZERO:      Block:Offset = 0:0000.
 ZERO-NEXT: Address is in block 0 (allocated).
-ZERO-NEXT:   This corresponds to offset 0 of MSF super block,
+ZERO-NEXT:   This corresponds to offset 0 of the MSF super block,
 ZERO-NEXT:   which is part of the MSF file magic.
 
 FORTY:      Block:Offset = 0:0028.
 FORTY-NEXT: Address is in block 0 (allocated).
-FORTY-NEXT:   This corresponds to offset 40 of MSF super block,
-FORTY-NEXT:   which contains the number of bytes in the stream directory.
+FORTY-NEXT:   This corresponds to offset 40 of the MSF super block,
+FORTY-NEXT:   which contains the number of blocks in the file.
 
 SIXTY:      Block:Offset = 0:003C.
 SIXTY-NEXT: Address is in block 0 (allocated).
-SIXTY-NEXT:   This corresponds to offset 60 of MSF super block,
+SIXTY-NEXT:   This corresponds to offset 60 of the MSF super block,
 SIXTY-NEXT:   which is outside the range of valid data for the super block.
 
 FPM1:      Block:Offset = 1:0000.
diff --git a/tools/llvm-pdbutil/ExplainOutputStyle.cpp b/tools/llvm-pdbutil/ExplainOutputStyle.cpp
index 48e8e1e..229cf9f 100644
--- a/tools/llvm-pdbutil/ExplainOutputStyle.cpp
+++ b/tools/llvm-pdbutil/ExplainOutputStyle.cpp
@@ -96,22 +96,24 @@
   return !IsFree;
 }
 
+#define endof(Class, Field) (offsetof(Class, Field) + sizeof(Class::Field))
+
 void ExplainOutputStyle::explainSuperBlockOffset() {
-  P.formatLine("This corresponds to offset {0} of MSF super block, ",
+  P.formatLine("This corresponds to offset {0} of the MSF super block, ",
                OffsetInBlock);
-  if (OffsetInBlock < sizeof(msf::Magic))
+  if (OffsetInBlock < endof(SuperBlock, MagicBytes))
     P.printLine("which is part of the MSF file magic.");
-  else if (OffsetInBlock < offsetof(SuperBlock, BlockSize))
+  else if (OffsetInBlock < endof(SuperBlock, BlockSize))
     P.printLine("which contains the block size of the file.");
-  else if (OffsetInBlock < offsetof(SuperBlock, FreeBlockMapBlock))
+  else if (OffsetInBlock < endof(SuperBlock, FreeBlockMapBlock))
     P.printLine("which contains the index of the FPM block (e.g. 1 or 2).");
-  else if (OffsetInBlock < offsetof(SuperBlock, NumBlocks))
+  else if (OffsetInBlock < endof(SuperBlock, NumBlocks))
     P.printLine("which contains the number of blocks in the file.");
-  else if (OffsetInBlock < offsetof(SuperBlock, NumDirectoryBytes))
+  else if (OffsetInBlock < endof(SuperBlock, NumDirectoryBytes))
     P.printLine("which contains the number of bytes in the stream directory.");
-  else if (OffsetInBlock < offsetof(SuperBlock, Unknown1))
+  else if (OffsetInBlock < endof(SuperBlock, Unknown1))
     P.printLine("whose purpose is unknown.");
-  else if (OffsetInBlock < offsetof(SuperBlock, BlockMapAddr))
+  else if (OffsetInBlock < endof(SuperBlock, BlockMapAddr))
     P.printLine("which contains the file offset of the block map.");
   else {
     assert(OffsetInBlock > sizeof(SuperBlock));