http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991



Kai Tietz <ktietz at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

             Status|UNCONFIRMED                 |NEW

   Last reconfirmed|                            |2012-12-10

     Ever Confirmed|0                           |1



--- Comment #8 from Kai Tietz <ktietz at gcc dot gnu.org> 2012-12-10 15:13:37 
UTC ---

Yes, there is an issue about record/union attribute packed for ms_struct.



The following patch is fixing that for me, I just do regression-testing.



Index: stor-layout.c

===================================================================

--- stor-layout.c    (Revision 194356)

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

Reply via email to