summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbdump
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-pdbdump')
-rw-r--r--llvm/tools/llvm-pdbdump/LinePrinter.cpp2
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp41
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp57
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h4
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp17
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h1
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp25
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp8
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyVariableDumper.h1
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp15
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.h2
11 files changed, 98 insertions, 75 deletions
diff --git a/llvm/tools/llvm-pdbdump/LinePrinter.cpp b/llvm/tools/llvm-pdbdump/LinePrinter.cpp
index d4a5a8d859e..7fa524400ae 100644
--- a/llvm/tools/llvm-pdbdump/LinePrinter.cpp
+++ b/llvm/tools/llvm-pdbdump/LinePrinter.cpp
@@ -72,7 +72,7 @@ void LinePrinter::NewLine() {
}
bool LinePrinter::IsClassExcluded(const ClassLayout &Class) {
- if (IsTypeExcluded(Class.getUDTName(), Class.getClassSize()))
+ if (IsTypeExcluded(Class.getName(), Class.getSize()))
return true;
if (Class.deepPaddingSize() < opts::pretty::PaddingThreshold)
return true;
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp
index 9f213a4b4d9..81ef26167a2 100644
--- a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp
@@ -58,25 +58,11 @@ void ClassDefinitionDumper::start(const ClassLayout &Layout) {
prettyPrintClassOutro(Layout);
}
-static void printBase(LinePrinter &Printer, const PDBSymbolTypeBaseClass &Base,
- uint32_t &CurIndex, uint32_t TotalBaseCount,
- bool IsVirtual) {
- Printer << " ";
- WithColor(Printer, PDB_ColorItem::Keyword).get() << Base.getAccess();
- if (IsVirtual)
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " virtual";
- WithColor(Printer, PDB_ColorItem::Type).get() << " " << Base.getName();
- if (++CurIndex < TotalBaseCount) {
- Printer.NewLine();
- Printer << ",";
- }
-}
-
void ClassDefinitionDumper::prettyPrintClassIntro(const ClassLayout &Layout) {
DumpedAnything = false;
Printer.NewLine();
- uint32_t Size = Layout.getClassSize();
+ uint32_t Size = Layout.getSize();
const PDBSymbolTypeUDT &Class = Layout.getClass();
WithColor(Printer, PDB_ColorItem::Keyword).get() << Class.getUdtKind() << " ";
@@ -84,19 +70,22 @@ void ClassDefinitionDumper::prettyPrintClassIntro(const ClassLayout &Layout) {
WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size
<< "]";
uint32_t BaseCount = Layout.bases().size();
- uint32_t VBaseCount = Layout.vbases().size();
- uint32_t TotalBaseCount = BaseCount + VBaseCount;
- if (TotalBaseCount > 0) {
+ if (BaseCount > 0) {
Printer.Indent();
- Printer.NewLine();
- Printer << ":";
- uint32_t BaseIndex = 0;
+ char NextSeparator = ':';
for (auto BC : Layout.bases()) {
const auto &Base = BC->getBase();
- printBase(Printer, Base, BaseIndex, TotalBaseCount, false);
- }
- for (auto &BC : Layout.vbases()) {
- printBase(Printer, *BC, BaseIndex, TotalBaseCount, true);
+ if (Base.isIndirectVirtualBaseClass())
+ continue;
+
+ Printer.NewLine();
+ Printer << NextSeparator << " ";
+ WithColor(Printer, PDB_ColorItem::Keyword).get() << Base.getAccess();
+ if (BC->isVirtualBase())
+ WithColor(Printer, PDB_ColorItem::Keyword).get() << " virtual";
+
+ WithColor(Printer, PDB_ColorItem::Type).get() << " " << Base.getName();
+ NextSeparator = ',';
}
Printer.Unindent();
@@ -114,7 +103,7 @@ void ClassDefinitionDumper::prettyPrintClassOutro(const ClassLayout &Layout) {
Printer.NewLine();
if (Layout.deepPaddingSize() > 0) {
APFloat Pct(100.0 * (double)Layout.deepPaddingSize() /
- (double)Layout.getClassSize());
+ (double)Layout.getSize());
SmallString<8> PctStr;
Pct.toString(PctStr, 4);
WithColor(Printer, PDB_ColorItem::Padding).get()
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp
index d146ca9d471..f0385f198e0 100644
--- a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp
@@ -53,15 +53,28 @@ bool PrettyClassLayoutGraphicalDumper::start(const UDTLayoutBase &Layout) {
}
}
- CurrentItem = Item.get();
- Item->getSymbol().dump(*this);
+ CurrentItem = Item;
+ if (Item->isVBPtr()) {
+ VTableLayoutItem &Layout = static_cast<VTableLayoutItem &>(*CurrentItem);
+
+ VariableDumper VarDumper(Printer);
+ VarDumper.startVbptr(CurrentAbsoluteOffset, Layout.getSize());
+ } else {
+ if (auto Sym = Item->getSymbol())
+ Sym->dump(*this);
+ }
+
+ if (Item->getLayoutSize() > 0) {
+ uint32_t Prev = RelativeOffset + Item->getLayoutSize() - 1;
+ NextPaddingByte = UseMap.find_next_unset(Prev);
+ }
}
- if (NextPaddingByte >= 0 && Layout.getClassSize() > 1) {
- uint32_t Amount = Layout.getClassSize() - NextPaddingByte;
+ auto TailPadding = Layout.tailPadding();
+ if (TailPadding > 0) {
Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> (" << Amount
- << " bytes)";
+ WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> ("
+ << TailPadding << " bytes)";
DumpedAnything = true;
}
@@ -85,12 +98,19 @@ void PrettyClassLayoutGraphicalDumper::dump(
Printer.NewLine();
BaseClassLayout &Layout = static_cast<BaseClassLayout &>(*CurrentItem);
- std::string Label = Layout.isVirtualBase() ? "vbase" : "base";
+ std::string Label = "base";
+ if (Layout.isVirtualBase()) {
+ Label.insert(Label.begin(), 'v');
+ if (Layout.getBase().isIndirectVirtualBaseClass())
+ Label.insert(Label.begin(), 'i');
+ }
Printer << Label << " ";
+ uint32_t Size = Layout.isEmptyBase() ? 1 : Layout.getLayoutSize();
+
WithColor(Printer, PDB_ColorItem::Offset).get()
- << "+" << format_hex(CurrentAbsoluteOffset, 4)
- << " [sizeof=" << Layout.getSize() << "] ";
+ << "+" << format_hex(CurrentAbsoluteOffset, 4) << " [sizeof=" << Size
+ << "] ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Layout.getName();
@@ -125,27 +145,8 @@ void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolData &Symbol) {
void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolTypeVTable &Symbol) {
assert(CurrentItem != nullptr);
- VTableLayoutItem &Layout = static_cast<VTableLayoutItem &>(*CurrentItem);
-
VariableDumper VarDumper(Printer);
VarDumper.start(Symbol, ClassOffsetZero);
- Printer.Indent();
- uint32_t Index = 0;
- for (auto &Func : Layout.funcs()) {
- Printer.NewLine();
- std::string Name = Func->getName();
- auto ParentClass =
- unique_dyn_cast<PDBSymbolTypeUDT>(Func->getClassParent());
- assert(ParentClass);
- WithColor(Printer, PDB_ColorItem::Address).get() << " [" << Index << "] ";
- WithColor(Printer, PDB_ColorItem::Identifier).get()
- << "&" << ParentClass->getName();
- Printer << "::";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
- ++Index;
- }
- Printer.Unindent();
-
DumpedAnything = true;
}
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h b/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h
index 7dfb74c4e14..61b62b1762a 100644
--- a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h
+++ b/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h
@@ -19,7 +19,7 @@ namespace llvm {
namespace pdb {
class UDTLayoutBase;
-class StorageItemBase;
+class LayoutItemBase;
class LinePrinter;
class PrettyClassLayoutGraphicalDumper : public PDBSymDumper {
@@ -37,7 +37,7 @@ private:
LinePrinter &Printer;
- StorageItemBase *CurrentItem = nullptr;
+ LayoutItemBase *CurrentItem = nullptr;
uint32_t ClassOffsetZero = 0;
uint32_t CurrentAbsoluteOffset = 0;
bool DumpedAnything = false;
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp
index 02f31108b0d..ccfd38c1e3c 100644
--- a/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp
@@ -59,14 +59,17 @@ bool PrettyClassLayoutTextDumper::start(const ClassLayout &Layout) {
NextUnusedByte = UseMap.find_next_unset(Off);
}
}
- LayoutItem->getSymbol().dump(*this);
+ if (auto Sym = LayoutItem->getSymbol())
+ Sym->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)";
+ if (NextUnusedByte >= 0 && Layout.getSize() > 1) {
+ uint32_t Amount = Layout.getSize() - NextUnusedByte;
+ if (Amount > 0) {
+ Printer.NewLine();
+ WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> ("
+ << Amount << " bytes)";
+ }
DumpedAnything = true;
}
@@ -116,4 +119,6 @@ void PrettyClassLayoutTextDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
Dumper.start(Symbol);
}
+void PrettyClassLayoutTextDumper::dump(const PDBSymbolTypeBuiltin &Symbol) {}
+
void PrettyClassLayoutTextDumper::dump(const PDBSymbolTypeUDT &Symbol) {}
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h b/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h
index 56c20f0e843..1adbbffce55 100644
--- a/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h
+++ b/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h
@@ -34,6 +34,7 @@ public:
void dump(const PDBSymbolTypeTypedef &Symbol) override;
void dump(const PDBSymbolTypeUDT &Symbol) override;
void dump(const PDBSymbolTypeVTable &Symbol) override;
+ void dump(const PDBSymbolTypeBuiltin &Symbol) override;
private:
bool DumpedAnything = false;
diff --git a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp
index ffeef72150d..324a26f9a24 100644
--- a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp
@@ -34,17 +34,23 @@ using LayoutPtr = std::unique_ptr<ClassLayout>;
typedef bool (*CompareFunc)(const LayoutPtr &S1, const LayoutPtr &S2);
static bool CompareNames(const LayoutPtr &S1, const LayoutPtr &S2) {
- return S1->getUDTName() < S2->getUDTName();
+ return S1->getName() < S2->getName();
}
static bool CompareSizes(const LayoutPtr &S1, const LayoutPtr &S2) {
- return S1->getClassSize() < S2->getClassSize();
+ return S1->getSize() < S2->getSize();
}
static bool ComparePadding(const LayoutPtr &S1, const LayoutPtr &S2) {
return S1->deepPaddingSize() < S2->deepPaddingSize();
}
+static bool ComparePaddingPct(const LayoutPtr &S1, const LayoutPtr &S2) {
+ double Pct1 = (double)S1->deepPaddingSize() / (double)S1->getSize();
+ double Pct2 = (double)S2->deepPaddingSize() / (double)S2->getSize();
+ return Pct1 < Pct2;
+}
+
static CompareFunc getComparisonFunc(opts::pretty::ClassSortMode Mode) {
switch (Mode) {
case opts::pretty::ClassSortMode::Name:
@@ -53,6 +59,8 @@ static CompareFunc getComparisonFunc(opts::pretty::ClassSortMode Mode) {
return CompareSizes;
case opts::pretty::ClassSortMode::Padding:
return ComparePadding;
+ case opts::pretty::ClassSortMode::PaddingPct:
+ return ComparePaddingPct;
default:
return nullptr;
}
@@ -67,14 +75,18 @@ filterAndSortClassDefs(LinePrinter &Printer, Enumerator &E,
Filtered.reserve(UnfilteredCount);
CompareFunc Comp = getComparisonFunc(opts::pretty::ClassOrder);
+ if (UnfilteredCount > 10000) {
+ errs() << formatv("Filtering and sorting {0} types", UnfilteredCount);
+ errs().flush();
+ }
uint32_t Examined = 0;
uint32_t Discarded = 0;
while (auto Class = E.getNext()) {
++Examined;
if (Examined % 10000 == 0) {
- outs() << formatv("Examined {0}/{1} items. {2} items discarded\n",
+ errs() << formatv("Examined {0}/{1} items. {2} items discarded\n",
Examined, UnfilteredCount, Discarded);
- outs().flush();
+ errs().flush();
}
if (Class->getUnmodifiedTypeId() != 0) {
@@ -163,6 +175,9 @@ void TypeDumper::start(const PDBSymbolExe &Exe) {
dumpClassLayout(*Class);
} else {
while (auto Class = Classes->getNext()) {
+ if (Class->getUnmodifiedTypeId() != 0)
+ continue;
+
if (Printer.IsTypeExcluded(Class->getName(), Class->getLength()))
continue;
@@ -209,7 +224,7 @@ void TypeDumper::dumpClassLayout(const ClassLayout &Class) {
if (opts::pretty::ClassFormat == opts::pretty::ClassDefinitionFormat::None) {
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Class.getUDTName();
+ WithColor(Printer, PDB_ColorItem::Identifier).get() << Class.getName();
} else {
ClassDefinitionDumper Dumper(Printer);
Dumper.start(Class);
diff --git a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp
index 76a0d23bf87..70925f4b03d 100644
--- a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp
@@ -91,6 +91,14 @@ void VariableDumper::start(const PDBSymbolData &Var, uint32_t Offset) {
}
}
+void VariableDumper::startVbptr(uint32_t Offset, uint32_t Size) {
+ Printer.NewLine();
+ Printer << "vbptr ";
+
+ WithColor(Printer, PDB_ColorItem::Offset).get()
+ << "+" << format_hex(Offset, 4) << " [sizeof=" << Size << "] ";
+}
+
void VariableDumper::start(const PDBSymbolTypeVTable &Var, uint32_t Offset) {
Printer.NewLine();
Printer << "vfptr ";
diff --git a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h
index 4ba3bc97d85..cacf1ce9577 100644
--- a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h
+++ b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h
@@ -26,6 +26,7 @@ public:
void start(const PDBSymbolData &Var, uint32_t Offset = 0);
void start(const PDBSymbolTypeVTable &Var, uint32_t Offset = 0);
+ void startVbptr(uint32_t Offset, uint32_t Size);
void dump(const PDBSymbolTypeArray &Symbol) override;
void dump(const PDBSymbolTypeBuiltin &Symbol) override;
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index 06c2afc0bc7..d51f64065d6 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -124,12 +124,15 @@ cl::opt<bool> Typedefs("typedefs", cl::desc("Display typedef types"),
cl::cat(TypeCategory), cl::sub(PrettySubcommand));
cl::opt<ClassSortMode> ClassOrder(
"class-order", cl::desc("Class sort order"), cl::init(ClassSortMode::None),
- cl::values(clEnumValN(ClassSortMode::None, "none",
- "Undefined / no particular sort order"),
- clEnumValN(ClassSortMode::Name, "name", "Sort classes by name"),
- clEnumValN(ClassSortMode::Size, "size", "Sort classes by size"),
- clEnumValN(ClassSortMode::Padding, "padding",
- "Sort classes by amount of padding")),
+ cl::values(
+ clEnumValN(ClassSortMode::None, "none",
+ "Undefined / no particular sort order"),
+ clEnumValN(ClassSortMode::Name, "name", "Sort classes by name"),
+ clEnumValN(ClassSortMode::Size, "size", "Sort classes by size"),
+ clEnumValN(ClassSortMode::Padding, "padding",
+ "Sort classes by amount of padding"),
+ clEnumValN(ClassSortMode::PaddingPct, "padding-pct",
+ "Sort classes by percentage of space consumed by padding")),
cl::cat(TypeCategory), cl::sub(PrettySubcommand));
cl::opt<ClassDefinitionFormat> ClassFormat(
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
index a5429a253df..f77124de0ba 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
@@ -19,7 +19,7 @@ namespace opts {
namespace pretty {
enum class ClassDefinitionFormat { None, Layout, Graphical, Standard };
-enum class ClassSortMode { None, Name, Size, Padding };
+enum class ClassSortMode { None, Name, Size, Padding, PaddingPct };
extern llvm::cl::opt<bool> Compilands;
extern llvm::cl::opt<bool> Symbols;
OpenPOWER on IntegriCloud