Patchwork [Ada] Fix debug info for access to unconstrained array types

login
register
mail settings
Submitter Eric Botcazou
Date Dec. 13, 2010, 6:09 p.m.
Message ID <201012131909.14927.ebotcazou@adacore.com>
Download mbox | patch
Permalink /patch/75387/
State New
Headers show

Comments

Eric Botcazou - Dec. 13, 2010, 6:09 p.m.
This adds the missing DWARF entries for access to unconstrained array types 
when they happen to be frozen before the designated unconstrained array type.

Tested on i586-suse-linux, applied on the mainline.


2010-12-13  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_General_Access_Type>:
	Build a stub DECL for the dummy fat pointer type in the unconstrained
	array case.
	* gcc-interface/utils.c (update_pointer_to): Set the DECL_ORIGINAL_TYPE
	for all the variants in the fat pointer case.

Patch

Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 167721)
+++ gcc-interface/utils.c	(working copy)
@@ -3501,15 +3501,16 @@  update_pointer_to (tree old_type, tree n
 	{
 	  TYPE_MAIN_VARIANT (t) = new_ptr;
 	  SET_TYPE_UNCONSTRAINED_ARRAY (t, new_type);
-	}
 
-      /* And show the original pointer NEW_PTR to the debugger.  This is the
-	 counterpart of the equivalent processing in gnat_pushdecl when the
-	 unconstrained array type is frozen after access types to it.  */
-      if (TYPE_NAME (ptr) && TREE_CODE (TYPE_NAME (ptr)) == TYPE_DECL)
-	{
-	  DECL_ORIGINAL_TYPE (TYPE_NAME (ptr)) = new_ptr;
-	  DECL_ARTIFICIAL (TYPE_NAME (ptr)) = 0;
+	  /* And show the original pointer NEW_PTR to the debugger.  This is
+	     the counterpart of the special processing for fat pointer types
+	     in gnat_pushdecl, but when the unconstrained array type is only
+	     frozen after access types to it.  */
+	  if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
+	    {
+	      DECL_ORIGINAL_TYPE (TYPE_NAME (t)) = new_ptr;
+	      DECL_ARTIFICIAL (TYPE_NAME (t)) = 0;
+	    }
 	}
 
       /* Now handle updating the allocation record, what the thin pointer
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 167721)
+++ gcc-interface/decl.c	(working copy)
@@ -3566,6 +3566,11 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 		TYPE_DUMMY_P (gnu_array_type) = 1;
 
 		gnu_type = make_node (RECORD_TYPE);
+		/* Build a stub DECL to trigger the special processing for fat
+		   pointer types in gnat_pushdecl.  */
+		TYPE_NAME (gnu_type)
+		  = create_type_stub_decl
+		    (create_concat_name (gnat_desig_equiv, "XUP"), gnu_type);
 		SET_TYPE_UNCONSTRAINED_ARRAY (gnu_type, gnu_desig_type);
 		TYPE_POINTER_TO (gnu_desig_type) = gnu_type;