1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[llvm-pdbdump] Rewrite dumper using visitor pattern.

This increases the flexibility of how to dump different
symbol types -- necessary for context-sensitive formatting of
symbol types -- and also improves the modularity by allowing
the dumping to be implemented in the actual dumper, as opposed
to in the PDB library.

llvm-svn: 230184
This commit is contained in:
Zachary Turner 2015-02-22 22:03:38 +00:00
parent a0f04e851c
commit 1a7a66bda7
82 changed files with 1106 additions and 563 deletions

View File

@ -17,12 +17,6 @@
namespace llvm {
typedef std::unordered_map<PDB_SymType, int> TagStats;
struct stream_indent {
stream_indent(int IndentWidth) : Width(IndentWidth) {}
int Width;
};
raw_ostream &operator<<(raw_ostream &OS, const stream_indent &Indent);
raw_ostream &operator<<(raw_ostream &OS, const PDB_VariantType &Value);
raw_ostream &operator<<(raw_ostream &OS, const PDB_CallingConv &Conv);
raw_ostream &operator<<(raw_ostream &OS, const PDB_DataKind &Data);

View File

@ -0,0 +1,85 @@
//===- PDBSymDumper.h - base interface for PDB symbol dumper *- C++ -----*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_DEBUGINFO_PDB_PDBSYMDUMPER_H
#define LLVM_DEBUGINFO_PDB_PDBSYMDUMPER_H
#include "PDBTypes.h"
namespace llvm {
class raw_ostream;
class PDBSymDumper {
public:
PDBSymDumper(bool ShouldRequireImpl);
virtual ~PDBSymDumper();
virtual void dump(const PDBSymbolAnnotation &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolBlock &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolCompiland &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolCompilandDetails &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolCompilandEnv &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolCustom &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolData &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolExe &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolFunc &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolFuncDebugEnd &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolFuncDebugStart &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolLabel &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolPublicSymbol &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolThunk &Symbol, raw_ostream &OS, int Indent);
virtual void dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeBaseClass &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeCustom &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeDimension &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeFriend &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeFunctionArg &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeManaged &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeVTable &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolTypeVTableShape &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolUnknown &Symbol, raw_ostream &OS,
int Indent);
virtual void dump(const PDBSymbolUsingNamespace &Symbol, raw_ostream &OS,
int Indent);
private:
bool RequireImpl;
};
}
#endif

View File

@ -53,7 +53,8 @@ public:
/// call dump() on the underlying RawSymbol, which allows us to discover
/// unknown properties, but individual implementations of PDBSymbol may
/// override the behavior to only dump known fields.
virtual void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const = 0;
virtual void dump(raw_ostream &OS, int Indent,
PDBSymDumper &Dumper) const = 0;
void defaultDump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const;
PDB_SymType getSymTag() const;
@ -83,6 +84,8 @@ public:
const IPDBRawSymbol &getRawSymbol() const { return *RawSymbol; }
IPDBRawSymbol &getRawSymbol() { return *RawSymbol; }
const IPDBSession &getSession() const { return Session; }
protected:
std::unique_ptr<IPDBEnumSymbols> getChildStats(TagStats &Stats) const;

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Annotation)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAddressOffset)
FORWARD_SYMBOL_METHOD(getAddressSection)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Block)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAddressOffset)
FORWARD_SYMBOL_METHOD(getAddressSection)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Compiland)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(isEditAndContinueEnabled)
FORWARD_SYMBOL_METHOD(getLexicalParentId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::CompilandDetails)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
void getFrontEndVersion(VersionInfo &Version) const {
RawSymbol->getFrontEndVersion(Version);

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::CompilandEnv)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getLexicalParentId)
FORWARD_SYMBOL_METHOD(getName)

View File

@ -28,7 +28,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Custom)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes);
FORWARD_SYMBOL_METHOD(getSymIndexId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Data)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAccess)
FORWARD_SYMBOL_METHOD(getAddressOffset)

View File

@ -25,7 +25,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Exe)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAge)
FORWARD_SYMBOL_METHOD(getGuid)

View File

@ -22,7 +22,7 @@ public:
PDBSymbolFunc(const IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> FuncSymbol);
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
std::unique_ptr<PDBSymbolTypeFunctionSig> getSignature() const;

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::FuncDebugEnd)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAddressOffset)
FORWARD_SYMBOL_METHOD(getAddressSection)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::FuncDebugStart)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAddressOffset)
FORWARD_SYMBOL_METHOD(getAddressSection)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Label)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAddressOffset)
FORWARD_SYMBOL_METHOD(getAddressSection)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::PublicSymbol)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAddressOffset)
FORWARD_SYMBOL_METHOD(getAddressSection)

View File

@ -25,7 +25,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Thunk)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAccess)
FORWARD_SYMBOL_METHOD(getAddressOffset)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::ArrayType)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getArrayIndexTypeId)
FORWARD_SYMBOL_METHOD(isConstType)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::BaseClass)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getAccess)
FORWARD_SYMBOL_METHOD(getClassParentId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::BuiltinType)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getBuiltinType)
FORWARD_SYMBOL_METHOD(isConstType)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::CustomType)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getOemId)
FORWARD_SYMBOL_METHOD(getOemSymbolId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Dimension)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getLowerBoundId)
FORWARD_SYMBOL_METHOD(getUpperBoundId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Enum)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getBuiltinType)
FORWARD_SYMBOL_METHOD(getClassParentId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Friend)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getClassParentId)
FORWARD_SYMBOL_METHOD(getName)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::FunctionArg)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getClassParentId)
FORWARD_SYMBOL_METHOD(getLexicalParentId)

View File

@ -28,7 +28,7 @@ public:
std::unique_ptr<IPDBEnumSymbols> getArguments() const;
std::unique_ptr<PDBSymbol> getClassParent() const;
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
void dumpArgList(raw_ostream &OS) const;
FORWARD_SYMBOL_METHOD(getCallingConvention)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::ManagedType)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getName)
FORWARD_SYMBOL_METHOD(getSymIndexId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::PointerType)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(isConstType)
FORWARD_SYMBOL_METHOD(getLength)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::Typedef)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getBuiltinType)
FORWARD_SYMBOL_METHOD(getClassParentId)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::UDT)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getClassParentId)
FORWARD_SYMBOL_METHOD(hasConstructor)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::VTable)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getClassParentId)
FORWARD_SYMBOL_METHOD(isConstType)

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::VTableShape)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(isConstType)
FORWARD_SYMBOL_METHOD(getCount)

View File

