From c253bc8cd89728259ebfc568c287aa085d9b8397 Mon Sep 17 00:00:00 2001
From: Eric Botcazou <ebotcazou@adacore.com>
Date: Fri, 6 Jul 2012 07:44:52 +0000
Subject: [PATCH] Revert 	2012-06-14  Eric Botcazou 
 <ebotcazou@adacore.com>

	* dwarf2out.c (function_possibly_abstracted_p): New static function.
	(gen_subprogram_die): Use it function_possibly_abstracted_p in lieu of
	cgraph_function_possibly_inlined_p.
	(gen_inlined_subroutine_die): Return if the origin is to be ignored.
	(process_scope_var): Do not emit concrete instances of abstracted
	nested functions from here.
	(gen_decl_die): Emit the abstract instance if the function is possibly
	abstracted and not only possibly inlined.
	(dwarf2out_finish): Find the first non-abstract parent instance and
	attach concrete instances on the limbo list to it.

From-SVN: r189311
---
 gcc/ChangeLog   | 16 +++++++++++++
 gcc/dwarf2out.c | 63 +++++++------------------------------------------
 2 files changed, 25 insertions(+), 54 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b47a220562dc..40c165306389 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+2012-07-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+	Revert
+	2012-06-14  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* dwarf2out.c (function_possibly_abstracted_p): New static function.
+	(gen_subprogram_die): Use it function_possibly_abstracted_p in lieu of
+	cgraph_function_possibly_inlined_p.
+	(gen_inlined_subroutine_die): Return if the origin is to be ignored.
+	(process_scope_var): Do not emit concrete instances of abstracted
+	nested functions from here.
+	(gen_decl_die): Emit the abstract instance if the function is possibly
+	abstracted and not only possibly inlined.
+	(dwarf2out_finish): Find the first non-abstract parent instance and
+	attach concrete instances on the limbo list to it.
+
 2012-07-05  Ramana Radhakrishnan  <ramana.radhakrishnan@linaro.org>
 	    Julian Brown  <julian@codesourcery.com>
 
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 08116b5c74ba..1fc76fe19a6e 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -16825,30 +16825,6 @@ gen_call_site_die (tree decl, dw_die_ref subr_die,
   return die;
 }
 
-/* Return true if an abstract instance of function DECL can be generated in
-   the debug information.  */
-
-static bool
-function_possibly_abstracted_p (tree decl)
-{
-  /* An abstract instance of DECL can be generated if DECL can be inlined or
-     is nested in a function that can be inlined, recursively.  */
-  while (decl)
-    {
-      if (cgraph_function_possibly_inlined_p (decl))
-	return true;
-      decl = decl_function_context (decl);
-      /* Do not consider Fortran subroutines as nested in the main program.  */
-      if (decl
-	  && is_fortran ()
-	  && !strcmp (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
-		      "MAIN__"))
-        break;
-    }
-
-  return false;
-}
-
 /* Generate a DIE to represent a declared function (either file-scope or
    block-local).  */
 
@@ -17003,14 +16979,14 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
     {
       if (DECL_DECLARED_INLINE_P (decl))
 	{
-	  if (function_possibly_abstracted_p (decl))
+	  if (cgraph_function_possibly_inlined_p (decl))
 	    add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined);
 	  else
 	    add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_not_inlined);
 	}
       else
 	{
-	  if (function_possibly_abstracted_p (decl))
+	  if (cgraph_function_possibly_inlined_p (decl))
 	    add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
 	  else
 	    add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_not_inlined);
@@ -17936,8 +17912,6 @@ gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die, int depth)
   gcc_assert (! BLOCK_ABSTRACT (stmt));
 
   decl = block_ultimate_origin (stmt);
-  if (DECL_IGNORED_P (decl))
-    return;
 
   /* Emit info for the abstract instance first, if we haven't yet.  We
      must emit this even if the block is abstract, otherwise when we
@@ -18882,7 +18856,6 @@ gen_block_die (tree stmt, dw_die_ref context_die, int depth)
 
 /* Process variable DECL (or variable with origin ORIGIN) within
    block STMT and add it to CONTEXT_DIE.  */
-
 static void
 process_scope_var (tree stmt, tree decl, tree origin, dw_die_ref context_die)
 {
@@ -18900,15 +18873,8 @@ process_scope_var (tree stmt, tree decl, tree origin, dw_die_ref context_die)
   if (die != NULL && die->die_parent == NULL)
     add_child_die (context_die, die);
   else if (TREE_CODE (decl_or_origin) == IMPORTED_DECL)
-    dwarf2out_imported_module_or_decl_1 (decl_or_origin,
-					 DECL_NAME (decl_or_origin),
+    dwarf2out_imported_module_or_decl_1 (decl_or_origin, DECL_NAME (decl_or_origin),
 					 stmt, context_die);
-  /* Do not emit concrete instances of abstracted nested functions within
-     concrete instances of parent functions.  */
-  else if (TREE_CODE (decl_or_origin) == FUNCTION_DECL
-	   && die
-	   && get_AT (die, DW_AT_inline))
-    ;
   else
     gen_decl_die (decl, origin, context_die);
 }
@@ -19258,11 +19224,11 @@ gen_decl_die (tree decl, tree origin, dw_die_ref context_die)
 				     ? DECL_ORIGIN (origin)
 				     : DECL_ABSTRACT_ORIGIN (decl));
 
-      /* If we're emitting an out-of-line copy of an abstracted function,
+      /* If we're emitting an out-of-line copy of an inline function,
 	 emit info for the abstract instance and set up to refer to it.  */
-      else if (!DECL_ABSTRACT (decl)
-	       && function_possibly_abstracted_p (decl)
-	       && !class_or_namespace_scope_p (context_die)
+      else if (cgraph_function_possibly_inlined_p (decl)
+	       && ! DECL_ABSTRACT (decl)
+	       && ! class_or_namespace_scope_p (context_die)
 	       /* dwarf2out_abstract_function won't emit a die if this is just
 		  a declaration.  We must avoid setting DECL_ABSTRACT_ORIGIN in
 		  that case, because that works only if we have a die.  */
@@ -22263,19 +22229,8 @@ dwarf2out_finish (const char *filename)
 	{
 	  dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
 
-	  if (origin)
-	    {
-	      /* Find the first non-abstract parent instance.  */
-	      do
-		origin = origin->die_parent;
-	      while (origin
-		     && (origin->die_tag != DW_TAG_subprogram
-			 || get_AT (origin, DW_AT_inline)));
-	      if (origin)
-		add_child_die (origin, die);
-	      else
-		add_child_die (comp_unit_die (), die);
-	    }
+	  if (origin && origin->die_parent)
+	    add_child_die (origin->die_parent, die);
 	  else if (is_cu_die (die))
 	    ;
 	  else if (seen_error ())
-- 
GitLab