[llvm-pdbdump] Colorize output.

llvm-svn: 230746
This commit is contained in:
Zachary Turner 2015-02-27 09:15:59 +00:00
parent 44da5f64d2
commit 2d11c20445
18 changed files with 492 additions and 190 deletions

View File

@ -8,73 +8,81 @@
//===----------------------------------------------------------------------===//
#include "BuiltinDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
using namespace llvm;
BuiltinDumper::BuiltinDumper() : PDBSymDumper(false) {}
BuiltinDumper::BuiltinDumper(LinePrinter &P)
: PDBSymDumper(false), Printer(P) {}
void BuiltinDumper::start(const PDBSymbolTypeBuiltin &Symbol,
llvm::raw_ostream &OS) {
PDB_BuiltinType Type = Symbol.getBuiltinType();
switch (Type) {
case PDB_BuiltinType::Float:
OS << ((Symbol.getLength() == 4) ? "float" : "double");
if (Symbol.getLength() == 4)
WithColor(Printer, PDB_ColorItem::Type).get() << "float";
else
WithColor(Printer, PDB_ColorItem::Type).get() << "double";
break;
case PDB_BuiltinType::UInt:
OS << "unsigned";
WithColor(Printer, PDB_ColorItem::Type).get() << "unsigned";
if (Symbol.getLength() == 8)
OS << " __int64";
WithColor(Printer, PDB_ColorItem::Type).get() << " __int64";
break;
case PDB_BuiltinType::Int:
OS << ((Symbol.getLength() == 4) ? "int" : "__int64");
if (Symbol.getLength() == 4)
WithColor(Printer, PDB_ColorItem::Type).get() << "int";
else
WithColor(Printer, PDB_ColorItem::Type).get() << "__int64";
break;
case PDB_BuiltinType::Char:
OS << "char";
WithColor(Printer, PDB_ColorItem::Type).get() << "char";
break;
case PDB_BuiltinType::WCharT:
OS << "wchar_t";
WithColor(Printer, PDB_ColorItem::Type).get() << "wchar_t";
break;
case PDB_BuiltinType::Void:
OS << "void";
WithColor(Printer, PDB_ColorItem::Type).get() << "void";
break;
case PDB_BuiltinType::Long:
OS << "long";
WithColor(Printer, PDB_ColorItem::Type).get() << "long";
break;
case PDB_BuiltinType::ULong:
OS << "unsigned long";
WithColor(Printer, PDB_ColorItem::Type).get() << "unsigned long";
break;
case PDB_BuiltinType::Bool:
OS << "bool";
WithColor(Printer, PDB_ColorItem::Type).get() << "bool";
break;
case PDB_BuiltinType::Currency:
OS << "CURRENCY";
WithColor(Printer, PDB_ColorItem::Type).get() << "CURRENCY";
break;
case PDB_BuiltinType::Date:
OS << "DATE";
WithColor(Printer, PDB_ColorItem::Type).get() << "DATE";
break;
case PDB_BuiltinType::Variant:
OS << "VARIANT";
WithColor(Printer, PDB_ColorItem::Type).get() << "VARIANT";
break;
case PDB_BuiltinType::Complex:
OS << "complex";
WithColor(Printer, PDB_ColorItem::Type).get() << "complex";
break;
case PDB_BuiltinType::Bitfield:
OS << "bitfield";
WithColor(Printer, PDB_ColorItem::Type).get() << "bitfield";
break;
case PDB_BuiltinType::BSTR:
OS << "BSTR";
WithColor(Printer, PDB_ColorItem::Type).get() << "BSTR";
break;
case PDB_BuiltinType::HResult:
OS << "HRESULT";
WithColor(Printer, PDB_ColorItem::Type).get() << "HRESULT";
break;
case PDB_BuiltinType::BCD:
OS << "HRESULT";
WithColor(Printer, PDB_ColorItem::Type).get() << "HRESULT";
break;
default:
OS << "(unknown builtin type)";
WithColor(Printer, PDB_ColorItem::Type).get() << "(unknown)";
break;
}
}

View File

@ -14,11 +14,16 @@
namespace llvm {
class LinePrinter;
class BuiltinDumper : public PDBSymDumper {
public:
BuiltinDumper();
BuiltinDumper(LinePrinter &P);
void start(const PDBSymbolTypeBuiltin &Symbol, llvm::raw_ostream &OS);
private:
LinePrinter &Printer;
};
}

View File

