mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
b7d9bc75c5
This adds the --class-definitions flag. If specified, when dumping types, instead of "class Foo" you will see the full class definition, with member functions, constructors, access specifiers. NOTE: Using this option can be very slow, as generating a full class definition requires accessing many different parts of the PDB. llvm-svn: 230203
118 lines
3.8 KiB
C++
118 lines
3.8 KiB
C++
//===- 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) {
|
|
if (Symbol.getLength() == 0)
|
|
return;
|
|
|
|
FunctionDumper Dumper;
|
|
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();
|
|
}
|
|
|
|
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() << ")";
|
|
}
|