OSDN Git Service

(legitimate_address_p): Reject address whose index is itself the sum of two
[pf3gnuchains/gcc-fork.git] / gcc / c-pragma.c
index fe9f17a..cc1dd28 100644 (file)
@@ -95,7 +95,7 @@ pop_alignment (tree id)
   align_stack * entry;
       
   if (alignment_stack == NULL)
-    GCC_BAD("#pragma pack (pop) encountered without matching #pragma pack (push)");
+    GCC_BAD ("#pragma pack (pop) encountered without matching #pragma pack (push)");
 
   /* If we got an identifier, strip away everything above the target
      entry so that the next step will restore the state just below it.  */
@@ -122,9 +122,9 @@ pop_alignment (tree id)
 #else  /* not HANDLE_PRAGMA_PACK_PUSH_POP */
 #define SET_GLOBAL_ALIGNMENT(ALIGN) (maximum_field_alignment = (ALIGN))
 #define push_alignment(ID, N) \
-    GCC_BAD("#pragma pack(push[, id], <n>) is not supported on this target")
+    GCC_BAD ("#pragma pack(push[, id], <n>) is not supported on this target")
 #define pop_alignment(ID) \
-    GCC_BAD("#pragma pack(pop[, id], <n>) is not supported on this target")
+    GCC_BAD ("#pragma pack(pop[, id], <n>) is not supported on this target")
 #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
 
 /* #pragma pack ()
@@ -145,7 +145,7 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
   enum { set, push, pop } action;
 
   if (c_lex (&x) != CPP_OPEN_PAREN)
-    GCC_BAD ("missing '(' after '#pragma pack' - ignored");
+    GCC_BAD ("missing %<(%> after %<#pragma pack%> - ignored");
 
   token = c_lex (&x);
   if (token == CPP_CLOSE_PAREN)
@@ -158,14 +158,14 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
       align = TREE_INT_CST_LOW (x);
       action = set;
       if (c_lex (&x) != CPP_CLOSE_PAREN)
-       GCC_BAD ("malformed '#pragma pack' - ignored");
+       GCC_BAD ("malformed %<#pragma pack%> - ignored");
     }
   else if (token == CPP_NAME)
     {
 #define GCC_BAD_ACTION do { if (action != pop) \
-         GCC_BAD ("malformed '#pragma pack(push[, id][, <n>])' - ignored"); \
+         GCC_BAD ("malformed %<#pragma pack(push[, id][, <n>])%> - ignored"); \
        else \
-         GCC_BAD ("malformed '#pragma pack(pop[, id])' - ignored"); \
+         GCC_BAD ("malformed %<#pragma pack(pop[, id])%> - ignored"); \
        } while (0)
 
       const char *op = IDENTIFIER_POINTER (x);
@@ -174,7 +174,7 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
       else if (!strcmp (op, "pop"))
        action = pop;
       else
-       GCC_BAD2 ("unknown action '%s' for '#pragma pack' - ignored", op);
+       GCC_BAD2 ("unknown action %qs for %<#pragma pack%> - ignored", op);
 
       while ((token = c_lex (&x)) == CPP_COMMA)
        {
@@ -198,10 +198,10 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
 #undef GCC_BAD_ACTION
     }
   else
-    GCC_BAD ("malformed '#pragma pack' - ignored");
+    GCC_BAD ("malformed %<#pragma pack%> - ignored");
 
   if (c_lex (&x) != CPP_EOF)
-    warning ("junk at end of '#pragma pack'");
+    warning ("junk at end of %<#pragma pack%>");
 
   if (flag_pack_struct)
     GCC_BAD ("#pragma pack has no effect with -fpack-struct - ignored");
@@ -257,7 +257,7 @@ apply_pragma_weak (tree decl, tree 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 ("%Japplying #pragma weak '%D' after first use results "
+    warning ("%Japplying #pragma weak %qD after first use results "
              "in unspecified behavior", decl, decl);
 
   declare_weak (decl);
@@ -294,6 +294,33 @@ maybe_apply_pragma_weak (tree decl)
       }
 }
 
+/* Process all "#pragma weak A = B" directives where we have not seen
+   a decl for A.  */
+void
+maybe_apply_pending_pragma_weaks (void)
+{
+  tree *p, t, alias_id, id, decl, *next;
+
+  for (p = &pending_weaks; (t = *p) ; p = next)
+    {
+      next = &TREE_CHAIN (t);
+      alias_id = TREE_PURPOSE (t);
+      id = TREE_VALUE (t);
+
+      if (TREE_VALUE (t) == NULL)
+       continue;
+
+      decl = build_decl (FUNCTION_DECL, alias_id, default_function_type);
+
+      DECL_ARTIFICIAL (decl) = 1;
+      TREE_PUBLIC (decl) = 1;
+      DECL_EXTERNAL (decl) = 1;
+      DECL_WEAK (decl) = 1;
+
+      assemble_alias (decl, id);
+    }
+}
+
 /* #pragma weak name [= value] */
 static void
 handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy))