@ -9,6 +9,7 @@ add_llvm_tool(llvm-pdbdump
ClassDefinitionDumper.cpp
CompilandDumper.cpp
FunctionDumper.cpp
LinePrinter.cpp
TypeDumper.cpp
TypedefDumper.cpp
VariableDumper.cpp

View File

@ -9,6 +9,7 @@
#include "ClassDefinitionDumper.h"
#include "FunctionDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "TypedefDumper.h"
#include "VariableDumper.h"
@ -27,11 +28,15 @@
using namespace llvm;
ClassDefinitionDumper::ClassDefinitionDumper() : PDBSymDumper(true) {}
ClassDefinitionDumper::ClassDefinitionDumper(LinePrinter &P)
: PDBSymDumper(true), Printer(P) {}
void ClassDefinitionDumper::start(const PDBSymbolTypeUDT &Class,
raw_ostream &OS, int Indent) {
OS << "class " << Class.getName() << " {";
std::string Name = Class.getName();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
Printer << " {";
auto Children = Class.findAllChildren();
if (Children->getChildCount() == 0) {
OS << "}";
@ -81,9 +86,8 @@ void ClassDefinitionDumper::start(const PDBSymbolTypeUDT &Class,
Groups[(int)PDB_MemberAccess::Protected], OS, Indent);
Count += dumpAccessGroup(PDB_MemberAccess::Private,
Groups[(int)PDB_MemberAccess::Private], OS, Indent);
if (Count > 0)
OS << newline(Indent);
Printer.NewLine();
OS << "}";
}
@ -94,12 +98,20 @@ int ClassDefinitionDumper::dumpAccessGroup(PDB_MemberAccess Access,
return 0;
int Count = 0;
if (Access == PDB_MemberAccess::Private)
OS << newline(Indent) << "private:";
else if (Access == PDB_MemberAccess::Protected)
OS << newline(Indent) << "protected:";
else if (Access == PDB_MemberAccess::Public)
OS << newline(Indent) << "public:";
if (Access == PDB_MemberAccess::Private) {
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "private";
Printer << ":";
} else if (Access == PDB_MemberAccess::Protected) {
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "protected";
Printer << ":";
} else if (Access == PDB_MemberAccess::Public) {
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "public";
Printer << ":";
}
Printer.Indent();
for (auto iter = Group.Functions.begin(), end = Group.Functions.end();
iter != end; ++iter) {
++Count;
@ -115,6 +127,7 @@ int ClassDefinitionDumper::dumpAccessGroup(PDB_MemberAccess Access,
++Count;
(*iter)->dump(OS, Indent + 2, *this);
}
Printer.Unindent();
return Count;
}
@ -123,13 +136,14 @@ void ClassDefinitionDumper::dump(const PDBSymbolTypeBaseClass &Symbol,
void ClassDefinitionDumper::dump(const PDBSymbolData &Symbol, raw_ostream &OS,
int Indent) {
VariableDumper Dumper;
VariableDumper Dumper(Printer);
Dumper.start(Symbol, OS, Indent);
}
void ClassDefinitionDumper::dump(const PDBSymbolFunc &Symbol, raw_ostream &OS,
int Indent) {
FunctionDumper Dumper;
Printer.NewLine();
FunctionDumper Dumper(Printer);
Dumper.start(Symbol, FunctionDumper::PointerType::None, OS, Indent);
}
@ -138,13 +152,15 @@ void ClassDefinitionDumper::dump(const PDBSymbolTypeVTable &Symbol,
void ClassDefinitionDumper::dump(const PDBSymbolTypeEnum &Symbol,
raw_ostream &OS, int Indent) {
OS << newline(Indent) << "enum " << Symbol.getName();
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}
void ClassDefinitionDumper::dump(const PDBSymbolTypeTypedef &Symbol,
raw_ostream &OS, int Indent) {
OS << newline(Indent);
TypedefDumper Dumper;
Printer.NewLine();
TypedefDumper Dumper(Printer);
Dumper.start(Symbol, OS, Indent);
}

View File

@ -20,9 +20,11 @@
namespace llvm {
class LinePrinter;
class ClassDefinitionDumper : public PDBSymDumper {
public:
ClassDefinitionDumper();
ClassDefinitionDumper(LinePrinter &P);
void start(const PDBSymbolTypeUDT &Exe, raw_ostream &OS, int Indent);
@ -40,6 +42,8 @@ public:
int Indent) override;
private:
LinePrinter &Printer;
struct SymbolGroup {
SymbolGroup() {}
SymbolGroup(SymbolGroup &&Other) {

View File

@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "CompilandDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
@ -34,7 +35,8 @@
using namespace llvm;
CompilandDumper::CompilandDumper() : PDBSymDumper(true) {}
CompilandDumper::CompilandDumper(LinePrinter &P)
: Printer(P), PDBSymDumper(true) {}
void CompilandDumper::dump(const PDBSymbolCompilandDetails &Symbol,
raw_ostream &OS, int Indent) {}
@ -45,32 +47,39 @@ void CompilandDumper::dump(const PDBSymbolCompilandEnv &Symbol, raw_ostream &OS,
void CompilandDumper::start(const PDBSymbolCompiland &Symbol, raw_ostream &OS,
int Indent, bool Children) {
std::string FullName = Symbol.getName();
OS << newline(Indent) << FullName;
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Path).get() << FullName;
if (!Children)
return;
auto ChildrenEnum = Symbol.findAllChildren();
Printer.Indent();
while (auto Child = ChildrenEnum->getNext())
Child->dump(OS, Indent + 2, *this);
Printer.Unindent();
}
void CompilandDumper::dump(const PDBSymbolData &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
Printer.NewLine();
switch (auto LocType = Symbol.getLocationType()) {
case PDB_LocType::Static:
OS << "data: [";
OS << format_hex(Symbol.getRelativeVirtualAddress(), 10);
OS << "]";
Printer << "data: ";
WithColor(Printer, PDB_ColorItem::Address).get()
<< "[" << format_hex(Symbol.getRelativeVirtualAddress(), 10) << "]";
break;
case PDB_LocType::Constant:
OS << "constant: [" << Symbol.getValue() << "]";
Printer << "constant: ";
WithColor(Printer, PDB_ColorItem::LiteralValue).get()
<< "[" << Symbol.getValue() << "]";
break;
default:
OS << "data(unexpected type=" << LocType << ")";
Printer << "data(unexpected type=" << LocType << ")";
}
OS << " " << Symbol.getName();
Printer << " ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
}
void CompilandDumper::dump(const PDBSymbolFunc &Symbol, raw_ostream &OS,
@ -78,33 +87,40 @@ void CompilandDumper::dump(const PDBSymbolFunc &Symbol, raw_ostream &OS,
if (Symbol.getLength() == 0)
return;
FunctionDumper Dumper;
Printer.NewLine();
FunctionDumper Dumper(Printer);
Dumper.start(Symbol, FunctionDumper::PointerType::None, OS, Indent);
}
void CompilandDumper::dump(const PDBSymbolLabel &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
OS << "label [" << format_hex(Symbol.getRelativeVirtualAddress(), 10) << "] "
<< Symbol.getName();
Printer.NewLine();
Printer << "label ";
WithColor(Printer, PDB_ColorItem::Address).get()
<< "[" << format_hex(Symbol.getRelativeVirtualAddress(), 10) << "] ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
}
void CompilandDumper::dump(const PDBSymbolThunk &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent) << "thunk ";
Printer.NewLine();
Printer << "thunk ";
PDB_ThunkOrdinal Ordinal = Symbol.getThunkOrdinal();
uint32_t RVA = Symbol.getRelativeVirtualAddress();
if (Ordinal == PDB_ThunkOrdinal::TrampIncremental) {
OS << format_hex(RVA, 10);
OS << " -> " << format_hex(Symbol.getTargetRelativeVirtualAddress(), 10);
uint32_t Target = Symbol.getTargetRelativeVirtualAddress();
WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(RVA, 10);
Printer << " -> ";
WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Target, 10);
} else {
OS << "[" << format_hex(RVA, 10);
OS << " - " << format_hex(RVA + Symbol.getLength(), 10) << "]";
WithColor(Printer, PDB_ColorItem::Address).get()
<< "[" << format_hex(RVA, 10) << " - "
<< format_hex(RVA + Symbol.getLength(), 10) << "]";
}
OS << " (" << Ordinal << ") ";
Printer << " (" << Ordinal << ") ";
std::string Name = Symbol.getName();
if (!Name.empty())
OS << Name;
WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
}
void CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
@ -112,6 +128,6 @@ void CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
void CompilandDumper::dump(const PDBSymbolUnknown &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
OS << "unknown (" << Symbol.getSymTag() << ")";
Printer.NewLine();
Printer << "unknown (" << Symbol.getSymTag() << ")";
}

View File

@ -14,9 +14,11 @@
namespace llvm {
class LinePrinter;
class CompilandDumper : public PDBSymDumper {
public:
CompilandDumper();
CompilandDumper(LinePrinter &P);
void start(const PDBSymbolCompiland &Symbol, raw_ostream &OS, int Indent,
bool Children);
@ -33,6 +35,9 @@ public:
int Indent) override;
void dump(const PDBSymbolUnknown &Symbol, raw_ostream &OS,
int Indent) override;
private:
LinePrinter &Printer;
};
}

View File

@ -9,6 +9,7 @@
#include "FunctionDumper.h"
#include "BuiltinDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
@ -29,7 +30,7 @@ using namespace llvm;
namespace {
template <class T>
void dumpClassParentWithScopeOperator(const T &Symbol, llvm::raw_ostream &OS,
void dumpClassParentWithScopeOperator(const T &Symbol, LinePrinter &Printer,
llvm::FunctionDumper &Dumper) {
uint32_t ClassParentId = Symbol.getClassParentId();
auto ClassParent =
@ -38,18 +39,20 @@ void dumpClassParentWithScopeOperator(const T &Symbol, llvm::raw_ostream &OS,
if (!ClassParent)
return;
OS << ClassParent->getName() << "::";
WithColor(Printer, PDB_ColorItem::Type).get() << ClassParent->getName();
Printer << "::";
}
}
FunctionDumper::FunctionDumper() : PDBSymDumper(true) {}
FunctionDumper::FunctionDumper(LinePrinter &P)
: PDBSymDumper(true), Printer(P) {}
void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
const char *Name, PointerType Pointer,
raw_ostream &OS) {
auto ReturnType = Symbol.getReturnType();
ReturnType->dump(OS, 0, *this);
OS << " ";
Printer << " ";
uint32_t ClassParentId = Symbol.getClassParentId();
auto ClassParent =
Symbol.getSession().getConcreteSymbolById<PDBSymbolTypeUDT>(
@ -64,39 +67,46 @@ void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
if (Pointer == PointerType::None) {
if (ShouldDumpCallingConvention)
OS << CC << " ";
if (ClassParent)
OS << "(" << ClassParent->getName() << "::)";
WithColor(Printer, PDB_ColorItem::Keyword).get() << CC << " ";
if (ClassParent) {
Printer << "(";
WithColor(Printer, PDB_ColorItem::Identifier).get()
<< ClassParent->getName();
Printer << "::)";
}
} else {
OS << "(";
Printer << "(";
if (ShouldDumpCallingConvention)
OS << CC << " ";
if (ClassParent)
OS << ClassParent->getName() << "::";
WithColor(Printer, PDB_ColorItem::Keyword).get() << CC << " ";
if (ClassParent) {
WithColor(Printer, PDB_ColorItem::Identifier).get()
<< ClassParent->getName();
Printer << "::";
}
if (Pointer == PointerType::Reference)
OS << "&";
Printer << "&";
else
OS << "*";
Printer << "*";
if (Name)
OS << Name;
OS << ")";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
Printer << ")";
}
OS << "(";
Printer << "(";
if (auto ChildEnum = Symbol.getArguments()) {
uint32_t Index = 0;
while (auto Arg = ChildEnum->getNext()) {
Arg->dump(OS, 0, *this);
if (++Index < ChildEnum->getChildCount())
OS << ", ";
Printer << ", ";
}
}
OS << ")";
Printer << ")";
if (Symbol.isConstType())
OS << " const";
WithColor(Printer, PDB_ColorItem::Keyword).get() << " const";
if (Symbol.isVolatileType())
OS << " volatile";
WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile";
}
void FunctionDumper::start(const PDBSymbolFunc &Symbol, PointerType Pointer,
@ -104,74 +114,83 @@ void FunctionDumper::start(const PDBSymbolFunc &Symbol, PointerType Pointer,
uint32_t FuncStart = Symbol.getRelativeVirtualAddress();
uint32_t FuncEnd = FuncStart + Symbol.getLength();
OS << newline(Indent);
OS << "func [" << format_hex(FuncStart, 8);
if (auto DebugStart = Symbol.findOneChild<PDBSymbolFuncDebugStart>())
OS << "+" << DebugStart->getRelativeVirtualAddress() - FuncStart;
OS << " - " << format_hex(FuncEnd, 8);
if (auto DebugEnd = Symbol.findOneChild<PDBSymbolFuncDebugEnd>())
OS << "-" << FuncEnd - DebugEnd->getRelativeVirtualAddress();
OS << "] ";
Printer << "func ";
WithColor(Printer, PDB_ColorItem::Address).get() << "["
<< format_hex(FuncStart, 8);
if (auto DebugStart = Symbol.findOneChild<PDBSymbolFuncDebugStart>()) {
uint32_t Prologue = DebugStart->getRelativeVirtualAddress() - FuncStart;
WithColor(Printer, PDB_ColorItem::Offset).get() << "+" << Prologue;
}
WithColor(Printer, PDB_ColorItem::Address).get() << " - "
<< format_hex(FuncEnd, 8);
if (auto DebugEnd = Symbol.findOneChild<PDBSymbolFuncDebugEnd>()) {
uint32_t Epilogue = FuncEnd - DebugEnd->getRelativeVirtualAddress();
WithColor(Printer, PDB_ColorItem::Offset).get() << "-" << Epilogue;
}
WithColor(Printer, PDB_ColorItem::Address).get() << "] ";
if (Symbol.hasFramePointer())
OS << "(" << Symbol.getLocalBasePointerRegisterId() << ")";
WithColor(Printer, PDB_ColorItem::Address).get()
<< "(" << Symbol.getLocalBasePointerRegisterId() << ")";
else
OS << "(FPO)";
WithColor(Printer, PDB_ColorItem::Address).get() << "(FPO)";
OS << " ";
Printer << " ";
if (Symbol.isVirtual() || Symbol.isPureVirtual())
OS << "virtual ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "virtual ";
auto Signature = Symbol.getSignature();
if (!Signature) {
OS << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
if (Pointer == PointerType::Pointer)
OS << "*";
Printer << "*";
else if (Pointer == FunctionDumper::PointerType::Reference)
OS << "&";
Printer << "&";
return;
}
auto ReturnType = Signature->getReturnType();
ReturnType->dump(OS, 0, *this);
OS << " ";
Printer << " ";
auto ClassParent = Symbol.getClassParent();
PDB_CallingConv CC = Signature->getCallingConvention();
if (Pointer != FunctionDumper::PointerType::None)
OS << "(";
Printer << "(";
if ((ClassParent && CC != PDB_CallingConv::Thiscall) ||
(!ClassParent && CC != PDB_CallingConv::NearStdcall))
OS << Signature->getCallingConvention() << " ";
OS << Symbol.getName();
(!ClassParent && CC != PDB_CallingConv::NearStdcall)) {
WithColor(Printer, PDB_ColorItem::Keyword).get()
<< Signature->getCallingConvention() << " ";
}
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
if (Pointer != FunctionDumper::PointerType::None) {
if (Pointer == PointerType::Pointer)
OS << "*";
Printer << "*";
else if (Pointer == FunctionDumper::PointerType::Reference)
OS << "&";
OS << ")";
Printer << "&";
Printer << ")";
}
OS << "(";
Printer << "(";
if (auto Arguments = Symbol.getArguments()) {
uint32_t Index = 0;
while (auto Arg = Arguments->getNext()) {
auto ArgType = Arg->getType();
ArgType->dump(OS, 0, *this);
OS << " " << Arg->getName();
WithColor(Printer, PDB_ColorItem::Identifier).get() << " "
<< Arg->getName();
if (++Index < Arguments->getChildCount())
OS << ", ";
Printer << ", ";
}
}
OS << ")";
Printer << ")";
if (Symbol.isConstType())
OS << " const";
WithColor(Printer, PDB_ColorItem::Keyword).get() << " const";
if (Symbol.isVolatileType())
OS << " volatile";
WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile";
if (Symbol.isPureVirtual())
OS << " = 0";
Printer << " = 0";
}
void FunctionDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
@ -182,26 +201,27 @@ void FunctionDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
return;
ElementType->dump(OS, 0, *this);
OS << "[" << Symbol.getLength() << "]";
Printer << "[";
WithColor(Printer, PDB_ColorItem::LiteralValue).get() << Symbol.getLength();
Printer << "]";
}
void FunctionDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
BuiltinDumper Dumper;
BuiltinDumper Dumper(Printer);
Dumper.start(Symbol, OS);
}
void FunctionDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
dumpClassParentWithScopeOperator(Symbol, OS, *this);
OS << Symbol.getName();
dumpClassParentWithScopeOperator(Symbol, Printer, *this);
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}
void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol,
raw_ostream &OS, int Indent) {
// PDBSymbolTypeFunctionArg is just a shim over the real argument. Just drill
// through to the real thing and dump it.
Symbol.defaultDump(OS, Indent);
uint32_t TypeId = Symbol.getTypeId();
auto Type = Symbol.getSession().getSymbolById(TypeId);
if (!Type)
@ -211,8 +231,8 @@ void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol,
void FunctionDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
dumpClassParentWithScopeOperator(Symbol, OS, *this);
OS << Symbol.getName();
dumpClassParentWithScopeOperator(Symbol, Printer, *this);
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}
void FunctionDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
@ -223,15 +243,15 @@ void FunctionDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
return;
if (auto FuncSig = dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType.get())) {
FunctionDumper NestedDumper;
FunctionDumper NestedDumper(Printer);
PointerType Pointer =
Symbol.isReference() ? PointerType::Reference : PointerType::Pointer;
NestedDumper.start(*FuncSig, nullptr, Pointer, OS);
} else {
if (Symbol.isConstType())
OS << "const ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
if (Symbol.isVolatileType())
OS << "volatile ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
PointeeType->dump(OS, Indent, *this);
OS << (Symbol.isReference() ? "&" : "*");
}
@ -239,5 +259,5 @@ void FunctionDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
void FunctionDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) {
OS << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}

View File

@ -14,9 +14,11 @@
namespace llvm {
class LinePrinter;
class FunctionDumper : public PDBSymDumper {
public:
FunctionDumper();
FunctionDumper(LinePrinter &P);
enum class PointerType { None, Pointer, Reference };
@ -39,6 +41,9 @@ public:
int Indent) override;
void dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) override;
private:
LinePrinter &Printer;
};
}