@ -21,7 +21,7 @@ public:
PDBSymbolUnknown(const IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> UnknownSymbol);
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
static bool classof(const PDBSymbol *S) {
return (S->getSymTag() == PDB_SymType::None ||

View File

@ -24,7 +24,7 @@ public:
DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::UsingNamespace)
void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level, PDB_DumpFlags Flags) const override;
void dump(raw_ostream &OS, int Indent, PDBSymDumper &Dumper) const override;
FORWARD_SYMBOL_METHOD(getLexicalParentId)
FORWARD_SYMBOL_METHOD(getName)

View File

@ -16,10 +16,8 @@
namespace llvm {
class PDBSymDumper;
class PDBSymbol;
class PDBSymbolCompiland;
class PDBSymbolFunc;
class PDBSymbolExe;
class IPDBDataStream;
template <class T> class IPDBEnumChildren;

View File

@ -66,6 +66,7 @@ add_llvm_library(LLVMDebugInfoPDB
PDBSymbolTypeVTableShape.cpp
PDBSymbolUnknown.cpp
PDBSymbolUsingNamespace.cpp
PDBSymDumper.cpp
${PDB_IMPL_SOURCES}
ADDITIONAL_HEADER_DIRS

View File

@ -21,11 +21,6 @@ using namespace llvm;
#define CASE_OUTPUT_ENUM_CLASS_NAME(Class, Value, Stream) \
CASE_OUTPUT_ENUM_CLASS_STR(Class, Value, #Value, Stream)
raw_ostream &llvm::operator<<(raw_ostream &OS, const stream_indent &Indent) {
OS.indent(Indent.Width);
return OS;
}
raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_VariantType &Type) {
switch (Type) {
CASE_OUTPUT_ENUM_CLASS_NAME(PDB_VariantType, Bool, OS)

View File

@ -0,0 +1,177 @@
//===- PDBSymDumper.cpp - ---------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include "llvm/Support/ErrorHandling.h"
using namespace llvm;
#define PDB_SYMDUMP_UNREACHABLE(Type) \
if (RequireImpl) \
llvm_unreachable("Attempt to dump " #Type " with no dump implementation");
PDBSymDumper::PDBSymDumper(bool ShouldRequireImpl)
: RequireImpl(ShouldRequireImpl) {}
PDBSymDumper::~PDBSymDumper() {}
void PDBSymDumper::dump(const PDBSymbolAnnotation &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolAnnotation)
}
void PDBSymDumper::dump(const PDBSymbolBlock &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolBlock)
}
void PDBSymDumper::dump(const PDBSymbolCompiland &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolCompiland)
}
void PDBSymDumper::dump(const PDBSymbolCompilandDetails &Symbol,
raw_ostream &OS, int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolCompilandDetails)
}
void PDBSymDumper::dump(const PDBSymbolCompilandEnv &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolCompilandEnv)
}
void PDBSymDumper::dump(const PDBSymbolCustom &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolCustom)
}
void PDBSymDumper::dump(const PDBSymbolData &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolData)
}
void PDBSymDumper::dump(const PDBSymbolExe &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolExe)
}
void PDBSymDumper::dump(const PDBSymbolFunc &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolFunc)
}
void PDBSymDumper::dump(const PDBSymbolFuncDebugEnd &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolFuncDebugEnd)
}
void PDBSymDumper::dump(const PDBSymbolFuncDebugStart &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolFuncDebugStart)
}
void PDBSymDumper::dump(const PDBSymbolLabel &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolLabel)
}
void PDBSymDumper::dump(const PDBSymbolPublicSymbol &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolPublicSymbol)
}
void PDBSymDumper::dump(const PDBSymbolThunk &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolThunk)
}
void PDBSymDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeArray)
}
void PDBSymDumper::dump(const PDBSymbolTypeBaseClass &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeBaseClass)
}
void PDBSymDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeBuiltin)
}
void PDBSymDumper::dump(const PDBSymbolTypeCustom &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeCustom)
}
void PDBSymDumper::dump(const PDBSymbolTypeDimension &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeDimension)
}
void PDBSymDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeEnum)
}
void PDBSymDumper::dump(const PDBSymbolTypeFriend &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeFriend)
}
void PDBSymDumper::dump(const PDBSymbolTypeFunctionArg &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeFunctionArg)
}
void PDBSymDumper::dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeFunctionSig)
}
void PDBSymDumper::dump(const PDBSymbolTypeManaged &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeManaged)
}
void PDBSymDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypePointer)
}
void PDBSymDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeTypedef)
}
void PDBSymDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeUDT)
}
void PDBSymDumper::dump(const PDBSymbolTypeVTable &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeVTable)
}
void PDBSymDumper::dump(const PDBSymbolTypeVTableShape &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolTypeVTableShape)
}
void PDBSymDumper::dump(const PDBSymbolUnknown &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolUnknown)
}
void PDBSymDumper::dump(const PDBSymbolUsingNamespace &Symbol, raw_ostream &OS,
int Indent) {
PDB_SYMDUMP_UNREACHABLE(PDBSymbolUsingNamespace)
}

View File

