summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2011-02-15 17:24:56 +0000
committerDevang Patel <dpatel@apple.com>2011-02-15 17:24:56 +0000
commit497acb91dc9a433f8196c08c941082ad6e9fbe9d (patch)
tree3a205f33943606aee4e0c623175e204b9f811ddb /lib
parentab4c366274a582dd8146b2820c6b999cad5fce36 (diff)
downloadllvm-497acb91dc9a433f8196c08c941082ad6e9fbe9d.tar.gz
llvm-497acb91dc9a433f8196c08c941082ad6e9fbe9d.tar.bz2
llvm-497acb91dc9a433f8196c08c941082ad6e9fbe9d.tar.xz
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')
-rw-r--r--lib/Analysis/DbgInfoPrinter.cpp8
-rw-r--r--lib/Analysis/DebugInfo.cpp28
2 files changed, 34 insertions, 2 deletions
diff --git a/lib/Analysis/DbgInfoPrinter.cpp b/lib/Analysis/DbgInfoPrinter.cpp
index a460777b0e..f13ad6e7c3 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 29bbeb5c44..78da1b49f8 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;