c-pragma.c (push_alignment): Don't ignore alignments greater than 4 bytes.
authorMumit Khan <khan@xraylith.wisc.edu>
Mon, 21 Jun 1999 05:11:15 +0000 (05:11 +0000)
committerJeff Law <law@gcc.gnu.org>
Mon, 21 Jun 1999 05:11:15 +0000 (23:11 -0600)
        * c-pragma.c (push_alignment): Don't ignore alignments greater than
        4 bytes.
        (insert_pack_attributes): Take into account member natural
        alignment.

From-SVN: r27648

gcc/ChangeLog
gcc/c-pragma.c

index e0f21f7a0e28a38c766c40adb3c86bf55b4f6863..19869b0b94d5da21507d1605032ea125705ef7dd 100644 (file)
@@ -1,5 +1,10 @@
 Mon Jun 21 05:33:15 1999  Mumit Khan  <khan@xraylith.wisc.edu>
 
+       * c-pragma.c (push_alignment): Don't ignore alignments greater than
+       4 bytes.
+       (insert_pack_attributes): Take into account member natural 
+       alignment.
+
        * i386/winnt.c (exports_head): New static variable.
        (i386_pe_record_exported_symbol): New function.
        (i386_pe_asm_file_end): Use.
index de9cfb899e5590036c792ffdf2833c38083e1efd..5aa8d9f2870fc5d08e8f6b1c961a5f178d8049be 100644 (file)
@@ -141,7 +141,7 @@ pop_alignment (id)
     {
       entry = alignment_stack->prev;
 
-      if (entry == NULL || entry->alignment > 4)
+      if (entry == NULL)
        maximum_field_alignment = 0;
       else
        maximum_field_alignment = entry->alignment * 8;
@@ -163,6 +163,7 @@ insert_pack_attributes (node, attributes, prefix)
      tree * prefix;
 {
   tree a;
+  int field_alignment;
 
   /* If we are not packing, then there is nothing to do.  */
   if (maximum_field_alignment == 0
@@ -173,12 +174,16 @@ insert_pack_attributes (node, attributes, prefix)
   if (TREE_CODE_CLASS (TREE_CODE (node)) != 'd'
       || TREE_CODE (node) != FIELD_DECL)
     return;
+  
+  field_alignment = TYPE_ALIGN (TREE_TYPE (node));
+  if (field_alignment <= 0 || field_alignment > maximum_field_alignment)
+    field_alignment = maximum_field_alignment;
 
   /* Add a 'packed' attribute.  */
   * attributes = tree_cons (get_identifier ("packed"), NULL, * attributes);
   
   /* If the alignment is > 8 then add an alignment attribute as well.  */
-  if (maximum_field_alignment > 8)
+  if (field_alignment > 8)
     {
       /* If the aligned attribute is already present then do not override it.  */
       for (a = * attributes; a; a = TREE_CHAIN (a))
@@ -201,7 +206,7 @@ insert_pack_attributes (node, attributes, prefix)
          * attributes = tree_cons
              (get_identifier ("aligned"),
               tree_cons (NULL,
-                         build_int_2 (maximum_field_alignment / 8, 0),
+                         build_int_2 (field_alignment / 8, 0),
                          NULL),
               * attributes);
        }