Commit 40aae178 by Jason Merrill Committed by Jason Merrill

stor-layout.c (layout_decl): Do packed field alignment for bit-fields, too.

        * stor-layout.c (layout_decl): Do packed field alignment for
        bit-fields, too.

From-SVN: r72786
parent 18fd68a8
2003-10-21 Jason Merrill <jason@redhat.com>
* stor-layout.c (layout_decl): Do packed field alignment for
bit-fields, too.
2003-10-21 Eric Christopher <echristo@redhat.com> 2003-10-21 Eric Christopher <echristo@redhat.com>
* expr.c (convert_move): Use FLOAT_EXTEND for extensions. * expr.c (convert_move): Use FLOAT_EXTEND for extensions.
......
...@@ -397,6 +397,8 @@ layout_decl (tree decl, unsigned int known_align) ...@@ -397,6 +397,8 @@ layout_decl (tree decl, unsigned int known_align)
else else
/* For fields, it's a bit more complicated... */ /* For fields, it's a bit more complicated... */
{ {
bool old_user_align = DECL_USER_ALIGN (decl);
if (DECL_BIT_FIELD (decl)) if (DECL_BIT_FIELD (decl))
{ {
DECL_BIT_FIELD_TYPE (decl) = type; DECL_BIT_FIELD_TYPE (decl) = type;
...@@ -454,22 +456,21 @@ layout_decl (tree decl, unsigned int known_align) ...@@ -454,22 +456,21 @@ layout_decl (tree decl, unsigned int known_align)
supercede USER_ALIGN inherited from the type, but defer to supercede USER_ALIGN inherited from the type, but defer to
alignment explicitly specified on the field decl. */; alignment explicitly specified on the field decl. */;
else else
{ do_type_align (type, decl);
do_type_align (type, decl);
/* If the field is of variable size, we can't misalign it since we
/* 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
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
isn't an issue if the decl is not addressable. Likewise if it is of unknown size.
is of unknown size.
Note that do_type_align may set DECL_USER_ALIGN, so we need to
Note that do_type_align may set DECL_USER_ALIGN, so we don't check old_user_align instead. */
want to check it again here. */ if (DECL_PACKED (decl)
if (DECL_PACKED (decl) && !old_user_align
&& (DECL_NONADDRESSABLE_P (decl) && (DECL_NONADDRESSABLE_P (decl)
|| DECL_SIZE_UNIT (decl) == 0 || DECL_SIZE_UNIT (decl) == 0
|| TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST)) || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT); DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
}
/* Should this be controlled by DECL_USER_ALIGN, too? */ /* Should this be controlled by DECL_USER_ALIGN, too? */
if (maximum_field_alignment != 0) if (maximum_field_alignment != 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment