[llvm] r271622 - [pdb] Dump file checksums from pdb codeview line info.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 2 21:01:52 PDT 2016


Author: zturner
Date: Thu Jun  2 23:01:48 2016
New Revision: 271622

URL: http://llvm.org/viewvc/llvm-project?rev=271622&view=rev
Log:
[pdb] Dump file checksums from pdb codeview line info.

Modified:
    llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h
    llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp
    llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp
    llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h?rev=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h Thu Jun  2 23:01:48 2016
@@ -537,6 +537,13 @@ enum class ThunkOrdinal {
 };
 
 enum class TrampolineType { TrampIncremental, BranchIsland };
+
+// These values correspond to the CV_SourceChksum_t enumeration.
+enum class FileChecksumKind : uint8_t { None, MD5, SHA1, SHA256 };
+
+enum LineFlags : uint32_t {
+  HaveColumns = 1, // CV_LINES_HAVE_COLUMNS
+};
 }
 }
 

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h?rev=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h Thu Jun  2 23:01:48 2016
@@ -27,6 +27,7 @@ ArrayRef<EnumEntry<uint32_t>> getFrameCo
 ArrayRef<EnumEntry<SourceLanguage>> getSourceLanguageNames();
 ArrayRef<EnumEntry<uint32_t>> getCompileSym2FlagNames();
 ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames();
+ArrayRef<EnumEntry<uint32_t>> getFileChecksumNames();
 ArrayRef<EnumEntry<unsigned>> getCPUTypeNames();
 ArrayRef<EnumEntry<uint32_t>> getFrameProcSymFlagNames();
 ArrayRef<EnumEntry<uint16_t>> getExportSymFlagNames();

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h?rev=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h Thu Jun  2 23:01:48 2016
@@ -141,13 +141,6 @@ struct InlineeSourceLine {
   //   ulittle32_t Files[];
 };
 
-enum class FileChecksumKind : uint8_t {
-  None,
-  MD5,
-  SHA1,
-  SHA256
-};
-
 struct FileChecksum {
   ulittle32_t FileNameOffset; // Offset of filename in string table substream.
   uint8_t ChecksumSize;
@@ -155,10 +148,6 @@ struct FileChecksum {
   // Checksum bytes follow.
 };
 
-enum LineFlags : uint32_t {
-  HaveColumns = 1, // CV_LINES_HAVE_COLUMNS
-};
-
 } // namespace codeview
 } // namespace llvm
 

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h?rev=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h Thu Jun  2 23:01:48 2016
@@ -26,9 +26,9 @@ struct LineColumnEntry {
   FixedStreamArray<ColumnNumberEntry> Columns;
 };
 
-class FileLineInfoExtractor {
+template <> class VarStreamArrayExtractor<LineColumnEntry> {
 public:
-  FileLineInfoExtractor(const LineSubstreamHeader *Header) : Header(Header) {}
+  VarStreamArrayExtractor(const LineSubstreamHeader *Header) : Header(Header) {}
 
   Error operator()(StreamRef Stream, uint32_t &Len,
                    LineColumnEntry &Item) const {
@@ -64,7 +64,31 @@ private:
   const LineSubstreamHeader *Header;
 };
 
-typedef VarStreamArray<LineColumnEntry, FileLineInfoExtractor> LineInfoArray;
+struct FileChecksumEntry {
+  uint32_t FileNameOffset;
+  FileChecksumKind Kind;
+  ArrayRef<uint8_t> Checksum;
+};
+
+template <> class VarStreamArrayExtractor<FileChecksumEntry> {
+public:
+  Error operator()(StreamRef Stream, uint32_t &Len,
+                   FileChecksumEntry &Item) const {
+    const FileChecksum *Header;
+    StreamReader Reader(Stream);
+    if (auto EC = Reader.readObject(Header))
+      return EC;
+    Item.FileNameOffset = Header->FileNameOffset;
+    Item.Kind = static_cast<FileChecksumKind>(Header->ChecksumKind);
+    if (auto EC = Reader.readBytes(Item.Checksum, Header->ChecksumSize))
+      return EC;
+    Len = sizeof(FileChecksum) + Header->ChecksumSize;
+    return Error::success();
+  }
+};
+
+typedef VarStreamArray<LineColumnEntry> LineInfoArray;
+typedef VarStreamArray<FileChecksumEntry> FileChecksumArray;
 
 class IModuleSubstreamVisitor {
 public:
@@ -73,9 +97,10 @@ public:
   virtual Error visitUnknown(ModuleSubstreamKind Kind, StreamRef Data) = 0;
   virtual Error visitSymbols(StreamRef Data);
   virtual Error visitLines(StreamRef Data, const LineSubstreamHeader *Header,
-                           LineInfoArray Lines);
+                           const LineInfoArray &Lines);
   virtual Error visitStringTable(StreamRef Data);
-  virtual Error visitFileChecksums(StreamRef Data);
+  virtual Error visitFileChecksums(StreamRef Data,
+                                   const FileChecksumArray &Checksums);
   virtual Error visitFrameData(StreamRef Data);
   virtual Error visitInlineeLines(StreamRef Data);
   virtual Error visitCrossScopeImports(StreamRef Data);

Modified: llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp?rev=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp Thu Jun  2 23:01:48 2016
@@ -147,6 +147,13 @@ static const EnumEntry<uint32_t> Compile
     CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp),
 };
 
