OSDN Git Service

* stor-layout.c (layout_decl): Don't misalign field of variable size
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 29 Dec 2001 21:00:51 +0000 (21:00 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 29 Dec 2001 21:00:51 +0000 (21:00 +0000)
for packed record.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48384 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stor-layout.c

index e4f8b81..5ba989d 100644 (file)
@@ -1,5 +1,8 @@
 Sat Dec 29 15:48:54 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * stor-layout.c (layout_decl): Don't misalign field of variable size
+       for packed record.
+
        * dwarf2out.c (compute_section_prefix): Avoid cast warning.
        (gen_decl_die): Only check DECL_IGNORED_P on decls.
        (dwarf2out_decl): Check for DECL_IGNORED_P only when needed.
index f657463..fe9ed2c 100644 (file)
@@ -389,7 +389,15 @@ layout_decl (decl, known_align)
       DECL_BIT_FIELD_TYPE (decl) = DECL_BIT_FIELD (decl) ? type : 0;
       if (maximum_field_alignment != 0)
        DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
-      else if (DECL_PACKED (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.  */
+      else 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);
          DECL_USER_ALIGN (decl) = 0;