summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp')
-rw-r--r--llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp46
1 files changed, 44 insertions, 2 deletions
diff --git a/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp b/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
index 38959f1445f..fcd533cb6c6 100644
--- a/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
+++ b/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
@@ -9,13 +9,55 @@
#include <utility>
+#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
-using namespace llvm;
+#include "llvm/Support/Format.h"
+using namespace llvm;
PDBSymbolFunc::PDBSymbolFunc(const IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
-void PDBSymbolFunc::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolFunc::dump(raw_ostream &OS, int Indent,
+ PDB_DumpLevel Level) const {
+ bool doFullDump = false;
+ if (Level == PDB_DumpLevel::Compact) {
+ uint32_t FuncStart = getRelativeVirtualAddress();
+ uint32_t FuncEnd = FuncStart + getLength();
+ auto DebugEndSymbol = findChildren(PDB_SymType::FuncDebugEnd);
+ OS << stream_indent(Indent);
+ OS << "[" << format_hex(FuncStart, 8);
+ if (auto DebugStartEnum = findChildren(PDB_SymType::FuncDebugStart)) {
+ if (auto StartSym = DebugStartEnum->getNext()) {
+ auto DebugStart = dyn_cast<PDBSymbolFuncDebugStart>(StartSym.get());
+ OS << "+" << DebugStart->getRelativeVirtualAddress() - FuncStart;
+ }
+ }
+ OS << " - " << format_hex(FuncEnd, 8);
+ if (auto DebugEndEnum = findChildren(PDB_SymType::FuncDebugEnd)) {
+ if (auto DebugEndSym = DebugEndEnum->getNext()) {
+ auto DebugEnd = dyn_cast<PDBSymbolFuncDebugEnd>(DebugEndSym.get());
+ OS << "-" << FuncEnd - DebugEnd->getRelativeVirtualAddress();
+ }
+ }
+ OS << "] ";
+ PDB_RegisterId Reg = getLocalBasePointerRegisterId();
+ if (Reg == PDB_RegisterId::VFrame)
+ OS << "(VFrame)";
+ else if (hasFramePointer()) {
+ if (Reg == PDB_RegisterId::EBP)
+ OS << "(EBP)";
+ else
+ OS << "(" << (int)Reg << ")";
+ } else {
+ OS << "(FPO)";
+ doFullDump = true;
+ }
+ OS << " " << getName() << "\n";
+ }
+ OS.flush();
+}
OpenPOWER on IntegriCloud