View File

@ -0,0 +1,80 @@
//===- LinePrinter.cpp ------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "LinePrinter.h"
#include <algorithm>
using namespace llvm;
LinePrinter::LinePrinter(int Indent, llvm::raw_ostream &Stream)
: IndentSpaces(Indent), CurrentIndent(0), OS(Stream) {}
void LinePrinter::Indent() { CurrentIndent += IndentSpaces; }
void LinePrinter::Unindent() {
CurrentIndent = std::max(0, CurrentIndent - IndentSpaces);
}
void LinePrinter::NewLine() {
OS << "\n";
OS.indent(CurrentIndent);
}
WithColor::WithColor(LinePrinter &P, PDB_ColorItem C) : OS(P.OS) {
if (C == PDB_ColorItem::None)
OS.resetColor();
else {
raw_ostream::Colors Color;
bool Bold;
translateColor(C, Color, Bold);
OS.changeColor(Color, Bold);
}
}
WithColor::~WithColor() { OS.resetColor(); }
void WithColor::translateColor(PDB_ColorItem C, raw_ostream::Colors &Color,
bool &Bold) const {
switch (C) {
case PDB_ColorItem::Address:
Color = raw_ostream::YELLOW;
Bold = true;
return;
case PDB_ColorItem::Keyword:
Color = raw_ostream::MAGENTA;
Bold = true;
return;
case PDB_ColorItem::Offset:
Color = raw_ostream::YELLOW;
Bold = false;
return;
case PDB_ColorItem::Type:
Color = raw_ostream::CYAN;
Bold = true;
return;
case PDB_ColorItem::Identifier:
Color = raw_ostream::CYAN;
Bold = false;
return;
case PDB_ColorItem::Path:
Color = raw_ostream::CYAN;
Bold = false;
return;
case PDB_ColorItem::SectionHeader:
Color = raw_ostream::RED;
Bold = true;
return;
case PDB_ColorItem::LiteralValue:
Color = raw_ostream::GREEN;
Bold = true;
default:
return;
}
}

