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.cpp43
1 files changed, 30 insertions, 13 deletions
diff --git a/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp b/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
index 1b52a2670b1..0195ce35ab0 100644
--- a/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
+++ b/llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
@@ -23,6 +23,10 @@ PDBSymbolFunc::PDBSymbolFunc(const IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
+std::unique_ptr<PDBSymbolTypeFunctionSig> PDBSymbolFunc::getSignature() const {
+ return Session.getConcreteSymbolById<PDBSymbolTypeFunctionSig>(getTypeId());
+}
+
void PDBSymbolFunc::dump(raw_ostream &OS, int Indent,
PDB_DumpLevel Level) const {
OS << stream_indent(Indent);
@@ -30,7 +34,7 @@ void PDBSymbolFunc::dump(raw_ostream &OS, int Indent,
uint32_t FuncStart = getRelativeVirtualAddress();
uint32_t FuncEnd = FuncStart + getLength();
if (FuncStart == 0 && FuncEnd == 0) {
- OS << "func [???]";
+ OS << "func [???] ";
} else {
OS << "func ";
OS << "[" << format_hex(FuncStart, 8);
@@ -52,21 +56,34 @@ void PDBSymbolFunc::dump(raw_ostream &OS, int Indent,
OS << " ";
uint32_t FuncSigId = getTypeId();
- if (auto FuncSig = Session.getConcreteSymbolById<PDBSymbolTypeFunctionSig>(
- FuncSigId)) {
- OS << "(" << FuncSig->getCallingConvention() << ") ";
- }
+ 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);
+ OS << " ";
+ }
+
+ OS << FuncSig->getCallingConvention() << " ";
- 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() << "}::";
+ if (auto ClassParent = FuncSig->getClassParent()) {
+ ClassParent->dump(OS, 0, PDB_DumpLevel::Compact);
+ OS << "::";
}
+
+ OS << getName();
+ FuncSig->dumpArgList(OS);
+ } 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();
}
- OS << getName();
} else {
OS << getName();
}
OpenPOWER on IntegriCloud