@@ -316,7 +343,7 @@ handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy))
     warning ("junk at end of #pragma weak");
 
   decl = identifier_global_value (name);
-  if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+  if (decl && DECL_P (decl))
     {
       apply_pragma_weak (decl, value);
       if (value)
@@ -330,6 +357,11 @@ void
 maybe_apply_pragma_weak (tree ARG_UNUSED (decl))
 {
 }
+
+void
+maybe_apply_pending_pragma_weaks (void)
+{
+}
 #endif /* HANDLE_PRAGMA_WEAK */
 
 /* GCC supports two #pragma directives for renaming the external
@@ -578,7 +610,7 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
         {
           if (!visidx)
             {
-              GCC_BAD ("No matching push for '#pragma GCC visibility pop'");
+              GCC_BAD ("No matching push for %<#pragma GCC visibility pop%>");
             }
           else
             {
@@ -589,7 +621,7 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
       else
         {
           if (c_lex (&x) != CPP_OPEN_PAREN)
-            GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored");
+            GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
           token = c_lex (&x);
           if (token != CPP_NAME)
             {
@@ -618,22 +650,29 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
               visibility_options.inpragma = 1;
             }
           if (c_lex (&x) != CPP_CLOSE_PAREN)
-            GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored");
+            GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
         }
     }
   if (c_lex (&x) != CPP_EOF)
-    warning ("junk at end of '#pragma GCC visibility'");
+    warning ("junk at end of %<#pragma GCC visibility%>");
 }
 
 #endif
 
-/* Front-end wrapper for pragma registration to avoid dragging
+/* Front-end wrappers for pragma registration to avoid dragging
    cpplib.h in almost everywhere.  */
 void
 c_register_pragma (const char *space, const char *name,
                   void (*handler) (struct cpp_reader *))
 {
-  cpp_register_pragma (parse_in, space, name, handler);
+  cpp_register_pragma (parse_in, space, name, handler, 0);
+}
+
+void
+c_register_pragma_with_expansion (const char *space, const char *name,
+                                 void (*handler) (struct cpp_reader *))
+{
+  cpp_register_pragma (parse_in, space, name, handler, 1);
 }
 
 /* Set up front-end pragmas.  */
@@ -641,8 +680,12 @@ void
 init_pragma (void)
 {
 #ifdef HANDLE_PRAGMA_PACK
+#ifdef HANDLE_PRAGMA_PACK_WITH_EXPANSION
+  c_register_pragma_with_expansion (0, "pack", handle_pragma_pack);
+#else
   c_register_pragma (0, "pack", handle_pragma_pack);
 #endif
+#endif
 #ifdef HANDLE_PRAGMA_WEAK
   c_register_pragma (0, "weak", handle_pragma_weak);
 #endif