View File

@ -0,0 +1,69 @@
//===- LinePrinter.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_LINEPRINTER_H
#define LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H
#include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h"
namespace llvm {
class LinePrinter {
friend class WithColor;
public:
LinePrinter(int Indent, raw_ostream &Stream);
void Indent();
void Unindent();
void NewLine();
raw_ostream &getStream() { return OS; }
private:
raw_ostream &OS;
int IndentSpaces;
int CurrentIndent;
};
template <class T>
inline raw_ostream &operator<<(LinePrinter &Printer, const T &Item) {
Printer.getStream() << Item;
return Printer.getStream();
}
enum class PDB_ColorItem {
None,
Address,
Type,
Keyword,
Offset,
Identifier,
Path,
SectionHeader,
LiteralValue,
};
class WithColor {
public:
WithColor(LinePrinter &P, PDB_ColorItem C);
~WithColor();
raw_ostream &get() { return OS; }
private:
void translateColor(PDB_ColorItem C, raw_ostream::Colors &Color,
bool &Bold) const;
raw_ostream &OS;
};
}
#endif

View File

@ -10,6 +10,7 @@
#include "TypeDumper.h"
#include "ClassDefinitionDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "TypedefDumper.h"
@ -21,26 +22,37 @@
using namespace llvm;
TypeDumper::TypeDumper(bool Inline, bool ClassDefs)
: PDBSymDumper(true), InlineDump(Inline), FullClassDefs(ClassDefs) {}
TypeDumper::TypeDumper(LinePrinter &P, bool Inline, bool ClassDefs)
: PDBSymDumper(true), Printer(P), InlineDump(Inline),
FullClassDefs(ClassDefs) {}
void TypeDumper::start(const PDBSymbolExe &Exe, raw_ostream &OS, int Indent) {
auto Enums = Exe.findAllChildren<PDBSymbolTypeEnum>();
OS << newline(Indent) << "Enums: (" << Enums->getChildCount() << " items)";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Enums";
Printer << ": (" << Enums->getChildCount() << " items)";
Printer.Indent();
while (auto Enum = Enums->getNext())
Enum->dump(OS, Indent + 2, *this);
Printer.Unindent();
auto Typedefs = Exe.findAllChildren<PDBSymbolTypeTypedef>();
OS << newline(Indent) << "Typedefs: (" << Typedefs->getChildCount()
<< " items)";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Typedefs";
Printer << ": (" << Typedefs->getChildCount() << " items)";
Printer.Indent();
while (auto Typedef = Typedefs->getNext())
Typedef->dump(OS, Indent + 2, *this);
Printer.Unindent();
auto Classes = Exe.findAllChildren<PDBSymbolTypeUDT>();
OS << newline(Indent) << "Classes: (" << Classes->getChildCount()
<< " items)";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Classes";
Printer << ": (" << Classes->getChildCount() << " items)";
Printer.Indent();
while (auto Class = Classes->getNext())
Class->dump(OS, Indent + 2, *this);
Printer.Unindent();
}
void TypeDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
@ -49,17 +61,18 @@ void TypeDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
return;
if (!InlineDump)
OS << newline(Indent);
Printer.NewLine();
OS << "enum " << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
}
void TypeDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
if (!InlineDump)
OS << newline(Indent);
Printer.NewLine();
TypedefDumper Dumper;
TypedefDumper Dumper(Printer);
Dumper.start(Symbol, OS, Indent);
}
@ -68,12 +81,13 @@ void TypeDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
if (Symbol.getUnmodifiedTypeId() != 0)
return;
if (!InlineDump)
OS << newline(Indent);
Printer.NewLine();
if (FullClassDefs) {
ClassDefinitionDumper Dumper;
ClassDefinitionDumper Dumper(Printer);
Dumper.start(Symbol, OS, Indent);
} else {
OS << "class " << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
}
}

