<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 12 April 2017 at 16:18, Zachary Turner via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: zturner<br>
Date: Wed Apr 12 18:18:51 2017<br>
New Revision: 300134<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=300134&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=300134&view=rev</a><br>
Log:<br>
[llvm-pdbdump] Minor prepatory refactor of Class Def Dumper.<br>
<br>
In a followup patch I intend to introduce an additional dumping<br>
mode which dumps a graphical representation of a class's layout.<br>
In preparation for this, the text-based layout printer needs to<br>
be split out from the graphical layout printer, and both need<br>
to be able to use the same code for printing the intro and outro<br>
of a class's definition (e.g. base class list, etc).<br>
<br>
This patch does so, and in the process introduces a skeleton<br>
definition for the graphical printer, while currently making<br>
the graphical printer just print nothing.<br>
<br>
NFC<br>
<br>
Added:<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.cpp<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.<wbr>cpp<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.h<br>
Modified:<br>
    llvm/trunk/include/llvm/<wbr>DebugInfo/PDB/UDTLayout.h<br>
    llvm/trunk/lib/DebugInfo/PDB/<wbr>UDTLayout.cpp<br>
    llvm/trunk/test/tools/llvm-<wbr>pdbdump/simple-padding.test<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>CMakeLists.txt<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.<wbr>cpp<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.h<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.cpp<br>
    llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.h<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>DebugInfo/PDB/UDTLayout.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/UDTLayout.h?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/DebugInfo/PDB/UDTLayout.<wbr>h?rev=300134&r1=300133&r2=<wbr>300134&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>DebugInfo/PDB/UDTLayout.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>DebugInfo/PDB/UDTLayout.h Wed Apr 12 18:18:51 2017<br>
@@ -95,16 +95,18 @@ public:<br>
<br>
   uint32_t getClassSize() const { return SizeOf; }<br>
<br>
-  const PDBSymbol &getSymbol() const { return Symbol; }<br>
-<br>
   ArrayRef<std::unique_ptr<<wbr>StorageItemBase>> layout_items() const {<br>
     return ChildStorage;<br>
   }<br>
<br>
+  ArrayRef<BaseClassLayout *> base_classes() const { return BaseClasses; }<br>
+<br>
   ArrayRef<std::unique_ptr<<wbr>PDBSymbol>> other_items() const {<br>
     return NonStorageItems;<br>
   }<br>
<br>
+  const PDBSymbol &getSymbolBase() const { return SymbolBase; }<br>
+<br>
 protected:<br>
   void initializeChildren(const PDBSymbol &Sym);<br>
<br>
@@ -113,7 +115,7 @@ protected:<br>
   uint32_t SizeOf = 0;<br>
   std::string Name;<br>
<br>
-  const PDBSymbol &Symbol;<br>
+  const PDBSymbol &SymbolBase;<br>
   BitVector UsedBytes;<br>
   std::vector<std::unique_ptr<<wbr>PDBSymbol>> NonStorageItems;<br>
   std::vector<std::unique_ptr<<wbr>StorageItemBase>> ChildStorage;<br>
@@ -124,10 +126,14 @@ protected:<br>
<br>
 class ClassLayout : public UDTLayoutBase {<br>
 public:<br>
+  explicit ClassLayout(const PDBSymbolTypeUDT &UDT);<br>
   explicit ClassLayout(std::unique_ptr<<wbr>PDBSymbolTypeUDT> UDT);<br>
<br>
+  const PDBSymbolTypeUDT &getClass() const { return UDT; }<br>
+<br>
 private:<br>
-  std::unique_ptr<<wbr>PDBSymbolTypeUDT> Type;<br>
+  std::unique_ptr<<wbr>PDBSymbolTypeUDT> OwnedStorage;<br>
+  const PDBSymbolTypeUDT &UDT;<br>
 };<br>
