OSDN Git Service

* config/m68k/m68k.h (REGISTER_NAMES): Prefix each name with
[pf3gnuchains/gcc-fork.git] / gcc / c-pragma.c
index 78e9d9d..c9e1505 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, 2003
+   Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -49,7 +49,7 @@ typedef struct align_stack GTY(())
 static GTY(()) struct align_stack * alignment_stack;
 
 #ifdef HANDLE_PRAGMA_PACK
-static void handle_pragma_pack PARAMS ((cpp_reader *));
+static void handle_pragma_pack (cpp_reader *);
 
 #ifdef HANDLE_PRAGMA_PACK_PUSH_POP
 /* If we have a "global" #pragma pack(<n>) in effect when the first
@@ -61,14 +61,12 @@ static int default_alignment;
 #define SET_GLOBAL_ALIGNMENT(ALIGN) \
   (default_alignment = maximum_field_alignment = (ALIGN))
 
-static void push_alignment PARAMS ((int, tree));
-static void pop_alignment  PARAMS ((tree));
+static void push_alignment (int, tree);
+static void pop_alignment (tree);
 
 /* Push an alignment value onto the stack.  */
 static void
-push_alignment (alignment, id)
-     int alignment;
-     tree id;
+push_alignment (int alignment, tree id)
 {
   if (alignment_stack == NULL
       || alignment_stack->alignment != alignment
@@ -76,7 +74,7 @@ push_alignment (alignment, id)
     {
       align_stack * entry;
 
-      entry = (align_stack *) ggc_alloc (sizeof (* entry));
+      entry = ggc_alloc (sizeof (* entry));
 
       entry->alignment  = alignment;
       entry->num_pushes = 1;
@@ -99,8 +97,7 @@ push_alignment (alignment, id)
 
 /* Undo a push of an alignment onto the stack.  */
 static void
-pop_alignment (id)
-     tree id;
+pop_alignment (tree id)
 {
   align_stack * entry;
       
@@ -157,8 +154,7 @@ pop_alignment (id)
    #pragma pack (pop)
    #pragma pack (pop, ID) */
 static void
-handle_pragma_pack (dummy)
-     cpp_reader *dummy ATTRIBUTE_UNUSED;
+handle_pragma_pack (cpp_reader *dummy ATTRIBUTE_UNUSED)
 {
   tree x, id = 0;
   int align = -1;
@@ -261,12 +257,11 @@ handle_pragma_pack (dummy)
 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 void apply_pragma_weak (tree, tree);
+static void handle_pragma_weak (cpp_reader *);
 
 static void
-apply_pragma_weak (decl, value)
-     tree decl, value;
+apply_pragma_weak (tree decl, tree value)
 {
   if (value)
     {
@@ -278,27 +273,35 @@ apply_pragma_weak (decl, value)
     }
 
   if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl)
+      && !DECL_WEAK (decl) /* Don't complain about a redundant #pragma.  */
       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
-    warning_with_decl (decl, "applying #pragma weak `%s' after first use results in unspecified behavior");
+    warning ("%Japplying #pragma weak '%D' after first use results "
+             "in unspecified behavior", decl, decl);
 
   declare_weak (decl);
 }
 
 void
-maybe_apply_pragma_weak (decl)
-     tree decl;
+maybe_apply_pragma_weak (tree decl)
 {
   tree *p, t, id;
 
-  /* Copied from the check in set_decl_assembler_name.  */
-  if (TREE_CODE (decl) == FUNCTION_DECL
-      || (TREE_CODE (decl) == VAR_DECL 
-          && (TREE_STATIC (decl) 
-              || DECL_EXTERNAL (decl) 
-              || TREE_PUBLIC (decl))))
-    id = DECL_ASSEMBLER_NAME (decl);
-  else
+  /* Avoid asking for DECL_ASSEMBLER_NAME when it's not needed.  */
+
+  /* No weak symbols pending, take the short-cut.  */
+  if (!pending_weaks)
+    return;
+  /* If it's not visible outside this file, it doesn't matter whether
+     it's weak.  */
+  if (!DECL_EXTERNAL (decl) && !TREE_PUBLIC (decl))
     return;
+  /* If it's not a function or a variable, it can't be weak.
+     FIXME: what kinds of things are visible outside this file but
+     aren't functions or variables?   Should this be an abort() instead?  */
+  if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL)
+    return;
+
+  id = DECL_ASSEMBLER_NAME (decl);
 
   for (p = &pending_weaks; (t = *p) ; p = &TREE_CHAIN (t))
     if (id == TREE_PURPOSE (t))
@@ -311,8 +314,7 @@ maybe_apply_pragma_weak (decl)
 
 /* #pragma weak name [= value] */
 static void
-handle_pragma_weak (dummy)
-     cpp_reader *dummy ATTRIBUTE_UNUSED;
+handle_pragma_weak (cpp_reader *dummy ATTRIBUTE_UNUSED)
 {
   tree name, value, x, decl;
   enum cpp_ttype t;
@@ -343,8 +345,7 @@ handle_pragma_weak (dummy)
 }
 #else
 void
-maybe_apply_pragma_weak (decl)
-     tree decl ATTRIBUTE_UNUSED;
+maybe_apply_pragma_weak (tree decl ATTRIBUTE_UNUSED)
 {
 }
 #endif /* HANDLE_PRAGMA_WEAK */
@@ -352,12 +353,11 @@ maybe_apply_pragma_weak (decl)
 static GTY(()) tree pending_redefine_extname;
 
 #ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
-static void handle_pragma_redefine_extname PARAMS ((cpp_reader *));
+static void handle_pragma_redefine_extname (cpp_reader *);
 
 /* #pragma redefined_extname oldname newname */
 static void
-handle_pragma_redefine_extname (dummy)
-     cpp_reader *dummy ATTRIBUTE_UNUSED;
+handle_pragma_redefine_extname (cpp_reader *dummy ATTRIBUTE_UNUSED)
 {
   tree oldname, newname, decl, x;
   enum cpp_ttype t;
@@ -382,7 +382,7 @@ handle_pragma_redefine_extname (dummy)
       if (DECL_ASSEMBLER_NAME_SET_P (decl)
          && DECL_ASSEMBLER_NAME (decl) != newname)
         warning ("#pragma redefine_extname conflicts with declaration");
-      SET_DECL_ASSEMBLER_NAME (decl, newname);
+      change_decl_assembler_name (decl, newname);
     }
   else
     add_to_renaming_pragma_list(oldname, newname);
@@ -390,8 +390,7 @@ handle_pragma_redefine_extname (dummy)
 #endif
 
 void
-add_to_renaming_pragma_list (oldname, newname)
-       tree oldname, newname;
+add_to_renaming_pragma_list (tree oldname, tree newname)
 {
   pending_redefine_extname
     = tree_cons (oldname, newname, pending_redefine_extname);
@@ -400,12 +399,11 @@ add_to_renaming_pragma_list (oldname, newname)
 static GTY(()) tree pragma_extern_prefix;
 
 #ifdef HANDLE_PRAGMA_EXTERN_PREFIX
-static void handle_pragma_extern_prefix PARAMS ((cpp_reader *));
+static void handle_pragma_extern_prefix (cpp_reader *);
 
 /* #pragma extern_prefix "prefix" */
 static void
-handle_pragma_extern_prefix (dummy)
-     cpp_reader *dummy ATTRIBUTE_UNUSED;
+handle_pragma_extern_prefix (cpp_reader *dummy ATTRIBUTE_UNUSED)
 {
   tree prefix, x;
   enum cpp_ttype t;
@@ -428,8 +426,7 @@ handle_pragma_extern_prefix (dummy)
    pragmas that rename variables.  */
 
 tree
-maybe_apply_renaming_pragma (decl, asmname)
-     tree decl, asmname;
+maybe_apply_renaming_pragma (tree decl, tree asmname)
 {
   tree oldname;
 
@@ -449,7 +446,7 @@ maybe_apply_renaming_pragma (decl, asmname)
     {
       const char *oldasmname = IDENTIFIER_POINTER (oldname) + 1;
       if (asmname && strcmp (TREE_STRING_POINTER (asmname), oldasmname) != 0)
-       warning ("asm declaration conficts with previous rename");
+       warning ("asm declaration conflicts with previous rename");
       asmname = build_string (strlen (oldasmname), oldasmname);
     }
 
@@ -486,17 +483,15 @@ maybe_apply_renaming_pragma (decl, 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 *));
+c_register_pragma (const char *space, const char *name,
+                  void (*handler) (struct cpp_reader *))
 {
   cpp_register_pragma (parse_in, space, name, handler);
 }
 
 /* Set up front-end pragmas.  */
 void
-init_pragma ()
+init_pragma (void)
 {
 #ifdef HANDLE_PRAGMA_PACK
   c_register_pragma (0, "pack", handle_pragma_pack);