This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch c/c++]: Fix for PR c/52991 issue about ignored packed-attribute for ms-structure-layout
- From: Kai Tietz <ktietz70 at googlemail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Henderson <rth at redhat dot com>
- Date: Tue, 11 Dec 2012 23:04:48 +0100
- Subject: [patch c/c++]: Fix for PR c/52991 issue about ignored packed-attribute for ms-structure-layout
Hello,
This fixes an old regression about ms-structure-layout in combination
with packed-attribute.
ChangeLog
2012-12-11 Kai Tietz
PR c/52991
* stor-layout.c (start_record_layout): Handle
packed-attribute for ms-structure-layout.
(update_alignment_for_field): Likewise.
(place_field): Likewise.
Tested for i686-w64-mingw32, x86_64-w64-mingw32, and for
x86_64-unknown-linux-gnu. Ok for apply?
Regards,
Kai
Index: stor-layout.c
===================================================================
--- stor-layout.c (Revision 194386)
+++ stor-layout.c (Arbeitskopie)
@@ -756,7 +756,10 @@ start_record_layout (tree t)
/* If the type has a minimum specified alignment (via an attribute
declaration, for example) use it -- otherwise, start with a
one-byte alignment. */
- rli->record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (t));
+ if (TYPE_PACKED (t))
+ rli->record_align = BITS_PER_UNIT;
+ else
+ rli->record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (t));
rli->unpacked_align = rli->record_align;
rli->offset_align = MAX (rli->record_align, BIGGEST_ALIGNMENT);
@@ -952,15 +955,20 @@ update_alignment_for_field (record_layout_info rli
meaningless. */
if (targetm.ms_bitfield_layout_p (rli->t))
{
+ if (rli->t && TYPE_PACKED (rli->t)
+ && (is_bitfield || !DECL_PACKED (field)
+ || DECL_SIZE (field) == NULL_TREE
+ || !integer_zerop (DECL_SIZE (field))))
+ desired_align = BITS_PER_UNIT;
/* Here, the alignment of the underlying type of a bitfield can
affect the alignment of a record; even a zero-sized field
can do this. The alignment should be to the alignment of
the type, except that for zero-size bitfields this only
applies if there was an immediately prior, nonzero-size
bitfield. (That's the way it is, experimentally.) */
- if ((!is_bitfield && !DECL_PACKED (field))
- || ((DECL_SIZE (field) == NULL_TREE
- || !integer_zerop (DECL_SIZE (field)))
+ else if ((!is_bitfield && !DECL_PACKED (field))
+ || ((DECL_SIZE (field) == NULL_TREE
+ || !integer_zerop (DECL_SIZE (field)))
? !DECL_PACKED (field)
: (rli->prev_field
&& DECL_BIT_FIELD_TYPE (rli->prev_field)
@@ -1414,7 +1422,13 @@ place_field (record_layout_info rli, tree field)
}
/* Now align (conventionally) for the new type. */
- type_align = TYPE_ALIGN (TREE_TYPE (field));
+ if (!TYPE_PACKED (rli->t))
+ {
+ type_align = TYPE_ALIGN (TREE_TYPE (field));
+ if (DECL_PACKED (field))
+ type_align = MIN (type_align, BITS_PER_UNIT);
+
+ }
if (maximum_field_alignment != 0)
type_align = MIN (type_align, maximum_field_alignment);