OSDN Git Service

2007-02-15 Andrew Haley <aph@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / c-pragma.c
index 5256758..b2712ac 100644 (file)
@@ -46,8 +46,8 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 
 typedef struct align_stack GTY(())
 {
-  int                  alignment;
-  tree                 id;
+  int                 alignment;
+  tree                id;
   struct align_stack * prev;
 } align_stack;
 
@@ -58,8 +58,8 @@ 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
-   #pragma pack(push,<n>) is encountered, this stores the value of 
-   maximum_field_alignment in effect.  When the final pop_alignment() 
+   #pragma pack(push,<n>) is encountered, this stores 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;
@@ -79,15 +79,15 @@ push_alignment (int alignment, tree id)
   entry = GGC_NEW (align_stack);
 
   entry->alignment  = alignment;
-  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 
+  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;
@@ -98,7 +98,7 @@ static void
 pop_alignment (tree id)
 {
   align_stack * entry;
-      
+
   if (alignment_stack == NULL)
     GCC_BAD ("#pragma pack (pop) encountered without matching #pragma pack (push)");
 
@@ -134,7 +134,7 @@ pop_alignment (tree id)
 
 /* #pragma pack ()
    #pragma pack (N)
-   
+
    #pragma pack (push)
    #pragma pack (push, N)
    #pragma pack (push, ID)
@@ -160,6 +160,8 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
     }
   else if (token == CPP_NUMBER)
     {
+      if (TREE_CODE (x) != INTEGER_CST)
+       GCC_BAD ("invalid constant in %<#pragma pack%> - ignored");
       align = TREE_INT_CST_LOW (x);
       action = set;
       if (pragma_lex (&x) != CPP_CLOSE_PAREN)
@@ -190,6 +192,8 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
            }
          else if (token == CPP_NUMBER && action == push && align == -1)
            {
+             if (TREE_CODE (x) != INTEGER_CST)
+               GCC_BAD ("invalid constant in %<#pragma pack%> - ignored");
              align = TREE_INT_CST_LOW (x);
              if (align == -1)
                action = set;
@@ -236,7 +240,7 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
     {
     case set:   SET_GLOBAL_ALIGNMENT (align);  break;
     case push:  push_alignment (align, id);    break;
-    case pop:   pop_alignment (id);            break;
+    case pop:   pop_alignment (id);           break;
     }
 }
 #endif  /* HANDLE_PRAGMA_PACK */
@@ -263,7 +267,7 @@ apply_pragma_weak (tree decl, tree value)
       && !DECL_WEAK (decl) /* Don't complain about a redundant #pragma.  */
       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
     warning (OPT_Wpragmas, "applying #pragma weak %q+D after first use "
-             "results in unspecified behavior", decl);
+            "results in unspecified behavior", decl);
 
   declare_weak (decl);
 }
@@ -468,7 +472,7 @@ add_to_renaming_pragma_list (tree oldname, tree newname)
                 "conflict with previous #pragma redefine_extname");
       return;
     }
-  
+
   pending_redefine_extname
     = tree_cons (oldname, newname, pending_redefine_extname);
 }
