On Tue, Dec 11, 2012 at 11:04 PM, Kai Tietz <ktiet...@googlemail.com> wrote:
> 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?

Please add a testcase or two.

> 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));

That looks wrong.  Having both TYPE_PACKED and TYPE_ALIGN != BITS_PER_UNIT
is inconsistent, so this part of the patch should not be necessary.

>    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;

See above - this looks redundant.

>        /* 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);

Reply via email to