OSDN Git Service

* g++.old-deja/g++.benjamin/16077.C: Adjust warnings.
[pf3gnuchains/gcc-fork.git] / gcc / c-pragma.c
index 1a016b8..78e9d9d 100644 (file)
@@ -1,5 +1,5 @@
 /* Handle #pragma, system V.4 style.  Supports #pragma weak and #pragma pack.
-   Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002
+   Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -21,6 +21,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "rtl.h"
 #include "tree.h"
 #include "function.h"
@@ -36,11 +38,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #define GCC_BAD(msgid) do { warning (msgid); return; } while (0)
 #define GCC_BAD2(msgid, arg) do { warning (msgid, arg); return; } while (0)
 
-#ifdef HANDLE_PRAGMA_PACK
-static void handle_pragma_pack PARAMS ((cpp_reader *));
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
-typedef struct align_stack
+typedef struct align_stack GTY(())
 {
   int                  alignment;
   unsigned int         num_pushes;
@@ -48,8 +46,12 @@ typedef struct align_stack
   struct align_stack * prev;
 } align_stack;
 
-static struct align_stack * alignment_stack = NULL;
+static GTY(()) struct align_stack * alignment_stack;
 
+#ifdef HANDLE_PRAGMA_PACK
+static void handle_pragma_pack PARAMS ((cpp_reader *));
+
+#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
 /* If we have a "global" #pragma pack(<n>) in effect when the first
    #pragma pack(push,<n>) is encountered, this stores the value of 
    maximum_field_alignment in effect.  When the final pop_alignment() 
@@ -61,7 +63,6 @@ static int default_alignment;
 
 static void push_alignment PARAMS ((int, tree));
 static void pop_alignment  PARAMS ((tree));
-static void mark_align_stack PARAMS ((void *));
 
 /* Push an alignment value onto the stack.  */
 static void
@@ -75,7 +76,7 @@ push_alignment (alignment, id)
     {
       align_stack * entry;
 
-      entry = (align_stack *) xmalloc (sizeof (* entry));
+      entry = (align_stack *) ggc_alloc (sizeof (* entry));
 
       entry->alignment  = alignment;
       entry->num_pushes = 1;
@@ -137,24 +138,9 @@ pop_alignment (id)
       else
        maximum_field_alignment = entry->alignment;
 
-      free (alignment_stack);
-
       alignment_stack = entry;
     }
 }
-
-static void
-mark_align_stack (p)
-    void *p;
-{
-  align_stack *a = *(align_stack **) p;
-
-  while (a)
-    {
-      ggc_mark_tree (a->id);
-      a = a->prev;
-    }
-}
 #else  /* not HANDLE_PRAGMA_PACK_PUSH_POP */
 #define SET_GLOBAL_ALIGNMENT(ALIGN) (maximum_field_alignment = (ALIGN))
 #define push_alignment(ID, N) \
@@ -272,12 +258,12 @@ handle_pragma_pack (dummy)
 }
 #endif  /* HANDLE_PRAGMA_PACK */
 
+static GTY(()) tree pending_weaks;
+
 #ifdef HANDLE_PRAGMA_WEAK
 static void apply_pragma_weak PARAMS ((tree, tree));
 static void handle_pragma_weak PARAMS ((cpp_reader *));
 
-static tree pending_weaks;
-
 static void
 apply_pragma_weak (decl, value)
      tree decl, value;
@@ -363,11 +349,11 @@ maybe_apply_pragma_weak (decl)
 }
 #endif /* HANDLE_PRAGMA_WEAK */
 
+static GTY(()) tree pending_redefine_extname;
+
 #ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
 static void handle_pragma_redefine_extname PARAMS ((cpp_reader *));
 
-static tree pending_redefine_extname;
-
 /* #pragma redefined_extname oldname newname */
 static void
 handle_pragma_redefine_extname (dummy)
@@ -399,16 +385,23 @@ handle_pragma_redefine_extname (dummy)
       SET_DECL_ASSEMBLER_NAME (decl, newname);
     }
   else
-    pending_redefine_extname
-      = tree_cons (oldname, newname, pending_redefine_extname);
+    add_to_renaming_pragma_list(oldname, newname);
 }
 #endif
 
+void
+add_to_renaming_pragma_list (oldname, newname)
+       tree oldname, newname;
+{
+  pending_redefine_extname
+    = tree_cons (oldname, newname, pending_redefine_extname);
+}
+
+static GTY(()) tree pragma_extern_prefix;
+
 #ifdef HANDLE_PRAGMA_EXTERN_PREFIX
 static void handle_pragma_extern_prefix PARAMS ((cpp_reader *));
 
-static tree pragma_extern_prefix;
-
 /* #pragma extern_prefix "prefix" */
 static void
 handle_pragma_extern_prefix (dummy)
@@ -431,7 +424,7 @@ handle_pragma_extern_prefix (dummy)
 }
 #endif
 
-/* Hook from the front ends to apply the results of one of the preceeding
+/* Hook from the front ends to apply the results of one of the preceding
    pragmas that rename variables.  */
 
 tree
@@ -460,7 +453,6 @@ maybe_apply_renaming_pragma (decl, asmname)
       asmname = build_string (strlen (oldasmname), oldasmname);
     }
 
-#ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
   {
     tree *p, t;
 
@@ -476,7 +468,6 @@ maybe_apply_renaming_pragma (decl, asmname)
          return build_string (strlen (newname), newname);
        }
   }
-#endif
 
 #ifdef HANDLE_PRAGMA_EXTERN_PREFIX
   if (pragma_extern_prefix && !asmname)
@@ -492,33 +483,37 @@ maybe_apply_renaming_pragma (decl, asmname)
   return asmname;
 }
 
+/* Front-end wrapper for pragma registration to avoid dragging
+   cpplib.h in almost everywhere.  */
+void
+c_register_pragma (space, name, handler)
+     const char *space;
+     const char *name;
+     void (*handler) PARAMS ((struct cpp_reader *));
+{
+  cpp_register_pragma (parse_in, space, name, handler);
+}
+
+/* Set up front-end pragmas.  */
 void
 init_pragma ()
 {
 #ifdef HANDLE_PRAGMA_PACK
-  cpp_register_pragma (parse_in, 0, "pack", handle_pragma_pack);
+  c_register_pragma (0, "pack", handle_pragma_pack);
 #endif
 #ifdef HANDLE_PRAGMA_WEAK
-  cpp_register_pragma (parse_in, 0, "weak", handle_pragma_weak);
-  ggc_add_tree_root (&pending_weaks, 1);
+  c_register_pragma (0, "weak", handle_pragma_weak);
 #endif
 #ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
-  cpp_register_pragma (parse_in, 0, "redefine_extname",
-                      handle_pragma_redefine_extname);
-  ggc_add_tree_root (&pending_redefine_extname, 1);
+  c_register_pragma (0, "redefine_extname", handle_pragma_redefine_extname);
 #endif
 #ifdef HANDLE_PRAGMA_EXTERN_PREFIX
-  cpp_register_pragma (parse_in, 0, "extern_prefix",
-                      handle_pragma_extern_prefix);
-  ggc_add_tree_root (&pragma_extern_prefix, 1);
+  c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix);
 #endif
 
 #ifdef REGISTER_TARGET_PRAGMAS
-  REGISTER_TARGET_PRAGMAS (parse_in);
-#endif
-
-#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
-  ggc_add_root (&alignment_stack, 1, sizeof(alignment_stack),
-               mark_align_stack);
+  REGISTER_TARGET_PRAGMAS ();
 #endif
 }
+
+#include "gt-c-pragma.h"