View File

@ -14,9 +14,11 @@
namespace llvm {
class LinePrinter;
class TypeDumper : public PDBSymDumper {
public:
TypeDumper(bool Inline, bool ClassDefs);
TypeDumper(LinePrinter &P, bool Inline, bool ClassDefs);
void start(const PDBSymbolExe &Exe, raw_ostream &OS, int Indent);
@ -28,6 +30,7 @@ public:
int Indent) override;
private:
LinePrinter &Printer;
bool InlineDump;
bool FullClassDefs;
};

View File

@ -11,6 +11,7 @@
#include "BuiltinDumper.h"
#include "FunctionDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
@ -23,15 +24,15 @@
using namespace llvm;
TypedefDumper::TypedefDumper() : PDBSymDumper(true) {}
TypedefDumper::TypedefDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
void TypedefDumper::start(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
OS << "typedef ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "typedef ";
uint32_t TargetId = Symbol.getTypeId();
if (auto TypeSymbol = Symbol.getSession().getSymbolById(TargetId))
TypeSymbol->dump(OS, 0, *this);
OS << " " << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Type).get() << " " << Symbol.getName();
}
void TypedefDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
@ -39,21 +40,22 @@ void TypedefDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
void TypedefDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
BuiltinDumper Dumper;
BuiltinDumper Dumper(Printer);
Dumper.start(Symbol, OS);
}
void TypedefDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
OS << "enum " << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
WithColor(Printer, PDB_ColorItem::Type).get() << " " << Symbol.getName();
}
void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent) {
if (Symbol.isConstType())
OS << "const ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
if (Symbol.isVolatileType())
OS << "volatile ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
uint32_t PointeeId = Symbol.getTypeId();
auto PointeeType = Symbol.getSession().getSymbolById(PointeeId);
if (!PointeeType)
@ -62,7 +64,7 @@ void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
FunctionDumper::PointerType Pointer = FunctionDumper::PointerType::Pointer;
if (Symbol.isReference())
Pointer = FunctionDumper::PointerType::Reference;
FunctionDumper NestedDumper;
FunctionDumper NestedDumper(Printer);
NestedDumper.start(*FuncSig, nullptr, Pointer, OS);
} else {
PointeeType->dump(OS, Indent, *this);
@ -72,11 +74,12 @@ void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
void TypedefDumper::dump(const PDBSymbolTypeFunctionSig &Symbol,
raw_ostream &OS, int Indent) {
FunctionDumper Dumper;
FunctionDumper Dumper(Printer);
Dumper.start(Symbol, nullptr, FunctionDumper::PointerType::None, OS);
}
void TypedefDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) {
OS << "class " << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
WithColor(Printer, PDB_ColorItem::Type).get() << " " << Symbol.getName();
}