@ -42,6 +42,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h"
#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"
#include "llvm/DebugInfo/PDB/PDBSymbolUsingNamespace.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <memory>
#include <utility>
@ -100,6 +101,12 @@ PDBSymbol::create(const IPDBSession &PDBSession,
}
}
#define TRY_DUMP_TYPE(Type) \
if (const Type *DerivedThis = dyn_cast<Type>(this)) \
Dumper.dump(OS, Indent, *DerivedThis);
#define ELSE_TRY_DUMP_TYPE(Type, Dumper) else TRY_DUMP_TYPE(Type, Dumper)
void PDBSymbol::defaultDump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level) const {
RawSymbol->dump(OS, Indent, Level);

View File

@ -9,7 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolAnnotation.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +20,6 @@ PDBSymbolAnnotation::PDBSymbolAnnotation(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolAnnotation::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolBlock.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolBlock::PDBSymbolBlock(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolBlock::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,18 +9,9 @@
#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
#include "llvm/DebugInfo/PDB/PDBExtras.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h"
#include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
#include <vector>
using namespace llvm;
@ -28,45 +19,7 @@ PDBSymbolCompiland::PDBSymbolCompiland(const IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
#define SKIP_SYMBOL_IF_FLAG_UNSET(Tag, Flag) \
case PDB_SymType::Tag: \
if ((Flags & Flag) == 0) \
continue; \
break;
void PDBSymbolCompiland::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
if (Level == PDB_DumpLevel::Detailed) {
std::string FullName = getName();
OS << stream_indent(Indent) << FullName;
if (Flags & PDB_DF_Children) {
if (Level >= PDB_DumpLevel::Detailed) {
auto ChildrenEnum = findAllChildren();
while (auto Child = ChildrenEnum->getNext()) {
switch (Child->getSymTag()) {
SKIP_SYMBOL_IF_FLAG_UNSET(Function, PDB_DF_Functions)
SKIP_SYMBOL_IF_FLAG_UNSET(Data, PDB_DF_Data)
SKIP_SYMBOL_IF_FLAG_UNSET(Label, PDB_DF_Labels)
SKIP_SYMBOL_IF_FLAG_UNSET(PublicSymbol, PDB_DF_PublicSyms)
SKIP_SYMBOL_IF_FLAG_UNSET(UDT, PDB_DF_Classes)
SKIP_SYMBOL_IF_FLAG_UNSET(Enum, PDB_DF_Enums)
SKIP_SYMBOL_IF_FLAG_UNSET(FunctionSig, PDB_DF_Funcsigs)
SKIP_SYMBOL_IF_FLAG_UNSET(VTable, PDB_DF_VTables)
SKIP_SYMBOL_IF_FLAG_UNSET(Thunk, PDB_DF_Thunks)
SKIP_SYMBOL_IF_FLAG_UNSET(Compiland, PDB_DF_ObjFiles)
default:
continue;
}
PDB_DumpLevel ChildLevel = (Level == PDB_DumpLevel::Detailed)
? PDB_DumpLevel::Normal
: PDB_DumpLevel::Compact;
OS << "\n";
Child->dump(OS, Indent + 2, ChildLevel, PDB_DF_Children);
}
}
}
} else {
std::string FullName = getName();
OS << stream_indent(Indent) << "Compiland: " << FullName;
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolCompilandDetails::PDBSymbolCompilandDetails(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolCompilandDetails::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -11,6 +11,7 @@
#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -26,4 +27,6 @@ std::string PDBSymbolCompilandEnv::getValue() const {
}
void PDBSymbolCompilandEnv::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -11,6 +11,7 @@
#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -25,4 +26,6 @@ void PDBSymbolCustom::getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) {
}
void PDBSymbolCustom::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,11 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBExtras.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
#include "llvm/Support/Format.h"
#include <utility>
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -24,68 +20,6 @@ PDBSymbolData::PDBSymbolData(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(DataSymbol)) {}
void PDBSymbolData::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
PDB_LocType Loc = getLocationType();
PDB_DataKind Kind = getDataKind();
switch (Loc) {
case PDB_LocType::Static: {
uint32_t RVA = getRelativeVirtualAddress();
OS << Kind << " data[";
if (RVA != 0)
OS << format_hex(RVA, 10);
else
OS << "???";
break;
}
case PDB_LocType::TLS:
OS << "threadlocal " << Kind << " data[";
OS << getAddressSection() << ":" << format_hex(getAddressOffset(), 10);
break;
case PDB_LocType::RegRel:
OS << "regrel " << Kind << " data[";
OS << getRegisterId() << " + " << getOffset();
break;
case PDB_LocType::ThisRel: {
uint32_t Offset = getOffset();
OS << Kind << " data[this + " << format_hex(Offset, 4);
break;
}
case PDB_LocType::Enregistered:
OS << "register " << Kind << " data[" << getRegisterId();
break;
case PDB_LocType::BitField: {
OS << "bitfield data[this + ";
uint32_t Offset = getOffset();
uint32_t BitPos = getBitPosition();
uint32_t Length = getLength();
OS << format_hex(Offset, 4) << ":" << BitPos << "," << Length;
break;
}
case PDB_LocType::Slot:
OS << getSlot();
break;
case PDB_LocType::Constant: {
OS << "constant data[";
OS << getValue();
break;
}
case PDB_LocType::IlRel:
case PDB_LocType::MetaData:
default:
OS << "???";
}
OS << "] ";
if (Kind == PDB_DataKind::Member || Kind == PDB_DataKind::StaticMember) {
uint32_t ClassId = getClassParentId();
if (auto Class = Session.getSymbolById(ClassId)) {
if (auto UDT = dyn_cast<PDBSymbolTypeUDT>(Class.get()))
OS << UDT->getName();
else
OS << "{class " << Class->getSymTag() << "}";
OS << "::";
}
}
OS << getName();
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,129 +9,17 @@
#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/PDBExtras.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/raw_ostream.h"
#include <utility>
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
using namespace llvm;
#define SKIP_SYMBOL_IF_FLAG_UNSET(Tag, Flag) \
case PDB_SymType::Tag: \
if ((Flags & Flag) == 0) \
continue; \
break;
PDBSymbolExe::PDBSymbolExe(const IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolExe::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
std::string FileName(getSymbolsFileName());
OS << stream_indent(Indent) << "Summary for " << FileName << "\n";
uint64_t FileSize = 0;
if (!llvm::sys::fs::file_size(FileName, FileSize))
OS << stream_indent(Indent + 2) << "Size: " << FileSize << " bytes\n";
else
OS << stream_indent(Indent + 2) << "Size: (Unable to obtain file size)\n";
PDB_UniqueId Guid = getGuid();
OS << stream_indent(Indent + 2) << "Guid: " << Guid << "\n";
OS << stream_indent(Indent + 2) << "Age: " << getAge() << "\n";
OS << stream_indent(Indent + 2) << "Attributes: ";
if (hasCTypes())
OS << "HasCTypes ";
if (hasPrivateSymbols())
OS << "HasPrivateSymbols ";
OS << "\n";
if (Flags & PDB_DF_Children) {
OS << stream_indent(Indent + 2) << "Dumping types\n";
if (Flags & PDB_DF_Hidden) {
// For some reason, for each SymTag T, this dumps more items of type T
// than are dumped by calling dumpChildren(T). In other words, there are
// "hidden" symbols. For example, it causes functions to be dumped which
// have no address information, whereas specifically dumping only
// functions will not find those symbols.
//
// My suspicion is that in the underlying DIA call, when you call
// findChildren, passing a value of SymTagNone means all children
// recursively, whereas passing a concrete tag value means only immediate
// children of the global scope. So perhaps we need to find these
// mysterious missing values by recursing through the hierarchy.
//
// On the other hand, there may just be some symbols that DIA tries to
// hide from you because it thinks you don't care about them. However
// experimentation shows that even vtables, for example, can't be found
// without an exhaustive search.
auto ChildrenEnum = findAllChildren();
OS << stream_indent(Indent + 2) << ChildrenEnum->getChildCount()
<< " symbols";
while (auto Child = ChildrenEnum->getNext()) {
switch (Child->getSymTag()) {
SKIP_SYMBOL_IF_FLAG_UNSET(Function, PDB_DF_Functions)
SKIP_SYMBOL_IF_FLAG_UNSET(Data, PDB_DF_Data)
SKIP_SYMBOL_IF_FLAG_UNSET(Label, PDB_DF_Labels)
SKIP_SYMBOL_IF_FLAG_UNSET(PublicSymbol, PDB_DF_PublicSyms)
SKIP_SYMBOL_IF_FLAG_UNSET(UDT, PDB_DF_Classes)
SKIP_SYMBOL_IF_FLAG_UNSET(Enum, PDB_DF_Enums)
SKIP_SYMBOL_IF_FLAG_UNSET(FunctionSig, PDB_DF_Funcsigs)
SKIP_SYMBOL_IF_FLAG_UNSET(VTable, PDB_DF_VTables)
SKIP_SYMBOL_IF_FLAG_UNSET(Thunk, PDB_DF_Thunks)
SKIP_SYMBOL_IF_FLAG_UNSET(Compiland, PDB_DF_ObjFiles)
default:
continue;
}
PDB_DumpLevel ChildLevel = (Level == PDB_DumpLevel::Detailed)
? PDB_DumpLevel::Normal
: PDB_DumpLevel::Compact;
OS << "\n";
Child->dump(OS, Indent + 4, ChildLevel, PDB_DF_Children);
}
} else {
if (Flags & PDB_DF_ObjFiles)
dumpChildren(OS, "Compilands", PDB_SymType::Compiland, Indent + 4);
if (Flags & PDB_DF_Functions)
dumpChildren(OS, "Functions", PDB_SymType::Function, Indent + 4);
if (Flags & PDB_DF_Data)
dumpChildren(OS, "Data", PDB_SymType::Data, Indent + 4);
if (Flags & PDB_DF_Labels)
dumpChildren(OS, "Labels", PDB_SymType::Label, Indent + 4);
if (Flags & PDB_DF_PublicSyms)
dumpChildren(OS, "Public Symbols", PDB_SymType::PublicSymbol,
Indent + 4);
if (Flags & PDB_DF_Classes)
dumpChildren(OS, "UDTs", PDB_SymType::UDT, Indent + 4);
if (Flags & PDB_DF_Enums)
dumpChildren(OS, "Enums", PDB_SymType::Enum, Indent + 4);
if (Flags & PDB_DF_Funcsigs)
dumpChildren(OS, "Function Signatures", PDB_SymType::FunctionSig,
Indent + 4);
if (Flags & PDB_DF_Typedefs)
dumpChildren(OS, "Typedefs", PDB_SymType::Typedef, Indent + 4);
if (Flags & PDB_DF_VTables)
dumpChildren(OS, "VTables", PDB_SymType::VTable, Indent + 4);
if (Flags & PDB_DF_Thunks)
dumpChildren(OS, "Thunks", PDB_SymType::Thunk, Indent + 4);
}
}
}
void PDBSymbolExe::dumpChildren(raw_ostream &OS, StringRef Label,
PDB_SymType ChildType, int Indent) const {
auto ChildrenEnum = findAllChildren(ChildType);
OS << stream_indent(Indent) << Label << ": (" << ChildrenEnum->getChildCount()
<< " items)\n";
while (auto Child = ChildrenEnum->getNext()) {
Child->dump(OS, Indent + 2, PDB_DumpLevel::Normal, PDB_DF_None);
OS << "\n";
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,14 +9,10 @@
#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
#include "llvm/Support/Format.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
using namespace llvm;
@ -29,58 +25,6 @@ std::unique_ptr<PDBSymbolTypeFunctionSig> PDBSymbolFunc::getSignature() const {
}
void PDBSymbolFunc::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
uint32_t FuncStart = getRelativeVirtualAddress();
uint32_t FuncEnd = FuncStart + getLength();
OS << stream_indent(Indent);
if (FuncStart == 0 && FuncEnd == 0) {
OS << "func [???] ";
} else {
OS << "func ";
OS << "[" << format_hex(FuncStart, 8);
if (auto DebugStart = findOneChild<PDBSymbolFuncDebugStart>())
OS << "+" << DebugStart->getRelativeVirtualAddress() - FuncStart;
OS << " - " << format_hex(FuncEnd, 8);
if (auto DebugEnd = findOneChild<PDBSymbolFuncDebugEnd>())
OS << "-" << FuncEnd - DebugEnd->getRelativeVirtualAddress();
OS << "] ";
}
PDB_RegisterId Reg = getLocalBasePointerRegisterId();
if (Reg == PDB_RegisterId::VFrame)
OS << "(VFrame)";
else if (hasFramePointer())
OS << "(" << Reg << ")";
else
OS << "(FPO)";
OS << " ";
if (isVirtual() || isPureVirtual())
OS << "virtual ";
if (auto FuncSig = getSignature()) {
// If we have a signature, dump the name with the signature.
if (auto ReturnType = FuncSig->getReturnType()) {
ReturnType->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
OS << " ";
}
OS << FuncSig->getCallingConvention() << " ";
OS << getName();
FuncSig->dumpArgList(OS);
if (isPureVirtual())
OS << " = 0";
} else {
uint32_t ClassId = getClassParentId();
if (ClassId != 0) {
if (auto Class = Session.getSymbolById(ClassId)) {
if (auto UDT = dyn_cast<PDBSymbolTypeUDT>(Class.get()))
OS << UDT->getName() << "::";
else
OS << "{class " << Class->getSymTag() << "}::";
}
}
OS << getName();
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolFuncDebugEnd::PDBSymbolFuncDebugEnd(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolFuncDebugEnd::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolFuncDebugStart::PDBSymbolFuncDebugStart(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolFuncDebugStart::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,8 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolLabel.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/Support/Format.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,8 +20,6 @@ PDBSymbolLabel::PDBSymbolLabel(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolLabel::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
OS << "label [" << format_hex(getRelativeVirtualAddress(), 10) << "] "
<< getName();
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,7 +21,6 @@ PDBSymbolPublicSymbol::PDBSymbolPublicSymbol(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolPublicSymbol::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
OS << "public symbol: " << getName();
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,8 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/Support/Format.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,22 +20,6 @@ PDBSymbolThunk::PDBSymbolThunk(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolThunk::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS.indent(Indent);
OS << "thunk ";
PDB_ThunkOrdinal Ordinal = getThunkOrdinal();
uint32_t RVA = getRelativeVirtualAddress();
if (Ordinal == PDB_ThunkOrdinal::TrampIncremental) {
OS << format_hex(RVA, 10);
} else {
OS << "[" << format_hex(RVA, 10);
OS << " - " << format_hex(RVA + getLength(), 10) << "]";
}
OS << " (" << Ordinal << ")";
if (Ordinal == PDB_ThunkOrdinal::TrampIncremental)
OS << " -> " << format_hex(getTargetRelativeVirtualAddress(), 10);
OS << " ";
std::string Name = getName();
if (!Name.empty())
OS << Name;
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,8 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,11 +20,6 @@ PDBSymbolTypeArray::PDBSymbolTypeArray(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeArray::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
if (auto ElementType = Session.getSymbolById(getTypeId()))
ElementType->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
else
OS << "<unknown-element-type>";
OS << "[" << getLength() << "]";
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,7 +21,6 @@ PDBSymbolTypeBaseClass::PDBSymbolTypeBaseClass(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeBaseClass::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
OS << "<base class> " << getName();
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,7 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,10 +20,6 @@ PDBSymbolTypeBuiltin::PDBSymbolTypeBuiltin(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeBuiltin::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
PDB_BuiltinType Type = getBuiltinType();
OS << Type;
if (Type == PDB_BuiltinType::UInt || Type == PDB_BuiltinType::Int)
OS << (8 * getLength()) << "_t";
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeCustom.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolTypeCustom::PDBSymbolTypeCustom(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeCustom::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -11,6 +11,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeDimension.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,4 +22,6 @@ PDBSymbolTypeDimension::PDBSymbolTypeDimension(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeDimension::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,8 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,17 +20,6 @@ PDBSymbolTypeEnum::PDBSymbolTypeEnum(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeEnum::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
if (Level >= PDB_DumpLevel::Normal)
OS << "enum ";
uint32_t ClassId = getClassParentId();
if (ClassId != 0) {
if (auto ClassParent = Session.getSymbolById(ClassId)) {
ClassParent->dump(OS, 0, Level, PDB_DF_Children);
OS << "::";
}
}
OS << getName();
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFriend.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolTypeFriend::PDBSymbolTypeFriend(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeFriend::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,8 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,10 +20,6 @@ PDBSymbolTypeFunctionArg::PDBSymbolTypeFunctionArg(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeFunctionArg::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
uint32_t TypeId = getTypeId();
if (auto Type = Session.getSymbolById(TypeId)) {
Type->dump(OS, 0, Level, PDB_DF_Children);
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -14,6 +14,7 @@
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -82,38 +83,7 @@ std::unique_ptr<PDBSymbol> PDBSymbolTypeFunctionSig::getClassParent() const {
return Session.getSymbolById(ClassId);
}
void PDBSymbolTypeFunctionSig::dumpArgList(raw_ostream &OS) const {
OS << "(";
if (auto ChildEnum = getArguments()) {
uint32_t Index = 0;
while (auto Arg = ChildEnum->getNext()) {
Arg->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
if (++Index < ChildEnum->getChildCount())
OS << ", ";
}
}
OS << ")";
if (isConstType())
OS << " const";
if (isVolatileType())
OS << " volatile";
}
void PDBSymbolTypeFunctionSig::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
if (auto ReturnType = getReturnType()) {
ReturnType->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
OS << " ";
}
OS << getCallingConvention() << " ";
if (auto ClassParent = getClassParent()) {
OS << "(";
ClassParent->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
OS << "::*)";
}
dumpArgList(OS);
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeManaged.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolTypeManaged::PDBSymbolTypeManaged(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeManaged::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,9 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -22,25 +20,6 @@ PDBSymbolTypePointer::PDBSymbolTypePointer(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypePointer::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
if (isConstType())
OS << "const ";
if (isVolatileType())
OS << "volatile ";
uint32_t PointeeId = getTypeId();
if (auto PointeeType = Session.getSymbolById(PointeeId)) {
// Function pointers get special treatment, since we need to print the * in
// the middle of the signature.
if (auto FuncSig = dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType.get())) {
if (auto ReturnType = FuncSig->getReturnType())
ReturnType->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
OS << " (" << FuncSig->getCallingConvention() << " ";
OS << ((isReference()) ? "&" : "*") << ")";
FuncSig->dumpArgList(OS);
} else {
PointeeType->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
OS << ((isReference()) ? "&" : "*");
}
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,9 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -22,18 +20,6 @@ PDBSymbolTypeTypedef::PDBSymbolTypeTypedef(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeTypedef::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS.indent(Indent);
if (Level >= PDB_DumpLevel::Normal) {
std::string Name = getName();
OS << "typedef:" << Name << " -> ";
std::string TargetTypeName;
uint32_t TargetId = getTypeId();
if (auto TypeSymbol = Session.getSymbolById(TargetId)) {
TypeSymbol->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
}
OS << TargetTypeName;
} else {
OS << getName();
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,8 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -21,22 +20,6 @@ PDBSymbolTypeUDT::PDBSymbolTypeUDT(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeUDT::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
if (Level >= PDB_DumpLevel::Normal)
OS << "class ";
if (isNested()) {
uint32_t ClassId = getClassParentId();
if (ClassId != 0) {
if (auto ClassParent = Session.getSymbolById(ClassId)) {
ClassParent->dump(OS, 0, Level, PDB_DF_Children);
OS << "::";
}
}
}
OS << getName();
if (Level >= PDB_DumpLevel::Normal)
OS << " (" << getLength() << " bytes)";
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -9,10 +9,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -23,19 +20,6 @@ PDBSymbolTypeVTable::PDBSymbolTypeVTable(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeVTable::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {
OS << stream_indent(Indent);
uint32_t ClassId = getClassParentId();
if (auto ClassParent = Session.getSymbolById(ClassId)) {
ClassParent->dump(OS, 0, PDB_DumpLevel::Compact, PDB_DF_Children);
OS << "::";
}
OS << "<vtbl> ";
if (auto VtblPointer =
Session.getConcreteSymbolById<PDBSymbolTypePointer>(getTypeId())) {
if (auto VtblShape =
Session.getConcreteSymbolById<PDBSymbolTypeVTableShape>(
VtblPointer->getTypeId()))
OS << "(" << VtblShape->getCount() << " entries)";
}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolTypeVTableShape::PDBSymbolTypeVTableShape(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeVTableShape::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolUnknown::PDBSymbolUnknown(const IPDBSession &PDBSession,
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolUnknown::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -10,6 +10,7 @@
#include "llvm/DebugInfo/PDB/PDBSymbolUsingNamespace.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
#include <utility>
@ -20,4 +21,6 @@ PDBSymbolUsingNamespace::PDBSymbolUsingNamespace(
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolUsingNamespace::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level, PDB_DumpFlags Flags) const {}
PDBSymDumper &Dumper) const {
Dumper.dump(*this, OS, Indent);
}

View File

@ -3,7 +3,7 @@
; The format is func [0x<rva_start>+<prologue_length> - 0x<rva_end>-<epilogue_length>]
; SYM_FORMAT: symbolformat-fpo.obj
; SYM_FORMAT-DAG: func [0x001130+0 - 0x001137-1] (VFrame) uint32_t __cdecl fpo_func(uint32_t)
; SYM_FORMAT-DAG: func [0x001130+0 - 0x001137-1] (FPO) uint32_t __cdecl fpo_func(uint32_t)
; SYM_FORMAT: symbolformat.obj
; SYM_FORMAT-DAG: func [0x001060+3 - 0x001067-2] (EBP) int32_t __cdecl _purecall()
; SYM_FORMAT-DAG: func [0x001070+6 - 0x001099-4] (EBP) int32_t __cdecl main(int32_t, char**)
@ -17,11 +17,11 @@
; TYPES_FORMAT: Function Signatures
; TYPES_FORMAT-DAG: int32_t __cdecl ()
; TYPES_FORMAT-DAG: int32_t __cdecl (int32_t, char**)
; TYPES_FORMAT-DAG: void __thiscall (A::*)()
; TYPES_FORMAT-DAG: void __thiscall (B::*)()
; TYPES_FORMAT-DAG: void __thiscall (B::*)(B&)
; TYPES_FORMAT-DAG: void __thiscall (B::*)()
; TYPES_FORMAT-DAG: B& __thiscall (B::*)(B&)
; TYPES_FORMAT-DAG: void __thiscall (A::*)(A&)
; TYPES_FORMAT-DAG: void __thiscall (A::*)()
; TYPES_FORMAT-DAG: A& __thiscall (A::*)(A&)
; TYPES_FORMAT-DAG: void __thiscall (A::)()
; TYPES_FORMAT-DAG: void __thiscall (B::)()
; TYPES_FORMAT-DAG: void __thiscall (B::)(B&)
; TYPES_FORMAT-DAG: void __thiscall (B::)()
; TYPES_FORMAT-DAG: B& __thiscall (B::)(B&)
; TYPES_FORMAT-DAG: void __thiscall (A::)(A&)
; TYPES_FORMAT-DAG: void __thiscall (A::)()
; TYPES_FORMAT-DAG: A& __thiscall (A::)(A&)

View File

@ -5,4 +5,8 @@ set(LLVM_LINK_COMPONENTS
add_llvm_tool(llvm-pdbdump
llvm-pdbdump.cpp
CompilandDumper.cpp
FunctionDumper.cpp
TypeDumper.cpp
TypedefDumper.cpp
)

View File

@ -0,0 +1,132 @@
//===- CompilandDumper.cpp - llvm-pdbdump compiland symbol dumper *- C++ *-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "CompilandDumper.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBExtras.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
#include "llvm/DebugInfo/PDB/PDBSymbolLabel.h"
#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include "FunctionDumper.h"
#include <utility>
#include <vector>
using namespace llvm;
CompilandDumper::CompilandDumper() : PDBSymDumper(true) {}
void CompilandDumper::dump(const PDBSymbolCompilandDetails &Symbol,
raw_ostream &OS, int Indent) {}
void CompilandDumper::dump(const PDBSymbolCompilandEnv &Symbol, raw_ostream &OS,
int Indent) {}
void CompilandDumper::start(const PDBSymbolCompiland &Symbol, raw_ostream &OS,
int Indent, bool Children) {
std::string FullName = Symbol.getName();
OS << newline(Indent) << FullName;
if (!Children)
return;
auto ChildrenEnum = Symbol.findAllChildren();
while (auto Child = ChildrenEnum->getNext())
Child->dump(OS, Indent + 2, *this);
}
void CompilandDumper::dump(const PDBSymbolData &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
switch (auto LocType = Symbol.getLocationType()) {
case PDB_LocType::Static:
OS << "data: [";
OS << format_hex(Symbol.getRelativeVirtualAddress(), 10);
OS << "]";
break;
case PDB_LocType::Constant:
OS << "constant: [" << Symbol.getValue() << "]";
break;
default:
OS << "data(unexpected type=" << LocType << ")";
}
OS << " " << Symbol.getName();
}
void CompilandDumper::dump(const PDBSymbolFunc &Symbol, raw_ostream &OS,
int Indent) {
uint32_t FuncStart = Symbol.getRelativeVirtualAddress();
uint32_t FuncEnd = FuncStart + Symbol.getLength();
OS << newline(Indent) << "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 << "] ";
if (Symbol.hasFramePointer())
OS << "(" << Symbol.getLocalBasePointerRegisterId() << ")";
else
OS << "(FPO)";
OS << " ";
FunctionDumper Dumper;
Dumper.start(Symbol, OS);
OS.flush();
}
void CompilandDumper::dump(const PDBSymbolLabel &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
OS << "label [" << format_hex(Symbol.getRelativeVirtualAddress(), 10) << "] "
<< Symbol.getName();
}
void CompilandDumper::dump(const PDBSymbolThunk &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent) << "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);
} else {
OS << "[" << format_hex(RVA, 10);
OS << " - " << format_hex(RVA + Symbol.getLength(), 10) << "]";
}
OS << " (" << Ordinal << ") ";
std::string Name = Symbol.getName();
if (!Name.empty())
OS << Name;
}
void CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {}
void CompilandDumper::dump(const PDBSymbolUnknown &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
OS << "unknown (" << Symbol.getSymTag() << ")";
}

View File

@ -0,0 +1,39 @@
//===- CompilandDumper.h - llvm-pdbdump compiland symbol dumper *- 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_COMPILANDDUMPER_H
#define LLVM_TOOLS_LLVMPDBDUMP_COMPILANDDUMPER_H
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
namespace llvm {
class CompilandDumper : public PDBSymDumper {
public:
CompilandDumper();
void start(const PDBSymbolCompiland &Symbol, raw_ostream &OS, int Indent,
bool Children);
void dump(const PDBSymbolCompilandDetails &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolCompilandEnv &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolData &Symbol, raw_ostream &OS, int Indent) override;
void dump(const PDBSymbolFunc &Symbol, raw_ostream &OS, int Indent) override;
void dump(const PDBSymbolLabel &Symbol, raw_ostream &OS, int Indent) override;
void dump(const PDBSymbolThunk &Symbol, raw_ostream &OS, int Indent) override;
void dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolUnknown &Symbol, raw_ostream &OS,
int Indent) override;
};
}
#endif

View File

@ -0,0 +1,187 @@
//===- FunctionDumper.cpp ------------------------------------ *- C++ *-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "FunctionDumper.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
namespace {
template <class T>
void dumpClassParentWithScopeOperator(const T &Symbol, llvm::raw_ostream &OS,
llvm::FunctionDumper &Dumper) {
uint32_t ClassParentId = Symbol.getClassParentId();
auto ClassParent =
Symbol.getSession().getConcreteSymbolById<PDBSymbolTypeUDT>(
ClassParentId);
if (!ClassParent)
return;
OS << ClassParent->getName() << "::";
}
}
using namespace llvm;
FunctionDumper::FunctionDumper() : PDBSymDumper(true) {}
void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
PointerType Pointer, raw_ostream &OS) {
auto ReturnType = Symbol.getReturnType();
ReturnType->dump(OS, 0, *this);
OS << " ";
uint32_t ClassParentId = Symbol.getClassParentId();
auto ClassParent =
Symbol.getSession().getConcreteSymbolById<PDBSymbolTypeUDT>(
ClassParentId);
if (Pointer == PointerType::None) {
OS << Symbol.getCallingConvention() << " ";
if (ClassParent)
OS << "(" << ClassParent->getName() << "::)";
} else {
OS << "(" << Symbol.getCallingConvention() << " ";
if (ClassParent)
OS << ClassParent->getName() << "::";
if (Pointer == PointerType::Reference)
OS << "&";
else
OS << "*";
OS << ")";
}
OS << "(";
if (auto ChildEnum = Symbol.getArguments()) {
uint32_t Index = 0;
while (auto Arg = ChildEnum->getNext()) {
Arg->dump(OS, 0, *this);
if (++Index < ChildEnum->getChildCount())
OS << ", ";
}
}
OS << ")";
if (Symbol.isConstType())
OS << " const";
if (Symbol.isVolatileType())
OS << " volatile";
}
void FunctionDumper::start(const PDBSymbolFunc &Symbol, raw_ostream &OS) {
if (Symbol.isVirtual() || Symbol.isPureVirtual())
OS << "virtual ";
auto Signature = Symbol.getSignature();
if (!Signature) {
OS << Symbol.getName();
return;
}
auto ReturnType = Signature->getReturnType();
ReturnType->dump(OS, 0, *this);
OS << " " << Signature->getCallingConvention() << " ";
OS << Symbol.getName();
OS << "(";
if (auto ChildEnum = Signature->getArguments()) {
uint32_t Index = 0;
while (auto Arg = ChildEnum->getNext()) {
Arg->dump(OS, 0, *this);
if (++Index < ChildEnum->getChildCount())
OS << ", ";
}
}
OS << ")";
if (Symbol.isConstType())
OS << " const";
if (Symbol.isVolatileType())
OS << " volatile";
if (Symbol.isPureVirtual())
OS << " = 0";
}
void FunctionDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
int Indent) {
uint32_t ElementTypeId = Symbol.getTypeId();
auto ElementType = Symbol.getSession().getSymbolById(ElementTypeId);
if (!ElementType)
return;
ElementType->dump(OS, 0, *this);
OS << "[" << Symbol.getLength() << "]";
}
void FunctionDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
PDB_BuiltinType Type = Symbol.getBuiltinType();
OS << Type;
if (Type == PDB_BuiltinType::UInt || Type == PDB_BuiltinType::Int)
OS << (8 * Symbol.getLength()) << "_t";
}
void FunctionDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
dumpClassParentWithScopeOperator(Symbol, OS, *this);
OS << 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.
uint32_t TypeId = Symbol.getTypeId();
auto Type = Symbol.getSession().getSymbolById(TypeId);
if (!Type)
return;
Type->dump(OS, 0, *this);
}
void FunctionDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
dumpClassParentWithScopeOperator(Symbol, OS, *this);
OS << Symbol.getName();
}
void FunctionDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent) {
uint32_t PointeeId = Symbol.getTypeId();
auto PointeeType = Symbol.getSession().getSymbolById(PointeeId);
if (!PointeeType)
return;
if (auto FuncSig = dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType.get())) {
FunctionDumper NestedDumper;
PointerType Pointer =
Symbol.isReference() ? PointerType::Reference : PointerType::Pointer;
NestedDumper.start(*FuncSig, Pointer, OS);
} else {
if (Symbol.isConstType())
OS << "const ";
if (Symbol.isVolatileType())
OS << "volatile ";
PointeeType->dump(OS, Indent, *this);
OS << (Symbol.isReference() ? "&" : "*");
}
}
void FunctionDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) {
OS << Symbol.getName();
}

View File

@ -0,0 +1,44 @@
//===- FunctionDumper.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_FUNCTIONDUMPER_H
#define LLVM_TOOLS_LLVMPDBDUMP_FUNCTIONDUMPER_H
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
namespace llvm {
class FunctionDumper : public PDBSymDumper {
public:
FunctionDumper();
enum class PointerType { None, Pointer, Reference };
void start(const PDBSymbolTypeFunctionSig &Symbol, PointerType Pointer,
raw_ostream &OS);
void start(const PDBSymbolFunc &Symbol, raw_ostream &OS);
void dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeFunctionArg &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) override;
};
}
#endif

View File

@ -0,0 +1,63 @@
//===- TypeDumper.cpp - PDBSymDumper implementation for types *----- C++ *-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "TypeDumper.h"
#include "FunctionDumper.h"
#include "llvm-pdbdump.h"
#include "TypedefDumper.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
using namespace llvm;
TypeDumper::TypeDumper() : PDBSymDumper(true) {}
void TypeDumper::start(const PDBSymbolExe &Exe, raw_ostream &OS, int Indent) {
auto Enums = Exe.findAllChildren<PDBSymbolTypeEnum>();
OS << newline(Indent) << "Enums: (" << Enums->getChildCount() << " items)";
while (auto Enum = Enums->getNext())
Enum->dump(OS, Indent + 2, *this);
auto FuncSigs = Exe.findAllChildren<PDBSymbolTypeFunctionSig>();
OS << newline(Indent);
OS << "Function Signatures: (" << FuncSigs->getChildCount() << " items)";
while (auto Sig = FuncSigs->getNext())
Sig->dump(OS, Indent + 2, *this);
auto Typedefs = Exe.findAllChildren<PDBSymbolTypeTypedef>();
OS << newline(Indent) << "Typedefs: (" << Typedefs->getChildCount()
<< " items)";
while (auto Typedef = Typedefs->getNext())
Typedef->dump(OS, Indent + 2, *this);
}
void TypeDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent) << "enum " << Symbol.getName();
}
void TypeDumper::dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
FunctionDumper Dumper;
Dumper.start(Symbol, FunctionDumper::PointerType::None, OS);
}
void TypeDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
OS << newline(Indent);
TypedefDumper Dumper;
Dumper.start(Symbol, OS, Indent);
OS.flush();
}

View File

@ -0,0 +1,32 @@
//===- TypeDumper.h - PDBSymDumper implementation for types *- 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_TYPEDUMPER_H
#define LLVM_TOOLS_LLVMPDBDUMP_TYPEDUMPER_H
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
namespace llvm {
class TypeDumper : public PDBSymDumper {
public:
TypeDumper();
void start(const PDBSymbolExe &Exe, raw_ostream &OS, int Indent);
void dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) override;
};
}
#endif

View File

@ -0,0 +1,84 @@
//===- TypedefDumper.cpp - PDBSymDumper impl for typedefs -------- * C++ *-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "TypedefDumper.h"
#include "FunctionDumper.h"
#include "llvm-pdbdump.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/PDBExtras.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
using namespace llvm;
TypedefDumper::TypedefDumper() : PDBSymDumper(true) {}
void TypedefDumper::start(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS,
int Indent) {
OS << "typedef:" << Symbol.getName() << " -> ";
uint32_t TargetId = Symbol.getTypeId();
if (auto TypeSymbol = Symbol.getSession().getSymbolById(TargetId))
TypeSymbol->dump(OS, 0, *this);
}
void TypedefDumper::dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
int Indent) {}
void TypedefDumper::dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) {
PDB_BuiltinType Type = Symbol.getBuiltinType();
OS << Type;
if (Type == PDB_BuiltinType::UInt || Type == PDB_BuiltinType::Int)
OS << (8 * Symbol.getLength()) << "_t";
}
void TypedefDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) {
OS << "enum " << Symbol.getName();
}
void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent) {
if (Symbol.isConstType())
OS << "const ";
if (Symbol.isVolatileType())
OS << "volatile ";
uint32_t PointeeId = Symbol.getTypeId();
auto PointeeType = Symbol.getSession().getSymbolById(PointeeId);
if (!PointeeType)
return;
if (auto FuncSig = dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType.get())) {
FunctionDumper::PointerType Pointer = FunctionDumper::PointerType::Pointer;
if (Symbol.isReference())
Pointer = FunctionDumper::PointerType::Reference;
FunctionDumper NestedDumper;
NestedDumper.start(*FuncSig, Pointer, OS);
OS.flush();
} else {
PointeeType->dump(OS, Indent, *this);
OS << ((Symbol.isReference()) ? "&" : "*");
}
}
void TypedefDumper::dump(const PDBSymbolTypeFunctionSig &Symbol,
raw_ostream &OS, int Indent) {
FunctionDumper Dumper;
Dumper.start(Symbol, FunctionDumper::PointerType::None, OS);
}
void TypedefDumper::dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) {
OS << "class " << Symbol.getName();
}

View File

@ -0,0 +1,38 @@
//===- TypedefDumper.h - llvm-pdbdump typedef dumper ---------*- 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_TYPEDEFDUMPER_H
#define LLVM_TOOLS_LLVMPDBDUMP_TYPEDEFDUMPER_H
#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
namespace llvm {
class TypedefDumper : public PDBSymDumper {
public:
TypedefDumper();
void start(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS, int Indent);
void dump(const PDBSymbolTypeArray &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeBuiltin &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypePointer &Symbol, raw_ostream &OS,
int Indent) override;
void dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS,
int Indent) override;
};
}
#endif

View File

@ -13,6 +13,10 @@
//
//===----------------------------------------------------------------------===//
#include "llvm-pdbdump.h"
#include "CompilandDumper.h"
#include "TypeDumper.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Config/config.h"
@ -24,12 +28,13 @@
#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Signals.h"
#if defined(HAVE_DIA_SDK)
#include <Windows.h>
@ -61,24 +66,36 @@ static void dumpInput(StringRef Path) {
}
auto GlobalScope(Session->getGlobalScope());
std::string FileName(GlobalScope->getSymbolsFileName());
outs() << "Summary for " << FileName;
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: ";
if (GlobalScope->hasCTypes())
outs() << "HasCTypes ";
if (GlobalScope->hasPrivateSymbols())
outs() << "HasPrivateSymbols ";
PDB_DumpFlags Flags = PDB_DF_None;
if (opts::DumpTypes)
Flags |= PDB_DF_Children | PDB_DF_Enums | PDB_DF_Funcsigs |
PDB_DF_Typedefs | PDB_DF_VTables;
GlobalScope->dump(outs(), 0, PDB_DumpLevel::Normal, Flags);
outs() << "\n";
if (opts::DumpTypes) {
outs() << "\nDumping types";
TypeDumper Dumper;
Dumper.start(*GlobalScope, outs(), 2);
}
if (opts::DumpSymbols || opts::DumpCompilands) {
outs() << "Dumping compilands\n";
outs() << "\nDumping compilands";
auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
Flags = PDB_DF_None;
if (opts::DumpSymbols)
Flags |= PDB_DF_Children | PDB_DF_Data | PDB_DF_Functions |
PDB_DF_Thunks | PDB_DF_Labels;
while (auto Compiland = Compilands->getNext()) {
Compiland->dump(outs(), 2, PDB_DumpLevel::Detailed, Flags);
outs() << "\n";
}
CompilandDumper Dumper;
while (auto Compiland = Compilands->getNext())
Dumper.start(*Compiland, outs(), 2, opts::DumpSymbols);
}
outs().flush();
}

View File

@ -0,0 +1,28 @@
//===- llvm-pdbdump.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_LLVMPDBDUMP_H
#define LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
#include "llvm/Support/raw_ostream.h"
namespace llvm {
struct newline {
newline(int IndentWidth) : Width(IndentWidth) {}
int Width;
};
inline raw_ostream &operator<<(raw_ostream &OS, const newline &Indent) {
OS << "\n";
OS.indent(Indent.Width);
return OS;
}
}
#endif