[llvm] r305531 - [llvm-pdbutil] Add a function for iterating over debug subsections.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 15 16:59:56 PDT 2017


Author: zturner
Date: Thu Jun 15 18:59:56 2017
New Revision: 305531

URL: http://llvm.org/viewvc/llvm-project?rev=305531&view=rev
Log:
[llvm-pdbutil] Add a function for iterating over debug subsections.

NFC, just adds a helper function to reduce boilerplate.

Modified:
    llvm/trunk/tools/llvm-pdbutil/RawOutputStyle.cpp

Modified: llvm/trunk/tools/llvm-pdbutil/RawOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/RawOutputStyle.cpp?rev=305531&r1=305530&r2=305531&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/RawOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/RawOutputStyle.cpp Thu Jun 15 18:59:56 2017
@@ -16,6 +16,7 @@
 #include "StreamUtil.h"
 #include "llvm-pdbutil.h"
 
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
 #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
@@ -338,32 +339,6 @@ static std::string formatChecksumKind(Fi
   return formatUnknownEnum(Kind);
 }
 
-template <typename Callback>
-static void iterateModules(PDBFile &File, LinePrinter &P, uint32_t IndentLevel,
-                           Callback Fn) {
-  AutoIndent Indent(P);
-  if (!File.hasPDBDbiStream()) {
-    P.formatLine("DBI Stream not present");
-    return;
-  }
-
-  ExitOnError Err("Unexpected error processing modules");
-
-  auto &Stream = Err(File.getPDBDbiStream());
-
-  const DbiModuleList &Modules = Stream.modules();
-  uint32_t Count = Modules.getModuleCount();
-  uint32_t Digits = NumDigits(Count);
-  for (uint32_t I = 0; I < Count; ++I) {
-    auto Modi = Modules.getModuleDescriptor(I);
-    P.formatLine("Mod {0:4} | `{1}`: ", fmt_align(I, AlignStyle::Right, Digits),
-                 Modi.getModuleName());
-
-    AutoIndent Indent2(P, IndentLevel);
-    Fn(I, Modi);
-  }
-}
-
 namespace {
 class StringsAndChecksumsPrinter {
   const DebugStringTableSubsectionRef &extractStringTable(PDBFile &File) {
@@ -452,6 +427,63 @@ public:
 };
 } // namespace
 
+template <typename CallbackT>
+static void iterateModules(PDBFile &File, LinePrinter &P, uint32_t IndentLevel,
+                           CallbackT Callback) {
+  AutoIndent Indent(P);
+  if (!File.hasPDBDbiStream()) {
+    P.formatLine("DBI Stream not present");
+    return;
+  }
+
+  ExitOnError Err("Unexpected error processing modules");
+
+  auto &Stream = Err(File.getPDBDbiStream());
+
+  const DbiModuleList &Modules = Stream.modules();
+  uint32_t Count = Modules.getModuleCount();
+  uint32_t Digits = NumDigits(Count);
+  for (uint32_t I = 0; I < Count; ++I) {
+    auto Modi = Modules.getModuleDescriptor(I);
+    P.formatLine("Mod {0:4} | `{1}`: ", fmt_align(I, AlignStyle::Right, Digits),
+                 Modi.getModuleName());
+
+    StringsAndChecksumsPrinter Strings(File, I);
+    AutoIndent Indent2(P, IndentLevel);
+    Callback(I, Strings);
+  }
+}
+
+template <typename SubsectionT>
+static void iterateModuleSubsections(
+    PDBFile &File, LinePrinter &P, uint32_t IndentLevel,
+    llvm::function_ref<void(uint32_t, StringsAndChecksumsPrinter &,
+                            SubsectionT &)>
+        Callback) {
+
+  iterateModules(
+      File, P, IndentLevel,
+      [&File, &Callback](uint32_t Modi, StringsAndChecksumsPrinter &Strings) {
+        auto MDS = getModuleDebugStream(File, Modi);
+        if (!MDS) {
+          consumeError(MDS.takeError());
+          return;
+        }
+
+        for (const auto &SS : MDS->subsections()) {
+          SubsectionT Subsection;
+
+          if (SS.kind() != Subsection.kind())
+            continue;
+
+          BinaryStreamReader Reader(SS.getRecordData());
+          if (auto EC = Subsection.initialize(Reader))
+            continue;
+          Callback(Modi, Strings, Subsection);
+        }
+      });
+}
+
 Error RawOutputStyle::dumpModules() {
   printHeader(P, "Modules");
 
@@ -485,16 +517,16 @@ Error RawOutputStyle::dumpModuleFiles()
 
   ExitOnError Err("Unexpected error processing modules");
 
-  iterateModules(File, P, 11,
-                 [this, &Err](uint32_t I, const DbiModuleDescriptor &Modi) {
-                   auto &Stream = Err(File.getPDBDbiStream());
-                   StringsAndChecksumsPrinter Strings(File, I);
-
-                   const DbiModuleList &Modules = Stream.modules();
-                   for (const auto &F : Modules.source_files(I)) {
-                     Strings.formatFromFileName(P, F);
-                   }
-                 });
+  iterateModules(
+      File, P, 11,
+      [this, &Err](uint32_t Modi, StringsAndChecksumsPrinter &Strings) {
+        auto &Stream = Err(File.getPDBDbiStream());
+
+        const DbiModuleList &Modules = Stream.modules();
+        for (const auto &F : Modules.source_files(Modi)) {
+          Strings.formatFromFileName(P, F);
+        }
+      });
   return Error::success();
 }
 
@@ -536,49 +568,33 @@ Error RawOutputStyle::dumpLines() {
   printHeader(P, "Lines");
   ExitOnError Err("Unexpected error processing modules");
 
-  iterateModules(
-      File, P, 4, [this](uint32_t I, const DbiModuleDescriptor &Modi) {
-
-        auto MDS = getModuleDebugStream(File, I);
-        if (!MDS) {
-          consumeError(MDS.takeError());
-          return;
-        }
-
-        StringsAndChecksumsPrinter Strings(File, I);
-
-        uint32_t LastNameIndex = UINT32_MAX;
-        for (const auto &SS : MDS->subsections()) {
-          if (SS.kind() != DebugSubsectionKind::Lines)
-            continue;
-
-          DebugLinesSubsectionRef Lines;
-          BinaryStreamReader Reader(SS.getRecordData());
-          if (auto EC = Lines.initialize(Reader)) {
-            P.formatLine("Line information not present");
-            continue;
+  uint32_t LastModi = UINT32_MAX;
+  uint32_t LastNameIndex = UINT32_MAX;
+  iterateModuleSubsections<DebugLinesSubsectionRef>(
+      File, P, 4,
+      [this, &LastModi, &LastNameIndex](uint32_t Modi,
+                                        StringsAndChecksumsPrinter &Strings,
+                                        DebugLinesSubsectionRef &Lines) {
+        uint16_t Segment = Lines.header()->RelocSegment;
+        uint32_t Begin = Lines.header()->RelocOffset;
+        uint32_t End = Begin + Lines.header()->CodeSize;
+        for (const auto &Block : Lines) {
+          if (LastModi != Modi || LastNameIndex != Block.NameIndex) {
+            LastModi = Modi;
+            LastNameIndex = Block.NameIndex;
+            Strings.formatFromChecksumsOffset(P, Block.NameIndex);
           }
 
-          uint16_t Segment = Lines.header()->RelocSegment;
-          uint32_t Begin = Lines.header()->RelocOffset;
-          uint32_t End = Begin + Lines.header()->CodeSize;
-          for (const auto &Block : Lines) {
-            if (Block.NameIndex != LastNameIndex) {
-              Strings.formatFromChecksumsOffset(P, Block.NameIndex);
-              LastNameIndex = Block.NameIndex;
-            }
-
-            AutoIndent Indent(P, 2);
-            P.formatLine("{0:X-4}:{1:X-8}-{2:X-8}, ", Segment, Begin, End);
-            uint32_t Count = Block.LineNumbers.size();
-            if (Lines.hasColumnInfo())
-              P.format("line/column/addr entries = {0}", Count);
-            else
-              P.format("line/addr entries = {0}", Count);
+          AutoIndent Indent(P, 2);
+          P.formatLine("{0:X-4}:{1:X-8}-{2:X-8}, ", Segment, Begin, End);
+          uint32_t Count = Block.LineNumbers.size();
+          if (Lines.hasColumnInfo())
+            P.format("line/column/addr entries = {0}", Count);
+          else
+            P.format("line/addr entries = {0}", Count);
 
-            P.NewLine();
-            typesetLinesAndColumns(File, P, Begin, Block);
-          }
+          P.NewLine();
+          typesetLinesAndColumns(File, P, Begin, Block);
         }
       });
 
@@ -589,35 +605,17 @@ Error RawOutputStyle::dumpInlineeLines()
   printHeader(P, "Inlinee Lines");
   ExitOnError Err("Unexpected error processing modules");
 
-  iterateModules(
-      File, P, 2, [this](uint32_t I, const DbiModuleDescriptor &Modi) {
-
-        auto MDS = getModuleDebugStream(File, I);
-        if (!MDS) {
-          consumeError(MDS.takeError());
-          return;
-        }
-
-        StringsAndChecksumsPrinter Strings(File, I);
-
-        for (const auto &SS : MDS->subsections()) {
-          if (SS.kind() != DebugSubsectionKind::InlineeLines)
-            continue;
-
-          DebugInlineeLinesSubsectionRef Lines;
-          BinaryStreamReader Reader(SS.getRecordData());
-          if (auto EC = Lines.initialize(Reader)) {
-            continue;
-          }
-          P.formatLine("{0,+8} | {1,+5} | {2}", "Inlinee", "Line",
-                       "Source File");
-          for (const auto &Entry : Lines) {
-            P.formatLine("{0,+8} | {1,+5} | ", Entry.Header->Inlinee,
-                         fmtle(Entry.Header->SourceLineNum));
-            Strings.formatFromChecksumsOffset(P, Entry.Header->FileID, true);
-          }
-          P.NewLine();
+  iterateModuleSubsections<DebugInlineeLinesSubsectionRef>(
+      File, P, 2,
+      [this](uint32_t Modi, StringsAndChecksumsPrinter &Strings,
+             DebugInlineeLinesSubsectionRef &Lines) {
+        P.formatLine("{0,+8} | {1,+5} | {2}", "Inlinee", "Line", "Source File");
+        for (const auto &Entry : Lines) {
+          P.formatLine("{0,+8} | {1,+5} | ", Entry.Header->Inlinee,
+                       fmtle(Entry.Header->SourceLineNum));
+          Strings.formatFromChecksumsOffset(P, Entry.Header->FileID, true);
         }
+        P.NewLine();
       });
 
   return Error::success();




More information about the llvm-commits mailing list