View File

@ -14,9 +14,11 @@
namespace llvm {
class LinePrinter;
class TypedefDumper : public PDBSymDumper {
public:
TypedefDumper();
TypedefDumper(LinePrinter &P);
void start(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS, int Indent);
@ -32,6 +34,9 @@ public:
int Indent) override;
void dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) override;
private:
LinePrinter &Printer;
};
}

View File

@ -10,6 +10,7 @@
#include "VariableDumper.h"
#include "BuiltinDumper.h"
#include "LinePrinter.h"
#include "llvm-pdbdump.h"
#include "FunctionDumper.h"
@ -26,45 +27,51 @@
using namespace llvm;
VariableDumper::VariableDumper() : PDBSymDumper(true) {}
VariableDumper::VariableDumper(LinePrinter &P)
: PDBSymDumper(true), Printer(P) {}
void VariableDumper::start(const PDBSymbolData &Var, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
OS << "data ";
Printer.NewLine();
Printer << "data ";
auto VarType = Var.getType();
switch (auto LocType = Var.getLocationType()) {
case PDB_LocType::Static:
OS << "[" << format_hex(Var.getRelativeVirtualAddress(), 10) << "] ";
OS << "static ";
WithColor(Printer, PDB_ColorItem::Address).get()
<< "[" << format_hex(Var.getRelativeVirtualAddress(), 10) << "] ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "static ";
dumpSymbolTypeAndName(*VarType, Var.getName(), OS);
break;
case PDB_LocType::Constant:
OS << "const ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
dumpSymbolTypeAndName(*VarType, Var.getName(), OS);
OS << "[" << Var.getValue() << "]";
Printer << "[";
WithColor(Printer, PDB_ColorItem::LiteralValue).get() << Var.getValue();
Printer << "]";
break;
case PDB_LocType::ThisRel:
OS << "+" << format_hex(Var.getOffset(), 4) << " ";
WithColor(Printer, PDB_ColorItem::Offset).get()
<< "+" << format_hex(Var.getOffset(), 4) << " ";
dumpSymbolTypeAndName(*VarType, Var.getName(), OS);
break;
default:
OS << "unknown(" << LocType << ") ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Var.getName();
break;
OS << "unknown(" << LocType << ") " << Var.getName();
}
}
void VariableDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
BuiltinDumper Dumper;
BuiltinDumper Dumper(Printer);
Dumper.start(Symbol, OS);
}
void VariableDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
OS << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}
void VariableDumper::dump(const PDBSymbolTypeFunctionSig &Symbol,
@ -77,29 +84,30 @@ void VariableDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
return;
if (auto Func = dyn_cast<PDBSymbolFunc>(PointeeType.get())) {
FunctionDumper NestedDumper;
FunctionDumper NestedDumper(Printer);
FunctionDumper::PointerType Pointer =
Symbol.isReference() ? FunctionDumper::PointerType::Reference
: FunctionDumper::PointerType::Pointer;
NestedDumper.start(*Func, Pointer, OS, Indent);
} else {
if (Symbol.isConstType())
OS << "const ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
if (Symbol.isVolatileType())
OS << "volatile ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
PointeeType->dump(OS, Indent, *this);
OS << (Symbol.isReference() ? "&" : "*");
Printer << (Symbol.isReference() ? "&" : "*");
}
}
void VariableDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
OS << "typedef " << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Keyword).get() << "typedef ";
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}
void VariableDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) {
OS << Symbol.getName();
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
}
void VariableDumper::dumpSymbolTypeAndName(const PDBSymbol &Type,
@ -109,16 +117,19 @@ void VariableDumper::dumpSymbolTypeAndName(const PDBSymbol &Type,
raw_string_ostream IndexStream(IndexSpec);
std::unique_ptr<PDBSymbol> ElementType = ArrayType->getElementType();
while (auto NestedArray = dyn_cast<PDBSymbolTypeArray>(ElementType.get())) {
IndexStream << "[" << NestedArray->getCount() << "]";
IndexStream << "[";
IndexStream << NestedArray->getCount();
IndexStream << "]";
ElementType = NestedArray->getElementType();
}
IndexStream << "[" << ArrayType->getCount() << "]";
ElementType->dump(OS, 0, *this);
OS << " " << Name << IndexStream.str();
WithColor(Printer, PDB_ColorItem::Identifier).get() << " " << Name;
Printer << IndexStream.str();
} else {
if (!tryDumpFunctionPointer(Type, Name, OS)) {
Type.dump(OS, 0, *this);
OS << " " << Name;
WithColor(Printer, PDB_ColorItem::Identifier).get() << " " << Name;
}
}
}
@ -131,7 +142,7 @@ bool VariableDumper::tryDumpFunctionPointer(const PDBSymbol &Type,
auto PointeeType = PointerType->getPointeeType();
if (auto *FunctionSig =
dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType.get())) {
FunctionDumper Dumper;
FunctionDumper Dumper(Printer);
FunctionDumper::PointerType PT = FunctionDumper::PointerType::Pointer;
if (PointerType->isReference())
PT = FunctionDumper::PointerType::Reference;

View File

@ -15,9 +15,11 @@
namespace llvm {
class LinePrinter;
class VariableDumper : public PDBSymDumper {
public:
VariableDumper();
VariableDumper(LinePrinter &P);
void start(const PDBSymbolData &Var, raw_ostream &OS, int Indent);
@ -39,6 +41,8 @@ private:
raw_ostream &OS);
bool tryDumpFunctionPointer(const PDBSymbol &Type, StringRef Name,
raw_ostream &OS);
LinePrinter &Printer;
};
}

