This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Small adjustment to make_packable_type
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 1 May 2008 12:51:15 +0200
- Subject: [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);