This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH to layout_decl for 11446
- From: Jason Merrill <jason at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 21 Oct 2003 22:08:52 -0400
- Subject: Re: PATCH to layout_decl for 11446
- References: <wvln0bv385p.fsf@prospero.boston.redhat.com>
Apparently Ada has bit-fields that still need this handling, so I can't
just move it into one of the arms of the if.
Tested x86_64-pc-linux-gnu, applied to trunk.
2003-10-21 Jason Merrill <jason@redhat.com>
* stor-layout.c (layout_decl): Do packed field alignment for
bit-fields, too.
*** stor-layout.c.~1~ 2003-10-21 11:08:41.000000000 -0400
--- stor-layout.c 2003-10-21 19:42:03.000000000 -0400
*************** layout_decl (tree decl, unsigned int kno
*** 397,402 ****
--- 397,404 ----
else
/* For fields, it's a bit more complicated... */
{
+ bool old_user_align = DECL_USER_ALIGN (decl);
+
if (DECL_BIT_FIELD (decl))
{
DECL_BIT_FIELD_TYPE (decl) = type;
*************** layout_decl (tree decl, unsigned int kno
*** 454,475 ****
supercede USER_ALIGN inherited from the type, but defer to
alignment explicitly specified on the field decl. */;
else
! {
! do_type_align (type, decl);
! /* If the field is of variable size, we can't misalign it since we
! have no way to make a temporary to align the result. But this
! isn't an issue if the decl is not addressable. Likewise if it
! is of unknown size.
!
! Note that do_type_align may set DECL_USER_ALIGN, so we don't
! want to check it again here. */
! if (DECL_PACKED (decl)
! && (DECL_NONADDRESSABLE_P (decl)
! || DECL_SIZE_UNIT (decl) == 0
! || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
! DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
! }
/* Should this be controlled by DECL_USER_ALIGN, too? */
if (maximum_field_alignment != 0)
--- 456,476 ----
supercede USER_ALIGN inherited from the type, but defer to
alignment explicitly specified on the field decl. */;
else
! do_type_align (type, decl);
! /* If the field is of variable size, we can't misalign it since we
! have no way to make a temporary to align the result. But this
! isn't an issue if the decl is not addressable. Likewise if it
! is of unknown size.
!
! Note that do_type_align may set DECL_USER_ALIGN, so we need to
! check old_user_align instead. */
! if (DECL_PACKED (decl)
! && !old_user_align
! && (DECL_NONADDRESSABLE_P (decl)
! || DECL_SIZE_UNIT (decl) == 0
! || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
! DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
/* Should this be controlled by DECL_USER_ALIGN, too? */
if (maximum_field_alignment != 0)