public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Ada] Small adjustment to make_packable_type
@ 2008-05-01 10:50 Eric Botcazou
  0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2008-05-01 10:50 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 819 bytes --]

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

[-- Attachment #2: p.diff --]
[-- Type: text/x-diff, Size: 2794 bytes --]

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);
 

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-01 10:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-01 10:50 [Ada] Small adjustment to make_packable_type Eric Botcazou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).