From da307b64ddec0c8ae3c2dead4b919636ad2c0133 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Tue, 25 Apr 2017 20:22:29 +0000 Subject: [PATCH] [llvm-pdbdump] Allow sorting / filtering by immediate padding llvm-svn: 301358 --- llvm/include/llvm/DebugInfo/PDB/UDTLayout.h | 3 +++ llvm/lib/DebugInfo/PDB/UDTLayout.cpp | 15 +++++++++++++-- .../llvm-pdbdump/PrettyClassDefinitionDumper.cpp | 8 ++++++++ llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp | 19 +++++++++++++++++++ llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 13 ++++++++++++- llvm/tools/llvm-pdbdump/llvm-pdbdump.h | 11 ++++++++++- 6 files changed, 65 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/DebugInfo/PDB/UDTLayout.h b/llvm/include/llvm/DebugInfo/PDB/UDTLayout.h index 8283113..6bc3660 100644 --- a/llvm/include/llvm/DebugInfo/PDB/UDTLayout.h +++ b/llvm/include/llvm/DebugInfo/PDB/UDTLayout.h @@ -44,6 +44,7 @@ public: virtual ~LayoutItemBase() {} uint32_t deepPaddingSize() const; + virtual uint32_t immediatePadding() const { return 0; } virtual uint32_t tailPadding() const; const UDTLayoutBase *getParent() const { return Parent; } @@ -175,8 +176,10 @@ public: ClassLayout(ClassLayout &&Other) = default; const PDBSymbolTypeUDT &getClass() const { return UDT; } + uint32_t immediatePadding() const override; private: + BitVector ImmediateUsedBytes; std::unique_ptr OwnedStorage; const PDBSymbolTypeUDT &UDT; }; diff --git a/llvm/lib/DebugInfo/PDB/UDTLayout.cpp b/llvm/lib/DebugInfo/PDB/UDTLayout.cpp index 6c6bb26ad..aacefae 100644 --- a/llvm/lib/DebugInfo/PDB/UDTLayout.cpp +++ b/llvm/lib/DebugInfo/PDB/UDTLayout.cpp @@ -60,7 +60,6 @@ uint32_t LayoutItemBase::tailPadding() const { return UsedBytes.size() - (Last + 1); } - DataMemberLayoutItem::DataMemberLayoutItem( const UDTLayoutBase &Parent, std::unique_ptr Member) : LayoutItemBase(&Parent, Member.get(), Member->getName(), @@ -126,13 +125,25 @@ uint32_t UDTLayoutBase::tailPadding() const { ClassLayout::ClassLayout(const PDBSymbolTypeUDT &UDT) : UDTLayoutBase(nullptr, UDT, UDT.getName(), 0, UDT.getLength(), false), - UDT(UDT) {} + UDT(UDT) { + ImmediateUsedBytes.resize(SizeOf, false); + for (auto &LI : LayoutItems) { + uint32_t Begin = LI->getOffsetInParent(); + uint32_t End = Begin + LI->getLayoutSize(); + End = std::min(SizeOf, End); + ImmediateUsedBytes.set(Begin, End); + } +} ClassLayout::ClassLayout(std::unique_ptr UDT) : ClassLayout(*UDT) { OwnedStorage = std::move(UDT); } +uint32_t ClassLayout::immediatePadding() const { + return SizeOf - ImmediateUsedBytes.count(); +} + BaseClassLayout::BaseClassLayout(const UDTLayoutBase &Parent, uint32_t OffsetInParent, bool Elide, std::unique_ptr B) diff --git a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp index c6d71e8..90f7772 100644 --- a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp +++ b/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp @@ -96,5 +96,13 @@ void ClassDefinitionDumper::prettyPrintClassOutro(const ClassLayout &Layout) { << "Total padding " << Layout.deepPaddingSize() << " bytes (" << PctStr << "% of class size)"; Printer.NewLine(); + APFloat Pct2(100.0 * (double)Layout.immediatePadding() / + (double)Layout.getSize()); + PctStr.clear(); + Pct2.toString(PctStr, 4); + WithColor(Printer, PDB_ColorItem::Padding).get() + << "Immediate padding " << Layout.immediatePadding() << " bytes (" + << PctStr << "% of class size)"; + Printer.NewLine(); } } diff --git a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp index 324a26f..cd156f0 100644 --- a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp +++ b/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp @@ -51,6 +51,17 @@ static bool ComparePaddingPct(const LayoutPtr &S1, const LayoutPtr &S2) { return Pct1 < Pct2; } +static bool ComparePaddingImmediate(const LayoutPtr &S1, const LayoutPtr &S2) { + return S1->immediatePadding() < S2->immediatePadding(); +} + +static bool ComparePaddingPctImmediate(const LayoutPtr &S1, + const LayoutPtr &S2) { + double Pct1 = (double)S1->immediatePadding() / (double)S1->getSize(); + double Pct2 = (double)S2->immediatePadding() / (double)S2->getSize(); + return Pct1 < Pct2; +} + static CompareFunc getComparisonFunc(opts::pretty::ClassSortMode Mode) { switch (Mode) { case opts::pretty::ClassSortMode::Name: @@ -61,6 +72,10 @@ static CompareFunc getComparisonFunc(opts::pretty::ClassSortMode Mode) { return ComparePadding; case opts::pretty::ClassSortMode::PaddingPct: return ComparePaddingPct; + case opts::pretty::ClassSortMode::PaddingImmediate: + return ComparePaddingImmediate; + case opts::pretty::ClassSortMode::PaddingPctImmediate: + return ComparePaddingPctImmediate; default: return nullptr; } @@ -104,6 +119,10 @@ filterAndSortClassDefs(LinePrinter &Printer, Enumerator &E, ++Discarded; continue; } + if (Layout->immediatePadding() < opts::pretty::ImmediatePaddingThreshold) { + ++Discarded; + continue; + } Filtered.push_back(std::move(Layout)); } diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index e498c01..7337b1d 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -132,7 +132,12 @@ cl::opt ClassOrder( clEnumValN(ClassSortMode::Padding, "padding", "Sort classes by amount of padding"), clEnumValN(ClassSortMode::PaddingPct, "padding-pct", - "Sort classes by percentage of space consumed by padding")), + "Sort classes by percentage of space consumed by padding"), + clEnumValN(ClassSortMode::PaddingImmediate, "padding-imm", + "Sort classes by amount of immediate padding"), + clEnumValN(ClassSortMode::PaddingPctImmediate, "padding-pct-imm", + "Sort classes by percentage of space consumed by immediate " + "padding")), cl::cat(TypeCategory), cl::sub(PrettySubcommand)); cl::opt ClassFormat( @@ -197,6 +202,12 @@ cl::opt PaddingThreshold( "min-class-padding", cl::desc("Displays only those classes which have at " "least the specified amount of padding."), cl::init(0), cl::cat(FilterCategory), cl::sub(PrettySubcommand)); +cl::opt ImmediatePaddingThreshold( + "min-class-padding-imm", + cl::desc("Displays only those classes which have at least the specified " + "amount of immediate padding, ignoring padding internal to bases " + "and aggregates."), + cl::init(0), cl::cat(FilterCategory), cl::sub(PrettySubcommand)); cl::opt ExcludeCompilerGenerated( "no-compiler-generated", diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h index d1af06f..f080d6d 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h @@ -19,7 +19,15 @@ namespace opts { namespace pretty { enum class ClassDefinitionFormat { None, Layout, All }; -enum class ClassSortMode { None, Name, Size, Padding, PaddingPct }; +enum class ClassSortMode { + None, + Name, + Size, + Padding, + PaddingPct, + PaddingImmediate, + PaddingPctImmediate +}; extern llvm::cl::opt Compilands; extern llvm::cl::opt Symbols; @@ -40,6 +48,7 @@ extern llvm::cl::list IncludeCompilands; extern llvm::cl::opt ClassOrder; extern llvm::cl::opt SizeThreshold; extern llvm::cl::opt PaddingThreshold; +extern llvm::cl::opt ImmediatePaddingThreshold; extern llvm::cl::opt ClassFormat; extern llvm::cl::opt ClassRecursionDepth; } -- 2.7.4