@@ -545,7 +549,7 @@ maybe_apply_renaming_pragma (tree decl, tree asmname)
        *p = TREE_CHAIN (t);
 
        /* If we already have an asmname, #pragma redefine_extname is
-          ignored (with a warning if it conflicts).  */
+          ignored (with a warning if it conflicts).  */
        if (asmname)
          {
            if (strcmp (TREE_STRING_POINTER (asmname),
@@ -573,7 +577,7 @@ maybe_apply_renaming_pragma (tree decl, tree asmname)
 
       const char *id = IDENTIFIER_POINTER (DECL_NAME (decl));
       size_t ilen = IDENTIFIER_LENGTH (DECL_NAME (decl));
-       
+
       char *newname = (char *) alloca (plen + ilen + 1);
 
       memcpy (newname,        prefix, plen);
@@ -593,9 +597,42 @@ static void handle_pragma_visibility (cpp_reader *);
 typedef enum symbol_visibility visibility;
 DEF_VEC_I (visibility);
 DEF_VEC_ALLOC_I (visibility, heap);
+static VEC (visibility, heap) *visstack;
+
+/* Push the visibility indicated by STR onto the top of the #pragma
+   visibility stack.  */
+
+void
+push_visibility (const char *str)
+{
+  VEC_safe_push (visibility, heap, visstack,
+                default_visibility);
+  if (!strcmp (str, "default"))
+    default_visibility = VISIBILITY_DEFAULT;
+  else if (!strcmp (str, "internal"))
+    default_visibility = VISIBILITY_INTERNAL;
+  else if (!strcmp (str, "hidden"))
+    default_visibility = VISIBILITY_HIDDEN;
+  else if (!strcmp (str, "protected"))
+    default_visibility = VISIBILITY_PROTECTED;
+  else
+    GCC_BAD ("#pragma GCC visibility push() must specify default, internal, hidden or protected");
+  visibility_options.inpragma = 1;
+}
+
+/* Pop a level of the #pragma visibility stack.  */
+
+void
+pop_visibility (void)
+{
+  default_visibility = VEC_pop (visibility, visstack);
+  visibility_options.inpragma
+    = VEC_length (visibility, visstack) != 0;
+}
 
 /* Sets the default visibility for symbols to something other than that
    specified on the command line.  */
+
 static void
 handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
 {
@@ -603,65 +640,39 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
   tree x;
   enum cpp_ttype token;
   enum { bad, push, pop } action = bad;
-  static VEC (visibility, heap) *visstack;
+
   token = pragma_lex (&x);
   if (token == CPP_NAME)
     {
       const char *op = IDENTIFIER_POINTER (x);
       if (!strcmp (op, "push"))
-        action = push;
+       action = push;
       else if (!strcmp (op, "pop"))
-        action = pop;
+       action = pop;
     }
   if (bad == action)
     GCC_BAD ("#pragma GCC visibility must be followed by push or pop");
   else
     {
       if (pop == action)
-        {
-          if (!VEC_length (visibility, visstack))
-            {
-              GCC_BAD ("no matching push for %<#pragma GCC visibility pop%>");
-            }
-          else
-            {
-             default_visibility = VEC_pop (visibility, visstack);
-             visibility_options.inpragma
-               = VEC_length (visibility, visstack) != 0;
-            }
-        }
+       {
+         if (!VEC_length (visibility, visstack))
+           GCC_BAD ("no matching push for %<#pragma GCC visibility pop%>");
+         else
+           pop_visibility ();
+       }
       else
-        {
-          if (pragma_lex (&x) != CPP_OPEN_PAREN)
-            GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
-          token = pragma_lex (&x);
-          if (token != CPP_NAME)
-            {
-              GCC_BAD ("malformed #pragma GCC visibility push");
-            }
-          else
-            {
-              const char *str = IDENTIFIER_POINTER (x);
-             VEC_safe_push (visibility, heap, visstack,
-                            default_visibility);
-              if (!strcmp (str, "default"))
-                default_visibility = VISIBILITY_DEFAULT;
-              else if (!strcmp (str, "internal"))
-                default_visibility = VISIBILITY_INTERNAL;
-              else if (!strcmp (str, "hidden"))
-                default_visibility = VISIBILITY_HIDDEN;  
-              else if (!strcmp (str, "protected"))
-                default_visibility = VISIBILITY_PROTECTED;
-              else
-                {
-                  GCC_BAD ("#pragma GCC visibility push() must specify default, internal, hidden or protected");
-                }
-              visibility_options.inpragma = 1;
-            }
-          if (pragma_lex (&x) != CPP_CLOSE_PAREN)
-            GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
-        }
+       {
+         if (pragma_lex (&x) != CPP_OPEN_PAREN)
+           GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
+         token = pragma_lex (&x);
+         if (token != CPP_NAME)
+           GCC_BAD ("malformed #pragma GCC visibility push");
+         else
+           push_visibility (IDENTIFIER_POINTER (x));
+         if (pragma_lex (&x) != CPP_CLOSE_PAREN)
+           GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
+       }
     }
   if (pragma_lex (&x) != CPP_EOF)
     warning (OPT_Wpragmas, "junk at end of %<#pragma GCC visibility%>");
@@ -817,7 +828,7 @@ init_pragma (void)
 
   c_register_pragma ("GCC", "diagnostic", handle_pragma_diagnostic);
 
-  c_register_pragma (0, "redefine_extname", handle_pragma_redefine_extname);
+  c_register_pragma_with_expansion (0, "redefine_extname", handle_pragma_redefine_extname);
   c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix);
 
 #ifdef REGISTER_TARGET_PRAGMAS