<br>
 class BaseClassLayout : public UDTLayoutBase, public StorageItemBase {<br>
@@ -135,6 +141,8 @@ public:<br>
   BaseClassLayout(const UDTLayoutBase &Parent,<br>
                   std::unique_ptr<<wbr>PDBSymbolTypeBaseClass> Base);<br>
<br>
+  const PDBSymbolTypeBaseClass &getBase() const { return *Base; }<br>
+<br>
 private:<br>
   std::unique_ptr<<wbr>PDBSymbolTypeBaseClass> Base;<br>
   bool IsVirtualBase;<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/PDB/<wbr>UDTLayout.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/UDTLayout.cpp?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>DebugInfo/PDB/UDTLayout.cpp?<wbr>rev=300134&r1=300133&r2=<wbr>300134&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/DebugInfo/PDB/<wbr>UDTLayout.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/PDB/<wbr>UDTLayout.cpp Wed Apr 12 18:18:51 2017<br>
@@ -89,7 +89,8 @@ VTableLayoutItem::<wbr>VTableLayoutItem(const<br>
           VTableType->getPointeeType())) {<br>
     VTableFuncs.resize(Shape-><wbr>getCount());<br>
<br>
-    auto ParentFunctions = Parent.getSymbol().<wbr>findAllChildren<PDBSymbolFunc><wbr>();<br>
+    auto ParentFunctions =<br>
+        Parent.getSymbolBase().<wbr>findAllChildren<PDBSymbolFunc><wbr>();<br>
     while (auto Func = ParentFunctions->getNext()) {<br>
       if (Func->isVirtual()) {<br>
         uint32_t Index = Func->getVirtualBaseOffset();<br>
@@ -109,15 +110,19 @@ VTableLayoutItem::<wbr>VTableLayoutItem(const<br>
<br>
 UDTLayoutBase::UDTLayoutBase(<wbr>const PDBSymbol &Symbol, const std::string &Name,<br>
                              uint32_t Size)<br>
-    : Symbol(Symbol), Name(Name), SizeOf(Size) {<br>
+    : SymbolBase(Symbol), Name(Name), SizeOf(Size) {<br>
   UsedBytes.resize(Size);<br>
   ChildrenPerByte.resize(Size);<br>
   initializeChildren(Symbol);<br>
 }<br>
<br>
+ClassLayout::ClassLayout(<wbr>const PDBSymbolTypeUDT &UDT)<br>
+    : UDTLayoutBase(UDT, UDT.getName(), UDT.getLength()), UDT(UDT) {}<br>
+<br>
 ClassLayout::ClassLayout(std::<wbr>unique_ptr<PDBSymbolTypeUDT> UDT)<br>
-    : UDTLayoutBase(*UDT, UDT->getName(), UDT->getLength()),<br>
-      Type(std::move(UDT)) {}<br>
+    : ClassLayout(*UDT) {<br>
+  OwnedStorage = std::move(UDT);<br>
+}<br>
<br>
 BaseClassLayout::<wbr>BaseClassLayout(const UDTLayoutBase &Parent,<br>
                                  std::unique_ptr<<wbr>PDBSymbolTypeBaseClass> Base)<br>
<br>
Modified: llvm/trunk/test/tools/llvm-<wbr>pdbdump/simple-padding.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-pdbdump/simple-padding.test?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>llvm-pdbdump/simple-padding.<wbr>test?rev=300134&r1=300133&r2=<wbr>300134&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/tools/llvm-<wbr>pdbdump/simple-padding.test (original)<br>
+++ llvm/trunk/test/tools/llvm-<wbr>pdbdump/simple-padding.test Wed Apr 12 18:18:51 2017<br>
@@ -1,4 +1,4 @@<br>
-; RUN: llvm-pdbdump pretty -classes -class-definitions=layout \<br>
+; RUN: llvm-pdbdump pretty -classes -class-definitions=layout-<wbr>members \<br>
 ; RUN:     -include-types=SimplePad %p/Inputs/SimplePaddingTest.<wbr>pdb > %t<br>
<br>
 ; RUN: FileCheck -input-file=%t %s -check-prefix=NO_PADDING<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/CMakeLists.txt?rev=<wbr>300134&r1=300133&r2=300134&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>CMakeLists.txt (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>CMakeLists.txt Wed Apr 12 18:18:51 2017<br>
@@ -18,6 +18,8 @@ add_llvm_tool(llvm-pdbdump<br>
   PdbYaml.cpp<br>
   PrettyBuiltinDumper.cpp<br>
   PrettyClassDefinitionDumper.<wbr>cpp<br>
+  PrettyClassLayoutTextDumper.<wbr>cpp<br>
+  PrettyClassLayoutGraphicalDump<wbr>er.cpp<br>
   PrettyCompilandDumper.cpp<br>
   PrettyEnumDumper.cpp<br>
   PrettyExternalSymbolDumper.cpp<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/<wbr>PrettyClassDefinitionDumper.<wbr>cpp?rev=300134&r1=300133&r2=<wbr>300134&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.<wbr>cpp (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.<wbr>cpp Wed Apr 12 18:18:51 2017<br>
@@ -10,24 +10,14 @@<br>
 #include "PrettyClassDefinitionDumper.<wbr>h"<br>
<br>
 #include "LinePrinter.h"<br>
-#include "PrettyEnumDumper.h"<br>
-#include "PrettyFunctionDumper.h"<br>
-#include "PrettyTypedefDumper.h"<br>
-#include "PrettyVariableDumper.h"<br>
+#include "<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h"<br>
+#include "PrettyClassLayoutTextDumper.<wbr>h"<br>
 #include "llvm-pdbdump.h"<br>
<br>
 #include "llvm/ADT/APFloat.h"<br>
 #include "llvm/ADT/SmallString.h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>IPDBSession.h"<br>
-#include "llvm/DebugInfo/PDB/PDBExtras.<wbr>h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolData.h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolFunc.h"<br>
 #include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeBaseClass.h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeEnum.h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypePointer.h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeTypedef.h"<br>
 #include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeUDT.h"<br>
-#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeVTable.h"<br>
 #include "llvm/DebugInfo/PDB/UDTLayout.<wbr>h"<br>
<br>
 #include "llvm/Support/Format.h"<br>
@@ -42,33 +32,57 @@ void ClassDefinitionDumper::start(<wbr>const<br>
   assert(opts::pretty::<wbr>ClassFormat !=<br>
          opts::pretty::<wbr>ClassDefinitionFormat::None);<br>
<br>
-  uint32_t Size = Class.getLength();<br>
-<br>
-  ClassLayout Layout(Class.clone());<br>
+  ClassLayout Layout(Class);<br>
<br>
   if (opts::pretty::<wbr>OnlyPaddingClasses && (Layout.shallowPaddingSize() == 0))<br>
     return;<br>
<br>
+  prettyPrintClassIntro(Layout);<br>
+<br>
+  switch (opts::pretty::ClassFormat) {<br>
+  case opts::pretty::<wbr>ClassDefinitionFormat::<wbr>Graphical: {<br>
+    PrettyClassLayoutGraphicalDump<wbr>er Dumper(Printer);<br>
+    DumpedAnything = Dumper.start(Layout);<br>
+    break;<br>
+  }<br>
+  case opts::pretty::<wbr>ClassDefinitionFormat::<wbr>Standard:<br>
+  case opts::pretty::<wbr>ClassDefinitionFormat::Layout: {<br>
+    PrettyClassLayoutTextDumper Dumper(Printer);<br>
+    DumpedAnything |= Dumper.start(Layout);<br>
+    break;<br>
+  }<br>
+  default:<br>
+    llvm_unreachable("Unreachable!<wbr>");<br>
+  }<br>
+<br>
+  prettyPrintClassOutro(Layout);<br>
+}<br>
+<br>
+void ClassDefinitionDumper::<wbr>prettyPrintClassIntro(const ClassLayout &Layout) {<br>
+  DumpedAnything = false;<br>
   Printer.NewLine();<br>
<br>
+  uint32_t Size = Layout.getClassSize();<br>
+  const PDBSymbolTypeUDT &Class = Layout.getClass();<br>
+<br>
   WithColor(Printer, PDB_ColorItem::Keyword).get() << Class.getUdtKind() << " ";<br>
   WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();<br>
   WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size<br>
                                                    << "]";<br>
-<br>
-  auto Bases = Class.findAllChildren<<wbr>PDBSymbolTypeBaseClass>();<br>
-  if (Bases->getChildCount() > 0) {<br>
+  uint32_t BaseCount = Layout.base_classes().size();<br>
+  if (BaseCount > 0) {<br>
     Printer.Indent();<br>
     Printer.NewLine();<br>
     Printer << ":";<br>
     uint32_t BaseIndex = 0;<br>
-    while (auto Base = Bases->getNext()) {<br>
+    for (auto BC : Layout.base_classes()) {<br>
+      const auto &Base = BC->getBase();<br>
       Printer << " ";<br>
-      WithColor(Printer, PDB_ColorItem::Keyword).get() << Base->getAccess();<br>
-      if (Base->isVirtualBaseClass())<br>
+      WithColor(Printer, PDB_ColorItem::Keyword).get() << Base.getAccess();<br>
+      if (Base.isVirtualBaseClass())<br>
         WithColor(Printer, PDB_ColorItem::Keyword).get() << " virtual";<br>
-      WithColor(Printer, PDB_ColorItem::Type).get() << " " << Base->getName();<br>
-      if (++BaseIndex < Bases->getChildCount()) {<br>
+      WithColor(Printer, PDB_ColorItem::Type).get() << " " << Base.getName();<br>
+      if (++BaseIndex < BaseCount) {<br>
         Printer.NewLine();<br>
         Printer << ",";<br>
       }<br>
@@ -78,49 +92,17 @@ void ClassDefinitionDumper::start(<wbr>const<br>
<br>
   Printer << " {";<br>
   Printer.Indent();<br>
+}<br>
<br>
-  // Dump non-layout items first, but only if we're not in layout-only mode.<br>
-  if (opts::pretty::ClassFormat !=<br>
-      opts::pretty::<wbr>ClassDefinitionFormat::Layout) {<br>
-    for (auto &Other : Layout.other_items())<br>
-      Other->dump(*this);<br>
-  }<br>
-<br>
-  const BitVector &UseMap = Layout.usedBytes();<br>
-  int NextUnusedByte = Layout.usedBytes().find_first_<wbr>unset();<br>
-  // Next dump items which affect class layout.<br>
-  for (auto &LayoutItem : Layout.layout_items()) {<br>
-    if (NextUnusedByte >= 0) {<br>
-      // If there are padding bytes remaining, see if this field is the first to<br>
-      // cross a padding boundary, and print a padding field indicator if so.<br>
-      int Off = LayoutItem->getOffsetInParent(<wbr>);<br>
-      if (Off > NextUnusedByte) {<br>
-        uint32_t Amount = Off - NextUnusedByte;<br>
-        Printer.NewLine();<br>
-        WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> ("<br>
-                                                         << Amount << " bytes)";<br>
-        assert(UseMap.find_next(<wbr>NextUnusedByte) == Off);<br>
-        NextUnusedByte = UseMap.find_next_unset(Off);<br>
-      }<br>
-    }<br>
-    LayoutItem->getSymbol().dump(*<wbr>this);<br>
-  }<br>
-<br>
-  if (NextUnusedByte >= 0 && Layout.getClassSize() > 1) {<br>
-    uint32_t Amount = Layout.getClassSize() - NextUnusedByte;<br>
-    Printer.NewLine();<br>
-    WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> (" << Amount<br>
-                                                     << " bytes)";<br>
-    DumpedAnything = true;<br>
-  }<br>
-<br>
+void ClassDefinitionDumper::<wbr>prettyPrintClassOutro(const ClassLayout &Layout) {<br>
   Printer.Unindent();<br>
   if (DumpedAnything)<br>
     Printer.NewLine();<br>
   Printer << "}";<br>
   Printer.NewLine();<br>
   if (Layout.deepPaddingSize() > 0) {<br>
-    APFloat Pct(100.0 * (double)Layout.<wbr>deepPaddingSize() / (double)Size);<br>
+    APFloat Pct(100.0 * (double)Layout.<wbr>deepPaddingSize() /<br>
+                (double)Layout.getClassSize())<wbr>;<br>
     SmallString<8> PctStr;<br>
     Pct.toString(PctStr, 4);<br>
     WithColor(Printer, PDB_ColorItem::Padding).get()<br>
@@ -129,54 +111,3 @@ void ClassDefinitionDumper::start(<wbr>const<br>
     Printer.NewLine();<br>
   }<br>
 }<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolTypeBaseClass &Symbol) {}<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolData &Symbol) {<br>
-  VariableDumper Dumper(Printer);<br>
-  Dumper.start(Symbol);<br>
-  DumpedAnything = true;<br>
-}<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolFunc &Symbol) {<br>
-  if (Printer.IsSymbolExcluded(<wbr>Symbol.getName()))<br>
-    return;<br>
-  if (Symbol.isCompilerGenerated() && opts::pretty::<wbr>ExcludeCompilerGenerated)<br>
-    return;<br>
-  if (Symbol.getLength() == 0 && !Symbol.isPureVirtual() &&<br>
-      !Symbol.<wbr>isIntroVirtualFunction())<br>
-    return;<br>
-<br>
-  DumpedAnything = true;<br>
-  Printer.NewLine();<br>
-  FunctionDumper Dumper(Printer);<br>
-  Dumper.start(Symbol, FunctionDumper::PointerType::<wbr>None);<br>
-}<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolTypeVTable &Symbol) {<br>
-  VariableDumper Dumper(Printer);<br>
-  Dumper.start(Symbol);<br>
-  DumpedAnything = true;<br>
-}<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolTypeEnum &Symbol) {<br>
-  if (Printer.IsTypeExcluded(<wbr>Symbol.getName()))<br>
-    return;<br>
-<br>
-  DumpedAnything = true;<br>
-  Printer.NewLine();<br>
-  EnumDumper Dumper(Printer);<br>
-  Dumper.start(Symbol);<br>
-}<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolTypeTypedef &Symbol) {<br>
-  if (Printer.IsTypeExcluded(<wbr>Symbol.getName()))<br>
-    return;<br>
-<br>
-  DumpedAnything = true;<br>
-  Printer.NewLine();<br>
-  TypedefDumper Dumper(Printer);<br>
-  Dumper.start(Symbol);<br>
-}<br>
-<br>
-void ClassDefinitionDumper::dump(<wbr>const PDBSymbolTypeUDT &Symbol) {}<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PrettyClassDefinitionDumper.h?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/<wbr>PrettyClassDefinitionDumper.h?<wbr>rev=300134&r1=300133&r2=<wbr>300134&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.h (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassDefinitionDumper.h Wed Apr 12 18:18:51 2017<br>
@@ -25,6 +25,7 @@ class BitVector;<br>
<br>
 namespace pdb {<br>
<br>
+class ClassLayout;<br>
 class LinePrinter;<br>
<br>
 class ClassDefinitionDumper : public PDBSymDumper {<br>
@@ -33,18 +34,10 @@ public:<br>
<br>
   void start(const PDBSymbolTypeUDT &Exe);<br>
<br>
-  void dump(const PDBSymbolTypeBaseClass &Symbol) override;<br>
-  void dump(const PDBSymbolData &Symbol) override;<br>
-  void dump(const PDBSymbolTypeEnum &Symbol) override;<br>
-  void dump(const PDBSymbolFunc &Symbol) override;<br>
-  void dump(const PDBSymbolTypeTypedef &Symbol) override;<br>
-  void dump(const PDBSymbolTypeUDT &Symbol) override;<br>
-  void dump(const PDBSymbolTypeVTable &Symbol) override;<br>
-<br>
 private:<br>
-  bool maybeDumpSymbol(std::unique_<wbr>ptr<PDBSymbolData> Data,<br>
-                       const BitVector &Padding, int &NextUnusedByte);<br>
-  bool maybeDumpSymbol(std::unique_<wbr>ptr<PDBSymbolFunc> Data);<br>
+  void prettyPrintClassIntro(const ClassLayout &Class);<br>
+  void prettyPrintClassOutro(const ClassLayout &Class);<br>
+<br>
   bool DumpedAnything = false;<br>
   LinePrinter &Printer;<br>
 };<br>
<br>
Added: llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp?rev=300134&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.cpp?rev=300134&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.cpp (added)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.cpp Wed Apr 12 18:18:51 2017<br>
@@ -0,0 +1,38 @@<br>
+//===- PrettyClassLayoutGraphicalDump<wbr>er.h -----------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#include "<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace llvm::pdb;<br>
+<br>
+<wbr>PrettyClassLayoutGraphicalDump<wbr>er::<wbr>PrettyClassLayoutGraphicalDump<wbr>er(<br>
+    LinePrinter &P)<br>
+    : PDBSymDumper(true), Printer(P) {}<br>
+<br>
+bool PrettyClassLayoutGraphicalDump<wbr>er::start(const ClassLayout &Layout) {<br>
+  return false;<br>
+}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(<br>
+    const PDBSymbolTypeBaseClass &Symbol) {}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(const PDBSymbolData &Symbol) {}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(const PDBSymbolTypeEnum &Symbol) {}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(const PDBSymbolFunc &Symbol) {}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(<br>
+    const PDBSymbolTypeTypedef &Symbol) {}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(const PDBSymbolTypeUDT &Symbol) {}<br>
+<br>
+void PrettyClassLayoutGraphicalDump<wbr>er::dump(const PDBSymbolTypeVTable &Symbol) {<br>
+}<br>
<br>
Added: llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h?rev=300134&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h?rev=300134&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h (added)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutGraphicalDump<wbr>er.h Wed Apr 12 18:18:51 2017<br>
@@ -0,0 +1,44 @@<br>
+//===- PrettyClassLayoutGraphicalDump<wbr>er.h -----------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#ifndef LLVM_TOOLS_LLVMPDBDUMP_<wbr>PRETTYCLASSLAYOUTGRAPHICALDUMP<wbr>ER_H<br>
+#define LLVM_TOOLS_LLVMPDBDUMP_<wbr>PRETTYCLASSLAYOUTGRAPHICALDUMP<wbr>ER_H<br>
+<br>
+#include "llvm/ADT/BitVector.h"<br>
+<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymDumper.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+namespace pdb {<br>
+<br>
+class ClassLayout;<br>
+class LinePrinter;<br>
+<br>
+class PrettyClassLayoutGraphicalDump<wbr>er : public PDBSymDumper {<br>
+public:<br>
+  explicit PrettyClassLayoutGraphicalDump<wbr>er(LinePrinter &P);<br>
+<br>
+  bool start(const ClassLayout &Layout);<br>
+<br>
+  void dump(const PDBSymbolTypeBaseClass &Symbol) override;<br>
+  void dump(const PDBSymbolData &Symbol) override;<br>
+  void dump(const PDBSymbolTypeEnum &Symbol) override;<br>
+  void dump(const PDBSymbolFunc &Symbol) override;<br>
+  void dump(const PDBSymbolTypeTypedef &Symbol) override;<br>
+  void dump(const PDBSymbolTypeUDT &Symbol) override;<br>
+  void dump(const PDBSymbolTypeVTable &Symbol) override;<br>
+<br>
+private:<br>
+  bool DumpedAnything = false;<br>
+  LinePrinter &Printer;<br></blockquote><div><br></div><div>This seems to have caused some "unused private field" errors:<div><br></div><div><a href="http://lab.llvm.org:8011/builders/lld-x86_64-darwin13/builds/6847/steps/build_Lld/logs/stdio">http://lab.llvm.org:8011/builders/lld-x86_64-darwin13/builds/6847/steps/build_Lld/logs/stdio</a></div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+};<br>
+}<br>
+}<br>
+#endif<br>
<br>
Added: llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp?rev=300134&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/<wbr>PrettyClassLayoutTextDumper.<wbr>cpp?rev=300134&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.<wbr>cpp (added)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.<wbr>cpp Wed Apr 12 18:18:51 2017<br>
@@ -0,0 +1,123 @@<br>
+//===- PrettyClassLayoutTextDumper.<wbr>cpp --------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#include "PrettyClassLayoutTextDumper.<wbr>h"<br>
+<br>
+#include "LinePrinter.h"<br>
+#include "PrettyEnumDumper.h"<br>
+#include "PrettyFunctionDumper.h"<br>
+#include "PrettyTypedefDumper.h"<br>
+#include "PrettyVariableDumper.h"<br>
+#include "llvm-pdbdump.h"<br>
+<br>
+#include "llvm/DebugInfo/PDB/<wbr>IPDBSession.h"<br>
+#include "llvm/DebugInfo/PDB/PDBExtras.<wbr>h"<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolData.h"<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolFunc.h"<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeEnum.h"<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeTypedef.h"<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymbolTypeVTable.h"<br>
+#include "llvm/DebugInfo/PDB/UDTLayout.<wbr>h"<br>
+<br>
+#include "llvm/Support/Format.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace llvm::pdb;<br>
+<br>
+PrettyClassLayoutTextDumper::<wbr>PrettyClassLayoutTextDumper(<wbr>LinePrinter &P)<br>
+    : PDBSymDumper(true), Printer(P) {}<br>
+<br>
+bool PrettyClassLayoutTextDumper::<wbr>start(const ClassLayout &Layout) {<br>
+  if (opts::pretty::ClassFormat ==<br>
+      opts::pretty::<wbr>ClassDefinitionFormat::<wbr>Standard) {<br>
+    for (auto &Other : Layout.other_items())<br>
+      Other->dump(*this);<br>
+  }<br>
+<br>
+  const BitVector &UseMap = Layout.usedBytes();<br>
+  int NextUnusedByte = Layout.usedBytes().find_first_<wbr>unset();<br>
+  // Next dump items which affect class layout.<br>
+  for (auto &LayoutItem : Layout.layout_items()) {<br>
+    if (NextUnusedByte >= 0) {<br>
+      // If there are padding bytes remaining, see if this field is the first to<br>
+      // cross a padding boundary, and print a padding field indicator if so.<br>
+      int Off = LayoutItem->getOffsetInParent(<wbr>);<br>
+      if (Off > NextUnusedByte) {<br>
+        uint32_t Amount = Off - NextUnusedByte;<br>
+        Printer.NewLine();<br>
+        WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> ("<br>
+                                                         << Amount << " bytes)";<br>
+        assert(UseMap.find_next(<wbr>NextUnusedByte) == Off);<br>
+        NextUnusedByte = UseMap.find_next_unset(Off);<br>
+      }<br>
+    }<br>
+    LayoutItem->getSymbol().dump(*<wbr>this);<br>
+  }<br>
+<br>
+  if (NextUnusedByte >= 0 && Layout.getClassSize() > 1) {<br>
+    uint32_t Amount = Layout.getClassSize() - NextUnusedByte;<br>
+    Printer.NewLine();<br>
+    WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> (" << Amount<br>
+                                                     << " bytes)";<br>
+    DumpedAnything = true;<br>
+  }<br>
+<br>
+  return DumpedAnything;<br>
+}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolTypeBaseClass &Symbol) {}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolData &Symbol) {<br>
+  VariableDumper Dumper(Printer);<br>
+  Dumper.start(Symbol);<br>
+  DumpedAnything = true;<br>
+}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolFunc &Symbol) {<br>
+  if (Printer.IsSymbolExcluded(<wbr>Symbol.getName()))<br>
+    return;<br>
+  if (Symbol.isCompilerGenerated() && opts::pretty::<wbr>ExcludeCompilerGenerated)<br>
+    return;<br>
+  if (Symbol.getLength() == 0 && !Symbol.isPureVirtual() &&<br>
+      !Symbol.<wbr>isIntroVirtualFunction())<br>
+    return;<br>
+<br>
+  DumpedAnything = true;<br>
+  Printer.NewLine();<br>
+  FunctionDumper Dumper(Printer);<br>
+  Dumper.start(Symbol, FunctionDumper::PointerType::<wbr>None);<br>
+}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolTypeVTable &Symbol) {<br>
+  VariableDumper Dumper(Printer);<br>
+  Dumper.start(Symbol);<br>
+  DumpedAnything = true;<br>
+}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolTypeEnum &Symbol) {<br>
+  if (Printer.IsTypeExcluded(<wbr>Symbol.getName()))<br>
+    return;<br>
+<br>
+  DumpedAnything = true;<br>
+  Printer.NewLine();<br>
+  EnumDumper Dumper(Printer);<br>
+  Dumper.start(Symbol);<br>
+}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolTypeTypedef &Symbol) {<br>
+  if (Printer.IsTypeExcluded(<wbr>Symbol.getName()))<br>
+    return;<br>
+<br>
+  DumpedAnything = true;<br>
+  Printer.NewLine();<br>
+  TypedefDumper Dumper(Printer);<br>
+  Dumper.start(Symbol);<br>
+}<br>
+<br>
+void PrettyClassLayoutTextDumper::<wbr>dump(const PDBSymbolTypeUDT &Symbol) {}<br>
<br>
Added: llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h?rev=300134&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/<wbr>PrettyClassLayoutTextDumper.h?<wbr>rev=300134&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.h (added)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>PrettyClassLayoutTextDumper.h Wed Apr 12 18:18:51 2017<br>
@@ -0,0 +1,44 @@<br>
+//===- PrettyClassLayoutTextDumper.h ----------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#ifndef LLVM_TOOLS_LLVMPDBDUMP_<wbr>PRETTYCLASSLAYOUTTEXTDUMPER_H<br>
+#define LLVM_TOOLS_LLVMPDBDUMP_<wbr>PRETTYCLASSLAYOUTTEXTDUMPER_H<br>
+<br>
+#include "llvm/ADT/BitVector.h"<br>
+<br>
+#include "llvm/DebugInfo/PDB/<wbr>PDBSymDumper.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+namespace pdb {<br>
+<br>
+class ClassLayout;<br>
+class LinePrinter;<br>
+<br>
+class PrettyClassLayoutTextDumper : public PDBSymDumper {<br>
+public:<br>
+  PrettyClassLayoutTextDumper(<wbr>LinePrinter &P);<br>
+<br>
+  bool start(const ClassLayout &Layout);<br>
+<br>
+  void dump(const PDBSymbolTypeBaseClass &Symbol) override;<br>
+  void dump(const PDBSymbolData &Symbol) override;<br>
+  void dump(const PDBSymbolTypeEnum &Symbol) override;<br>
+  void dump(const PDBSymbolFunc &Symbol) override;<br>
+  void dump(const PDBSymbolTypeTypedef &Symbol) override;<br>
+  void dump(const PDBSymbolTypeUDT &Symbol) override;<br>
+  void dump(const PDBSymbolTypeVTable &Symbol) override;<br>
+<br>
+private:<br>
+  bool DumpedAnything = false;<br>
+  LinePrinter &Printer;<br>
+};<br>
+}<br>
+}<br>
+#endif<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/llvm-pdbdump.cpp?rev=<wbr>300134&r1=300133&r2=300134&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.cpp (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.cpp Wed Apr 12 18:18:51 2017<br>
@@ -126,9 +126,10 @@ cl::opt<ClassDefinitionFormat> ClassForm<br>
     "class-definitions", cl::desc("Class definition format"),<br>
     cl::init(<wbr>ClassDefinitionFormat::<wbr>Standard),<br>
     cl::values(<br>
-        clEnumValN(<wbr>ClassDefinitionFormat::<wbr>Standard, "full",<br>
-                   "Display complete class definition"),<br>
-        clEnumValN(<wbr>ClassDefinitionFormat::Layout, "layout",<br>
+        clEnumValN(<wbr>ClassDefinitionFormat::<wbr>Standard, "all-members",<br>
+                   "Display all class members including data, constants, "<br>
+                   "typedefs, etc"),<br>
+        clEnumValN(<wbr>ClassDefinitionFormat::Layout, "layout-members",<br>
                    "Only display members that contribute to class size."),<br>
         clEnumValN(<wbr>ClassDefinitionFormat::None, "none",<br>
                    "Don't display class definitions")),<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h?rev=300134&r1=300133&r2=300134&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>pdbdump/llvm-pdbdump.h?rev=<wbr>300134&r1=300133&r2=300134&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.h (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/<wbr>llvm-pdbdump.h Wed Apr 12 18:18:51 2017<br>
@@ -18,7 +18,7 @@ namespace opts {<br>
<br>
 namespace pretty {<br>
<br>
-enum class ClassDefinitionFormat { None, Layout, Standard };<br>
+enum class ClassDefinitionFormat { None, Layout, Graphical, Standard };<br>
<br>
 extern llvm::cl::opt<bool> Compilands;<br>
 extern llvm::cl::opt<bool> Symbols;<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>