120 lines
3.9 KiB
C++
120 lines
3.9 KiB
C++
//===- 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);
|
|
for (auto &Func : Layout.funcs())
|
|
Func->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) {
|
|
DumpedAnything = true;
|
|
Printer.NewLine();
|
|
EnumDumper Dumper(Printer);
|
|
Dumper.start(Symbol);
|
|
}
|
|
|
|
void PrettyClassLayoutTextDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
|
|
DumpedAnything = true;
|
|
Printer.NewLine();
|
|
TypedefDumper Dumper(Printer);
|
|
Dumper.start(Symbol);
|
|
}
|
|
|
|
void PrettyClassLayoutTextDumper::dump(const PDBSymbolTypeUDT &Symbol) {}
|