Patchwork [Ada] Fix slightly invalid debug info

login
register
mail settings
Submitter Eric Botcazou
Date Jan. 4, 2011, 9:42 a.m.
Message ID <201101041042.22033.ebotcazou@adacore.com>
Download mbox | patch
Permalink /patch/77442/
State New
Headers show

Comments

Eric Botcazou - Jan. 4, 2011, 9:42 a.m.
This fixes a regression present on the mainline and 4.5 branch, which results 
in slightly invalid DWARF debug info (some consumers issue a warning for it): 
OUT parameters for procedures may appear within a lexical block instead of at 
the outermost level.

Tested on i586-suse-linux, applied on the mainline and 4.5 branch.


2011-01-04  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (Subprogram_Body_to_gnu): Evaluate the
	expressions of the parameter cache within the statement group of
	the CICO mechanism.

Patch

Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 168455)
+++ gcc-interface/trans.c	(working copy)
@@ -2603,6 +2603,31 @@  Subprogram_Body_to_gnu (Node_Id gnat_nod
   gnat_poplevel ();
   gnu_result = end_stmt_group ();
 
+  /* If we populated the parameter attributes cache, we need to make sure that
+     the cached expressions are evaluated on all the possible paths leading to
+     their uses.  So we force their evaluation on entry of the function.  */
+  cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
+  if (cache)
+    {
+      struct parm_attr_d *pa;
+      int i;
+
+      start_stmt_group ();
+
+      FOR_EACH_VEC_ELT (parm_attr, cache, i, pa)
+	{
+	  if (pa->first)
+	    add_stmt_with_node_force (pa->first, gnat_node);
+	  if (pa->last)
+	    add_stmt_with_node_force (pa->last, gnat_node);
+	  if (pa->length)
+	    add_stmt_with_node_force (pa->length, gnat_node);
+	}
+
+      add_stmt (gnu_result);
+      gnu_result = end_stmt_group ();
+    }
+
   /* If we are dealing with a return from an Ada procedure with parameters
      passed by copy-in/copy-out, we need to return a record containing the
      final values of these parameters.  If the list contains only one entry,
@@ -2637,31 +2662,6 @@  Subprogram_Body_to_gnu (Node_Id gnat_nod
 
   VEC_pop (tree, gnu_return_label_stack);
 
-  /* If we populated the parameter attributes cache, we need to make sure that
-     the cached expressions are evaluated on all the possible paths leading to
-     their uses.  So we force their evaluation on entry of the function.  */
-  cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
-  if (cache)
-    {
-      struct parm_attr_d *pa;
-      int i;
-
-      start_stmt_group ();
-
-      FOR_EACH_VEC_ELT (parm_attr, cache, i, pa)
-	{
-	  if (pa->first)
-	    add_stmt_with_node_force (pa->first, gnat_node);
-	  if (pa->last)
-	    add_stmt_with_node_force (pa->last, gnat_node);
-	  if (pa->length)
-	    add_stmt_with_node_force (pa->length, gnat_node);
-	}
-
-      add_stmt (gnu_result);
-      gnu_result = end_stmt_group ();
-    }
-
   end_subprog_body (gnu_result);
 
   /* Attempt setting the end_locus of our GCC body tree, typically a