+static const EnumEntry<uint32_t> FileChecksumNames[] = {
+    CV_ENUM_CLASS_ENT(FileChecksumKind, None),
+    CV_ENUM_CLASS_ENT(FileChecksumKind, MD5),
+    CV_ENUM_CLASS_ENT(FileChecksumKind, SHA1),
+    CV_ENUM_CLASS_ENT(FileChecksumKind, SHA256),
+};
+
 static const EnumEntry<unsigned> CPUTypeNames[] = {
     CV_ENUM_CLASS_ENT(CPUType, Intel8080),
     CV_ENUM_CLASS_ENT(CPUType, Intel8086),
@@ -339,6 +346,9 @@ ArrayRef<EnumEntry<uint32_t>> getCompile
 ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames() {
   return makeArrayRef(CompileSym3FlagNames);
 }
+ArrayRef<EnumEntry<uint32_t>> getFileChecksumNames() {
+  return makeArrayRef(FileChecksumNames);
+}
 ArrayRef<EnumEntry<unsigned>> getCPUTypeNames() {
   return makeArrayRef(CPUTypeNames);
 }

Modified: llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp?rev=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp Thu Jun  2 23:01:48 2016
@@ -17,13 +17,14 @@ Error IModuleSubstreamVisitor::visitSymb
 }
 Error IModuleSubstreamVisitor::visitLines(StreamRef Data,
                                           const LineSubstreamHeader *Header,
-                                          LineInfoArray Lines) {
+                                          const LineInfoArray &Lines) {
   return visitUnknown(ModuleSubstreamKind::Lines, Data);
 }
 Error IModuleSubstreamVisitor::visitStringTable(StreamRef Data) {
   return visitUnknown(ModuleSubstreamKind::StringTable, Data);
 }
