This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/52238] -mms-bitfields: __attribute__ ((aligned (n))) ignored for struct members
- From: "ktietz at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 15 Feb 2012 18:34:40 +0000
- Subject: [Bug target/52238] -mms-bitfields: __attribute__ ((aligned (n))) ignored for struct members
- Auto-submitted: auto-generated
- References: <bug-52238-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52238
Kai Tietz <ktietz at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ktietz at gcc dot gnu.org
--- Comment #2 from Kai Tietz <ktietz at gcc dot gnu.org> 2012-02-15 18:34:40 UTC ---
in stor-layout.c function place_field() it is said "We already align ms_struct
fields, so don't re-align them". This isn't completely true, as desired_align
isn't handled in ms_struct case.
Following patch seems to solve this issue:
Index: stor-layout.c
===================================================================
--- stor-layout.c (revision 184262)
+++ stor-layout.c (working copy)
@@ -1141,15 +1141,14 @@
}
/* Does this field automatically have alignment it needs by virtue
- of the fields that precede it and the record's own alignment?
- We already align ms_struct fields, so don't re-align them. */
- if (known_align < desired_align
- && !targetm.ms_bitfield_layout_p (rli->t))
+ of the fields that precede it and the record's own alignment? */
+ if (known_align < desired_align)
{
/* No, we need to skip space before this field.
Bump the cumulative size to multiple of field alignment. */
- if (DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION)
+ if (!targetm.ms_bitfield_layout_p (rli->t)
+ && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION)
warning (OPT_Wpadded, "padding struct to align %q+D", field);
/* If the alignment is still within offset_align, just align
@@ -1302,7 +1301,7 @@
type size!) */
HOST_WIDE_INT bitsize = tree_low_cst (DECL_SIZE (field), 1);
- if (rli->remaining_in_alignment < bitsize)
+ if (rli->remaining_in_alignment < bitsize) /* $$$$ */
{
HOST_WIDE_INT typesize = tree_low_cst (TYPE_SIZE (type), 1);