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] Small adjustment to make_packable_type


make_packable_type attempts to build a version of a (generally non-packed) 
record type to make it suitable for packing within another record.  This 
means resizing the type to its RM size, in particular ditching the padding 
bits of the last component, if any.

However, in a non-packed record type, the padding bits of the last component 
are excluded from the RM size only if it is of an aggregate type; that is to 
say, the extra bits in an integer subtype are included in the RM size of the 
record type.

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


2008-05-01  Eric Botcazou  <ebotcazou@adacore.com>

	* decl.c (make_packable_type): Resize the last component to its RM size
	only if it is of an aggregate type.
	* trans.c (call_to_gnu): Fix nit in comment.
	(gnat_to_gnu): Likewise.


-- 
Eric Botcazou
Index: trans.c
===================================================================
--- trans.c	(revision 134791)
+++ trans.c	(working copy)
@@ -2204,7 +2204,7 @@ call_to_gnu (Node_Id gnat_node, tree *gn
 	     of the object if they are distinct, because the expectations
 	     of the callee would otherwise not be met:
 	       - if it's a justified modular type,
-	       - if the actual type is a packed version of it.  */
+	       - if the actual type is a packable version of it.  */
 	  else if (TREE_CODE (gnu_name_type) == RECORD_TYPE
 		   && (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)
 		       || larger_record_type_p (gnu_name_type,
@@ -4902,7 +4902,7 @@ gnat_to_gnu (Node_Id gnat_node)
 	  type wrong due to "instantiating" the unconstrained record with
 	  discriminant values.  Similarly, if the two types are record types
 	  with the same name don't convert.  This will be the case when we are
-	  converting from a packed version of a type to its original type and
+	  converting from a packable version of a type to its original type and
 	  we need those conversions to be NOPs in order for assignments into
 	  these types to work properly.
 
Index: decl.c
===================================================================
--- decl.c	(revision 134791)
+++ decl.c	(working copy)
@@ -5487,9 +5487,8 @@ make_packable_type (tree type, bool in_r
 
   TYPE_USER_ALIGN (new_type) = 1;
 
-  /* Now copy the fields, keeping the position and size as we don't
-     want to propagate packedness downward.  But make an exception
-     for the last field in order to ditch the padding bits.  */
+  /* Now copy the fields, keeping the position and size as we don't want
+     to change the layout by propagating the packedness downwards.  */
   for (old_field = TYPE_FIELDS (type); old_field;
        old_field = TREE_CHAIN (old_field))
     {
@@ -5503,8 +5502,18 @@ make_packable_type (tree type, bool in_r
 	  && host_integerp (TYPE_SIZE (new_field_type), 1))
 	new_field_type = make_packable_type (new_field_type, true);
 
-      if (!TREE_CHAIN (old_field) && !TYPE_PACKED (type))
-	new_size = rm_size (new_field_type);
+      /* However, for the last field in a not already packed record type
+	 that is of an aggregate type, we need to use the RM_Size in the
+	 packable version of the record type, see finish_record_type.  */
+      if (!TREE_CHAIN (old_field)
+	  && !TYPE_PACKED (type)
+	  && (TREE_CODE (new_field_type) == RECORD_TYPE
+	      || TREE_CODE (new_field_type) == UNION_TYPE
+	      || TREE_CODE (new_field_type) == QUAL_UNION_TYPE)
+	  && !TYPE_IS_FAT_POINTER_P (new_field_type)
+	  && !TYPE_CONTAINS_TEMPLATE_P (new_field_type)
+	  && TYPE_ADA_SIZE (new_field_type))
+	new_size = TYPE_ADA_SIZE (new_field_type);
       else
 	new_size = DECL_SIZE (old_field);
 

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