View File

@ -16,6 +16,7 @@
#include "llvm-pdbdump.h"
#include "CompilandDumper.h"
#include "FunctionDumper.h"
#include "LinePrinter.h"
#include "TypeDumper.h"
#include "VariableDumper.h"
@ -73,66 +74,98 @@ static void dumpInput(StringRef Path) {
return;
}
LinePrinter Printer(2, outs());
auto GlobalScope(Session->getGlobalScope());
std::string FileName(GlobalScope->getSymbolsFileName());
outs() << "Summary for " << FileName;
WithColor(Printer, PDB_ColorItem::None).get() << "Summary for ";
WithColor(Printer, PDB_ColorItem::Path).get() << FileName;
Printer.Indent();
uint64_t FileSize = 0;
if (!llvm::sys::fs::file_size(FileName, FileSize))
outs() << newline(2) << "Size: " << FileSize << " bytes";
else
outs() << newline(2) << "Size: (Unable to obtain file size)";
outs() << newline(2) << "Guid: " << GlobalScope->getGuid();
outs() << newline(2) << "Age: " << GlobalScope->getAge();
outs() << newline(2) << "Attributes: ";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Size";
if (!llvm::sys::fs::file_size(FileName, FileSize)) {
Printer << ": " << FileSize << " bytes";
} else {
Printer << ": (Unable to obtain file size)";
}
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Guid";
Printer << ": " << GlobalScope->getGuid();
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Age";
Printer << ": " << GlobalScope->getAge();
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::Identifier).get() << "Attributes";
Printer << ": ";
if (GlobalScope->hasCTypes())
outs() << "HasCTypes ";
if (GlobalScope->hasPrivateSymbols())
outs() << "HasPrivateSymbols ";
Printer.Unindent();
if (opts::Compilands) {
outs() << "\n---COMPILANDS---";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::SectionHeader).get()
<< "---COMPILANDS---";
Printer.Indent();
auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
CompilandDumper Dumper;
CompilandDumper Dumper(Printer);
while (auto Compiland = Compilands->getNext())
Dumper.start(*Compiland, outs(), 2, false);
Printer.Unindent();
}
if (opts::Types) {
outs() << "\n---TYPES---";
TypeDumper Dumper(false, opts::ClassDefs);
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---TYPES---";
Printer.Indent();
TypeDumper Dumper(Printer, false, opts::ClassDefs);
Dumper.start(*GlobalScope, outs(), 2);
Printer.Unindent();
}
if (opts::Symbols) {
outs() << "\n---SYMBOLS---";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---SYMBOLS---";
Printer.Indent();
auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
CompilandDumper Dumper;
CompilandDumper Dumper(Printer);
while (auto Compiland = Compilands->getNext())
Dumper.start(*Compiland, outs(), 2, true);
Printer.Unindent();
}
if (opts::Globals) {
outs() << "\n---GLOBALS---";
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---GLOBALS---";
Printer.Indent();
{
FunctionDumper Dumper;
FunctionDumper Dumper(Printer);
auto Functions = GlobalScope->findAllChildren<PDBSymbolFunc>();
while (auto Function = Functions->getNext())
while (auto Function = Functions->getNext()) {
Printer.NewLine();
Dumper.start(*Function, FunctionDumper::PointerType::None, outs(), 2);
}
}
{
auto Vars = GlobalScope->findAllChildren<PDBSymbolData>();
VariableDumper Dumper;
VariableDumper Dumper(Printer);
while (auto Var = Vars->getNext())
Dumper.start(*Var, outs(), 2);
}
{
auto Thunks = GlobalScope->findAllChildren<PDBSymbolThunk>();
CompilandDumper Dumper;
CompilandDumper Dumper(Printer);
while (auto Thunk = Thunks->getNext())
Dumper.dump(*Thunk, outs(), 2);
}
Printer.Unindent();
}
outs().flush();
}