[llvm] r300134 - [llvm-pdbdump] Minor prepatory refactor of Class Def Dumper.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 12 18:32:56 PDT 2017


Doh, I must have missed this bot. Would you mind removing the offending
variables for me, as I already left.
On Wed, Apr 12, 2017 at 6:20 PM Richard Smith <richard at metafoo.co.uk> wrote:

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


More information about the llvm-commits mailing list