From 497acb91dc9a433f8196c08c941082ad6e9fbe9d Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 15 Feb 2011 17:24:56 +0000 Subject: [PATCH] Print function info. Patch by Minjang Kim. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125567 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DbgInfoPrinter.cpp | 8 ++++++-- lib/Analysis/DebugInfo.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/Analysis/DbgInfoPrinter.cpp b/lib/Analysis/DbgInfoPrinter.cpp index a460777b0e6..f13ad6e7c3d 100644 --- a/lib/Analysis/DbgInfoPrinter.cpp +++ b/lib/Analysis/DbgInfoPrinter.cpp @@ -66,8 +66,12 @@ void PrintDbgInfo::printVariableDeclaration(const Value *V) { Out << "; "; WriteAsOperand(Out, V, false, 0); - Out << " is variable " << DisplayName - << " of type " << Type << " declared at "; + if (isa(V)) + Out << " is function " << DisplayName + << " of type " << Type << " declared at "; + else + Out << " is variable " << DisplayName + << " of type " << Type << " declared at "; if (PrintDirectory) Out << Directory << "/"; diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp index 29bbeb5c44c..78da1b49f84 100644 --- a/lib/Analysis/DebugInfo.cpp +++ b/lib/Analysis/DebugInfo.cpp @@ -1592,6 +1592,23 @@ static Value *findDbgGlobalDeclare(GlobalVariable *V) { return 0; } +/// Find the debug info descriptor corresponding to this function. +static Value *findDbgSubprogramDeclare(Function *V) { + const Module *M = V->getParent(); + NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"); + if (!NMD) + return 0; + + for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { + DIDescriptor DIG(cast(NMD->getOperand(i))); + if (!DIG.isSubprogram()) + continue; + if (DISubprogram(DIG).getFunction() == V) + return DIG; + } + return 0; +} + /// Finds the llvm.dbg.declare intrinsic corresponding to this value if any. /// It looks through pointer casts too. static const DbgDeclareInst *findDbgDeclare(const Value *V) { @@ -1627,6 +1644,17 @@ bool llvm::getLocationInfo(const Value *V, std::string &DisplayName, if (!DIGV) return false; DIGlobalVariable Var(cast(DIGV)); + StringRef D = Var.getDisplayName(); + if (!D.empty()) + DisplayName = D; + LineNo = Var.getLineNumber(); + Unit = Var.getCompileUnit(); + TypeD = Var.getType(); + } else if (Function *F = dyn_cast(const_cast(V))){ + Value *DIF = findDbgSubprogramDeclare(F); + if (!DIF) return false; + DISubprogram Var(cast(DIF)); + StringRef D = Var.getDisplayName(); if (!D.empty()) DisplayName = D; -- 2.34.1