diff options
author | Devang Patel <dpatel@apple.com> | 2011-02-15 17:24:56 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2011-02-15 17:24:56 +0000 |
commit | 497acb91dc9a433f8196c08c941082ad6e9fbe9d (patch) | |
tree | 3a205f33943606aee4e0c623175e204b9f811ddb /lib/Analysis | |
parent | ab4c366274a582dd8146b2820c6b999cad5fce36 (diff) | |
download | external_llvm-497acb91dc9a433f8196c08c941082ad6e9fbe9d.zip external_llvm-497acb91dc9a433f8196c08c941082ad6e9fbe9d.tar.gz external_llvm-497acb91dc9a433f8196c08c941082ad6e9fbe9d.tar.bz2 |
Print function info. Patch by Minjang Kim.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125567 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/DbgInfoPrinter.cpp | 8 | ||||
-rw-r--r-- | 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 a460777..f13ad6e 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<Function>(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 29bbeb5..78da1b4 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<MDNode>(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) { @@ -1633,6 +1650,17 @@ bool llvm::getLocationInfo(const Value *V, std::string &DisplayName, LineNo = Var.getLineNumber(); Unit = Var.getCompileUnit(); TypeD = Var.getType(); + } else if (Function *F = dyn_cast<Function>(const_cast<Value*>(V))){ + Value *DIF = findDbgSubprogramDeclare(F); + if (!DIF) return false; + DISubprogram Var(cast<MDNode>(DIF)); + + StringRef D = Var.getDisplayName(); + if (!D.empty()) + DisplayName = D; + LineNo = Var.getLineNumber(); + Unit = Var.getCompileUnit(); + TypeD = Var.getType(); } else { const DbgDeclareInst *DDI = findDbgDeclare(V); if (!DDI) return false; |