Print function info. Patch by Minjang Kim.
authorDevang Patel <dpatel@apple.com>
Tue, 15 Feb 2011 17:24:56 +0000 (17:24 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 15 Feb 2011 17:24:56 +0000 (17:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125567 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DbgInfoPrinter.cpp
lib/Analysis/DebugInfo.cpp

index a460777b0e639cea056e86c61972104ec9af1663..f13ad6e7c3da16adf66b028cc876141c1f60d6a9 100644 (file)
@@ -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 << "/";
index 29bbeb5c44ceed528bff69c69f69fc075e2fdf5c..78da1b49f84968e73edf458a1cce83fcaedd0408 100644 (file)
@@ -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) {
@@ -1627,6 +1644,17 @@ bool llvm::getLocationInfo(const Value *V, std::string &DisplayName,
     if (!DIGV) return false;
     DIGlobalVariable Var(cast<MDNode>(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<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;