This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix ICE on 'Address of renaming of unconstrained array with -g


The ICE is only the tip of the iceberg (an UNCONSTRAINED_ARRAY_TYPE slips 
through the cracks down to dwarf2out.c), it's actually a bad interaction 
between renaming and volatileness:

procedure P is
? ?function F return String is begin return ""; end F;
? ?S1 : String renames F;
? ?subtype ST is String (1 .. S1'Length);
? ?S2 : ST;
? ?for S2'Address use S1'Address;
begin
? ?null;
end;

S1 is overlaid through 'Address so it is effectively made volatile by the FE, 
in addition to being a renaming. ?This confuses the renaming code when it 
needs to make a renaming pointer because the TYPE_POINTER_TO field has not 
been adjusted.

Fixed by moving the code dealing with volatileness to after the code dealing 
with renaming. ?Both cannot be activated directly at the language level (you 
cannot apply pragma Volatile to a renaming entity) and it's too late in any 
cases for volatileness to have any effect at this point, it should be set on 
the renamed object instead of the renaming entity.

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


2008-10-07  Eric Botcazou  <ebotcazou@adacore.com>

????????* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Move code
	dealing with volatileness to after code dealing with renaming.


2008-10-07  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/addr4.adb: New test.
	* gnat.dg/addr5.adb: Likewise.


-- 
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 140904)
+++ gcc-interface/decl.c	(working copy)
@@ -828,22 +828,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 				     "PAD", false, definition,
 				     gnu_size ? true : false);
 
-	/* Make a volatile version of this object's type if we are to make
-	   the object volatile.  We also interpret 13.3(19) conservatively
-	   and disallow any optimizations for an object covered by it.  */
-	if ((Treat_As_Volatile (gnat_entity)
-	     || (Is_Exported (gnat_entity)
-		 /* Exclude exported constants created by the compiler,
-		    which should boil down to static dispatch tables and
-		    make it possible to put them in read-only memory.  */
-		 && (Comes_From_Source (gnat_entity) || !const_flag))
-	     || Is_Imported (gnat_entity)
-	     || Present (Address_Clause (gnat_entity)))
-	    && !TYPE_VOLATILE (gnu_type))
-	  gnu_type = build_qualified_type (gnu_type,
-					   (TYPE_QUALS (gnu_type)
-					    | TYPE_QUAL_VOLATILE));
-
 	/* If this is a renaming, avoid as much as possible to create a new
 	   object.  However, in several cases, creating it is required.
 	   This processing needs to be applied to the raw expression so
@@ -991,22 +975,38 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	      }
 	  }
 
-	/* If this is an aliased object whose nominal subtype is unconstrained,
-	   the object is a record that contains both the template and
-	   the object.  If there is an initializer, it will have already
-	   been converted to the right type, but we need to create the
-	   template if there is no initializer.  */
-	else if (definition
-		 && TREE_CODE (gnu_type) == RECORD_TYPE
-		 && (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
-		     /* Beware that padding might have been introduced
-			via maybe_pad_type above.  */
-		     || (TYPE_IS_PADDING_P (gnu_type)
-			 && TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
-			    == RECORD_TYPE
-			 && TYPE_CONTAINS_TEMPLATE_P
-			    (TREE_TYPE (TYPE_FIELDS (gnu_type)))))
-		 && !gnu_expr)
+	/* Make a volatile version of this object's type if we are to make
+	   the object volatile.  We also interpret 13.3(19) conservatively
+	   and disallow any optimizations for an object covered by it.  */
+	if ((Treat_As_Volatile (gnat_entity)
+	     || (Is_Exported (gnat_entity)
+		 /* Exclude exported constants created by the compiler,
+		    which should boil down to static dispatch tables and
+		    make it possible to put them in read-only memory.  */
+		 && (Comes_From_Source (gnat_entity) || !const_flag))
+	     || Is_Imported (gnat_entity)
+	     || Present (Address_Clause (gnat_entity)))
+	    && !TYPE_VOLATILE (gnu_type))
+	  gnu_type = build_qualified_type (gnu_type,
+					   (TYPE_QUALS (gnu_type)
+					    | TYPE_QUAL_VOLATILE));
+
+	/* If we are defining an aliased object whose nominal subtype is
+	   unconstrained, the object is a record that contains both the
+	   template and the object.  If there is an initializer, it will
+	   have already been converted to the right type, but we need to
+	   create the template if there is no initializer.  */
+	if (definition
+	    && !gnu_expr
+	    && TREE_CODE (gnu_type) == RECORD_TYPE
+	    && (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
+	        /* Beware that padding might have been introduced
+		   via maybe_pad_type above.  */
+		|| (TYPE_IS_PADDING_P (gnu_type)
+		    && TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
+		       == RECORD_TYPE
+		    && TYPE_CONTAINS_TEMPLATE_P
+		       (TREE_TYPE (TYPE_FIELDS (gnu_type))))))
 	  {
 	    tree template_field
 	      = TYPE_IS_PADDING_P (gnu_type)
-- { dg-do compile }
-- { dg-options "-g" }

procedure Addr4 is
   function F return String is begin return ""; end F;
   S1 : String renames F;
   subtype ST is String (1 .. S1'Length);
   S2 : ST;
   for S2'Address use S1'Address;
begin
   null;
end;
-- { dg-do compile }
-- { dg-options "-g" }

procedure Addr5 (Len : Integer) is
  S : aliased String (1 .. Len) := (others => ' ');
  C : Character;
  for C'Address use S'Address;
begin
  null;
end;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]