-Error IModuleSubstreamVisitor::visitFileChecksums(StreamRef Data) {
+Error IModuleSubstreamVisitor::visitFileChecksums(
+    StreamRef Data, const FileChecksumArray &Checksums) {
   return visitUnknown(ModuleSubstreamKind::FileChecksums, Data);
 }
 Error IModuleSubstreamVisitor::visitFrameData(StreamRef Data) {
@@ -64,7 +65,7 @@ Error llvm::codeview::visitModuleSubstre
     const LineSubstreamHeader *Header;
     if (auto EC = Reader.readObject(Header))
       return EC;
-    FileLineInfoExtractor E(Header);
+    VarStreamArrayExtractor<LineColumnEntry> E(Header);
     LineInfoArray LineInfos(E);
     if (auto EC = Reader.readArray(LineInfos, Reader.bytesRemaining()))
       return EC;
@@ -72,8 +73,13 @@ Error llvm::codeview::visitModuleSubstre
   }
   case ModuleSubstreamKind::StringTable:
     return V.visitStringTable(R.getRecordData());
-  case ModuleSubstreamKind::FileChecksums:
-    return V.visitFileChecksums(R.getRecordData());
+  case ModuleSubstreamKind::FileChecksums: {
+    StreamReader Reader(R.getRecordData());
+    FileChecksumArray Checksums;
+    if (auto EC = Reader.readArray(Checksums, Reader.bytesRemaining()))
+      return EC;
+    return V.visitFileChecksums(R.getRecordData(), Checksums);
+  }
   case ModuleSubstreamKind::FrameData:
     return V.visitFrameData(R.getRecordData());
   case ModuleSubstreamKind::InlineeLines:

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=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test Thu Jun  2 23:01:48 2016
@@ -70,9 +70,9 @@
 ; EMPTY-NEXT:   Version: 1
 ; EMPTY-NEXT:   Name Count: 4
 ; EMPTY-NEXT:   Names [
-; EMPTY-NEXT:     d:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)
-; EMPTY-NEXT:     d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-; EMPTY-NEXT:     $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
+; EMPTY-NEXT:     1: d:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)
+; EMPTY-NEXT:     86: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
+; EMPTY-NEXT:     134: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
 ; EMPTY-NEXT:   ]
 ; EMPTY-NEXT: }
 ; EMPTY-NEXT: Type Info Stream (TPI) {
@@ -351,17 +351,15 @@
 ; EMPTY-NEXT:             EndDelta: 0
 ; EMPTY-NEXT:             IsStatement: Yes
 ; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Data (
-; EMPTY-NEXT:             0000: 10000000 01000000 0A000000 00000000  |................|
-; EMPTY-NEXT:             0010: 03000000 24000000 00000000 05000080  |....$...........|
-; EMPTY-NEXT:             0020: 03000000 06000080 08000000 07000080  |................|
-; EMPTY-NEXT:           )
 ; EMPTY-NEXT:         }
 ; EMPTY-NEXT:         FileChecksums {
-; EMPTY-NEXT:           Data (
-; EMPTY-NEXT:             0000: 56000000 1001A0A5 BD0D3ECD 93FC29D1  |V.........>...).|
-; EMPTY-NEXT:             0010: 9DE826FB F4BC0000                    |..&.....|
-; EMPTY-NEXT:           )
+; EMPTY-NEXT:           Checksum {
+; EMPTY-NEXT:             FileNameOffset: 86
+; EMPTY-NEXT:             Kind: MD5 (0x1)
+; EMPTY-NEXT:             Checksum (
+; EMPTY-NEXT:               0000: A0A5BD0D 3ECD93FC 29D19DE8 26FBF4BC  |....>...)...&...|
+; EMPTY-NEXT:             )
+; EMPTY-NEXT:           }
 ; EMPTY-NEXT:         }
 ; EMPTY-NEXT:       ]
 ; EMPTY-NEXT:     }

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=271622&r1=271621&r2=271622&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Thu Jun  2 23:01:48 2016
@@ -427,7 +427,7 @@ static Error dumpNamedStream(ScopedPrint
     for (uint32_t ID : NameTable.name_ids()) {
       StringRef Str = NameTable.getStringForID(ID);
       if (!Str.empty())
-        P.printString(Str);
+        P.printString(to_string(ID), Str);
     }
   }
   return Error::success();
@@ -528,13 +528,21 @@ static Error dumpDbiStream(ScopedPrinter
               DictScope DD(P, "Unknown");
               return printBinaryData(Data);
             }
-            Error visitFileChecksums(StreamRef Data) override {
+            Error
+            visitFileChecksums(StreamRef Data,
+                               const FileChecksumArray &Checksums) override {
               DictScope DD(P, "FileChecksums");
-              return printBinaryData(Data);
+              for (const auto &C : Checksums) {
+                DictScope DDD(P, "Checksum");
+                P.printNumber("FileNameOffset", C.FileNameOffset);
+                P.printEnum("Kind", uint8_t(C.Kind), getFileChecksumNames());
+                P.printBinaryBlock("Checksum", C.Checksum);
+              }
+              return Error::success();
             }
 
             Error visitLines(StreamRef Data, const LineSubstreamHeader *Header,
-                             LineInfoArray Lines) override {
+                             const LineInfoArray &Lines) override {
               DictScope DD(P, "Lines");
               for (const auto &L : Lines) {
                 P.printNumber("FileOffset", L.Offset);
@@ -557,7 +565,7 @@ static Error dumpDbiStream(ScopedPrinter
                   P.printNumber("End", C.EndColumn);
                 }
               }
-              return printBinaryData(Data);
+              return Error::success();
             }
 
           private:




More information about the llvm-commits mailing list