mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-24 07:35:04 +00:00
[llvm-pdbdump] Colorize output.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230746 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ade49914b6
commit
756b823064
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@ add_llvm_tool(llvm-pdbdump
|
||||
ClassDefinitionDumper.cpp
|
||||
CompilandDumper.cpp
|
||||
FunctionDumper.cpp
|
||||
LinePrinter.cpp
|
||||
TypeDumper.cpp
|
||||
TypedefDumper.cpp
|
||||
VariableDumper.cpp
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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() << ")";
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
80
tools/llvm-pdbdump/LinePrinter.cpp
Normal file
80
tools/llvm-pdbdump/LinePrinter.cpp
Normal 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;
|
||||
}
|
||||
}
|
69
tools/llvm-pdbdump/LinePrinter.h
Normal file
69
tools/llvm-pdbdump/LinePrinter.h
Normal 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
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user