1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00
llvm-mirror/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp
Zachary Turner d8a23a9589 [PDB] Make the pretty dumper output modified types.
Currently if we got something like `const Foo` we'd ignore it and
just rely on printing the unmodified `Foo` later on.  However,
for testing the native reading code we really would like to be able
to see these so that we can verify that the native reader can
actually handle them.  Instead of printing out the full type though,
just print out the header.

llvm-svn: 342295
2018-09-14 22:29:19 +00:00

116 lines
3.7 KiB
C++

//===- PrettyClassDefinitionDumper.cpp --------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "PrettyClassDefinitionDumper.h"
#include "LinePrinter.h"
#include "PrettyClassLayoutGraphicalDumper.h"
#include "llvm-pdbutil.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
#include "llvm/DebugInfo/PDB/UDTLayout.h"
#include "llvm/Support/Format.h"
using namespace llvm;
using namespace llvm::pdb;
ClassDefinitionDumper::ClassDefinitionDumper(LinePrinter &P)
: PDBSymDumper(true), Printer(P) {}
void ClassDefinitionDumper::start(const PDBSymbolTypeUDT &Class) {
assert(opts::pretty::ClassFormat !=
opts::pretty::ClassDefinitionFormat::None);
ClassLayout Layout(Class);
start(Layout);
}
void ClassDefinitionDumper::start(const ClassLayout &Layout) {
prettyPrintClassIntro(Layout);
PrettyClassLayoutGraphicalDumper Dumper(Printer, 1, 0);
DumpedAnything |= Dumper.start(Layout);
prettyPrintClassOutro(Layout);
}
void ClassDefinitionDumper::prettyPrintClassIntro(const ClassLayout &Layout) {
DumpedAnything = false;
Printer.NewLine();
uint32_t Size = Layout.getSize();
const PDBSymbolTypeUDT &Class = Layout.getClass();
if (Layout.getClass().isConstType())
WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
if (Layout.getClass().isVolatileType())
WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
if (Layout.getClass().isUnalignedType())
WithColor(Printer, PDB_ColorItem::Keyword).get() << "unaligned ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << Class.getUdtKind() << " ";
WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size
<< "]";
uint32_t BaseCount = Layout.bases().size();
if (BaseCount > 0) {
Printer.Indent();
char NextSeparator = ':';
for (auto BC : Layout.bases()) {
const auto &Base = BC->getBase();
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();
}
Printer << " {";
Printer.Indent();
}
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)Layout.getSize());
SmallString<8> PctStr;
Pct.toString(PctStr, 4);
WithColor(Printer, PDB_ColorItem::Padding).get()
<< "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();
}
}