* [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).