OSDN Git Service

Applied Mumit Khan's patch to fix #pragma push/pop handling.
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Oct 1999 10:44:30 +0000 (10:44 +0000)
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Oct 1999 10:44:30 +0000 (10:44 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30084 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-pragma.c
gcc/c-pragma.h

index f32d9cf..7be360d 100644 (file)
@@ -1,3 +1,15 @@
+Tue Oct 19 11:41:12 1999  Mumit Khan  <khan@xraylith.wisc.edu>
+
+       * c-pragma.h (PRAGMA_INSERT_ATTRIBUTES): Delete macro.
+       (insert_pack_attributes): Delete prototype.
+
+       * c-pragma.c (default_alignment): New static variable.
+       (push_alignment): Initialize to current effective alignment.
+       (pop_alignment): Use to set new alignment.
+       (insert_pack_attributes): Delete function.
+       (handle_pragma_token): Set default_alignment as well each time 
+       a #pragma pack(<n>) is encountered.
+
 Tue Oct 19 02:03:00 1999  Jeffrey A Law  (law@cygnus.com)
 
        * reg-stack.c (stack_result): Aggregates are not returned in
index 7cb7421..36aa2c4 100644 (file)
@@ -51,6 +51,13 @@ typedef struct align_stack
 
 static struct align_stack * alignment_stack = NULL;
 
+/* If we have a "global" #pragma pack(<n>) if effect when the first
+   #pragma push(pack,<n>) is encountered, this stores the the value of 
+   maximum_field_alignment in effect.  When the final pop_alignment() 
+   happens, we restore the value to this, not to a value of 0 for
+   maximum_field_alignment.  Value is in bits. */
+static int  default_alignment;
+
 static int  push_alignment PROTO((int, tree));
 static int  pop_alignment  PROTO((tree));
 
@@ -95,6 +102,12 @@ Alignment must be a small power of two, not %d, in #pragma pack",
       entry->id         = id;
       entry->prev       = alignment_stack;
       
+      /* The current value of maximum_field_alignment is not necessarily 
+        0 since there may be a #pragma pack(<n>) in effect; remember it 
+        so that we can restore it after the final #pragma pop(). */
+      if (alignment_stack == NULL)
+       default_alignment = maximum_field_alignment;
+      
       alignment_stack = entry;
 
       maximum_field_alignment = alignment * 8;
@@ -142,7 +155,7 @@ pop_alignment (id)
       entry = alignment_stack->prev;
 
       if (entry == NULL)
-       maximum_field_alignment = 0;
+       maximum_field_alignment = default_alignment;
       else
        maximum_field_alignment = entry->alignment * 8;
 
@@ -153,67 +166,6 @@ pop_alignment (id)
 
   return 1;
 }
-
-/* Generate 'packed' and 'aligned' attributes for decls whilst a
-   #pragma pack(push... is in effect.  */
-void
-insert_pack_attributes (node, attributes, prefix)
-     tree node;
-     tree * attributes;
-     tree * prefix;
-{
-  tree a;
-  int field_alignment;
-
-  /* If we are not packing, then there is nothing to do.  */
-  if (maximum_field_alignment == 0
-      || alignment_stack == NULL)
-    return;
-
-  /* We are only interested in fields.  */
-  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 (field_alignment > 8)
-    {
-      /* If the aligned attribute is already present then do not override it.  */
-      for (a = * attributes; a; a = TREE_CHAIN (a))
-       {
-         tree name = TREE_PURPOSE (a);
-         if (strcmp (IDENTIFIER_POINTER (name), "aligned") == 0)
-           break;
-       }
-      
-      if (a == NULL)
-       for (a = * prefix; a; a = TREE_CHAIN (a))
-         {
-           tree name = TREE_PURPOSE (a);
-           if (strcmp (IDENTIFIER_POINTER (name), "aligned") == 0)
-             break;
-         }
-  
-      if (a == NULL)
-       {
-         * attributes = tree_cons
-             (get_identifier ("aligned"),
-              tree_cons (NULL,
-                         build_int_2 (field_alignment / 8, 0),
-                         NULL),
-              * attributes);
-       }
-    }
-
-  return;
-}
 #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
 \f
 /* Handle one token of a pragma directive.  TOKEN is the current token, and
@@ -267,6 +219,9 @@ handle_pragma_token (string, token)
          if (state == ps_right)
            {
              maximum_field_alignment = align * 8;
+#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
+             default_alignment = maximum_field_alignment;
+#endif
              ret_val = 1;
            }
          else
index 0fbf77c..7a0848c 100644 (file)
@@ -39,9 +39,6 @@ Boston, MA 02111-1307, USA.  */
 /* If we are supporting #pragma pack(push... then we automatically
    support #pragma pack(<n>)  */
 #define HANDLE_PRAGMA_PACK 1
-#define PRAGMA_INSERT_ATTRIBUTES(node, pattr, prefix_attr) \
-  insert_pack_attributes (node, pattr, prefix_attr)
-extern void insert_pack_attributes PROTO((tree, tree *, tree *));
 #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */