[multiple changes]
authorJoseph Myers <jsm28@gcc.gnu.org>
Mon, 29 Nov 2004 18:54:06 +0000 (18:54 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Mon, 29 Nov 2004 18:54:06 +0000 (18:54 +0000)
2004-11-29  Daniel Jacobowitz  <dan@codesourcery.com>

PR c/7544
* Makefile.in (c-lang.o): Update dependencies.
* c-lang.c: Include "c-pragma.h".
(finish_file): Call maybe_apply_pending_pragma_weaks.
* c-pragma.c (maybe_apply_pending_pragma_weaks): New function.
* c-pragma.h (maybe_apply_pending_pragma_weaks): New prototype.

cp:
2004-11-29  Daniel Jacobowitz  <dan@codesourcery.com>

* Make-lang.in (cp/decl2.o): Update dependencies.
* decl2.c (finish_file): Call maybe_apply_pending_pragma_weaks.

objc:
2004-11-29  Joseph Myers  <joseph@codesourcery.com>

* Make-lang.in (objc/objc-act.o): Update dependencies.
* objc-act.c (objc_finish_file): Call
maybe_apply_pending_pragma_weaks if not OBJCPLUS.

testsuite:
2004-11-29  Joseph Myers  <joseph@codesourcery.com>

* g++.dg/ext/weak1.C, gcc.dg/weak/weak-10.c, objc.dg/weak-1.m: New
tests.

From-SVN: r91479

15 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/c-lang.c
gcc/c-pragma.c
gcc/c-pragma.h
gcc/cp/ChangeLog
gcc/cp/Make-lang.in
gcc/cp/decl2.c
gcc/objc/ChangeLog
gcc/objc/Make-lang.in
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/weak1.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/weak/weak-10.c [new file with mode: 0644]
gcc/testsuite/objc.dg/weak-1.m [new file with mode: 0644]

index ed8056abb4d071541b3d4b3c180c7bb01e83aa6f..8a2c5f84f529b257920ffd0f36241059c38a3d44 100644 (file)
@@ -1,3 +1,12 @@
+2004-11-29  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       PR c/7544
+       * Makefile.in (c-lang.o): Update dependencies.
+       * c-lang.c: Include "c-pragma.h".
+       (finish_file): Call maybe_apply_pending_pragma_weaks.
+       * c-pragma.c (maybe_apply_pending_pragma_weaks): New function.
+       * c-pragma.h (maybe_apply_pending_pragma_weaks): New prototype.
+
 2004-11-29  Richard Henderson  <rth@redhat.com>
 
        PR target/17224
index 74d362ccc81ff0d3c207a40c09721879d14144d7..09195be8167321f470d321c2c6a7cb7bcd0c82c7 100644 (file)
@@ -1380,7 +1380,7 @@ c-typeck.o : c-typeck.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(
 c-lang.o : c-lang.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
     $(C_TREE_H) $(C_PRETTY_PRINT_H) $(DIAGNOSTIC_H) \
     $(GGC_H) langhooks.h $(LANGHOOKS_DEF_H) $(C_COMMON_H) gtype-c.h \
-    c-objc-common.h
+    c-objc-common.h c-pragma.h
 stub-objc.o : stub-objc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
     $(GGC_H) $(C_COMMON_H)
 c-lex.o : c-lex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
index 8eb090c4d62ddc86e2f47845623320d6eba7527f..15524480c471b566e18b90a696c8638842d4b043 100644 (file)
@@ -34,6 +34,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "diagnostic.h"
 #include "c-pretty-print.h"
 #include "c-objc-common.h"
+#include "c-pragma.h"
 
 enum c_language_kind c_language = clk_c;
 
@@ -88,6 +89,7 @@ const char *const tree_code_name[] = {
 void
 finish_file (void)
 {
+  maybe_apply_pending_pragma_weaks ();
 }
 
 #include "gtype-c.h"
index 91efc4aa384c70d7fc0f2f722018d87cca4370d8..cc1dd280359a59c7e3855c5b3857429426bf4c3b 100644 (file)
@@ -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))
@@ -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
index 669d122e695e4cec906906cbb5dcef2537d73496..f7f609c407fbb206ecb7ead5f7b7d7843452c2d5 100644 (file)
@@ -60,6 +60,7 @@ extern void c_register_pragma (const char *, const char *,
 extern void c_register_pragma_with_expansion (const char *, const char *,
                                              void (*) (struct cpp_reader *));
 extern void maybe_apply_pragma_weak (tree);
+extern void maybe_apply_pending_pragma_weaks (void);
 extern tree maybe_apply_renaming_pragma (tree, tree);
 extern void add_to_renaming_pragma_list (tree, tree);
 
index e2f7dc49aa32d0ca77874f36a28e21092f4b4391..1a1dcbeb87b993fa33ad7298fcf6221cfac2d27f 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-29  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       PR c/7544
+       * Make-lang.in (cp/decl2.o): Update dependencies.
+       * decl2.c (finish_file): Call maybe_apply_pending_pragma_weaks.
+
 2004-11-29  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/18652
index 245f4063962e645f9d245a0354564d3ced746b83..8757116648f7feabc6bf38997a0225668dc66ccb 100644 (file)
@@ -232,7 +232,8 @@ cp/decl.o: cp/decl.c $(CXX_TREE_H) $(TM_H) flags.h cp/decl.h \
   cp/operators.def $(TM_P_H) tree-inline.h diagnostic.h c-pragma.h \
   debug.h gt-cp-decl.h timevar.h $(TREE_FLOW_H)
 cp/decl2.o: cp/decl2.c $(CXX_TREE_H) $(TM_H) flags.h cp/decl.h $(EXPR_H) \
-  output.h except.h toplev.h $(RTL_H) c-common.h gt-cp-decl2.h cgraph.h
+  output.h except.h toplev.h $(RTL_H) c-common.h gt-cp-decl2.h cgraph.h \
+  c-pragma.h
 cp/cp-objcp-common.o : cp/cp-objcp-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
   $(TM_H) $(TREE_H) $(CXX_TREE_H) c-common.h toplev.h langhooks.h \
   $(LANGHOOKS_DEF_H) $(DIAGNOSTIC_H) debug.h $(CXX_PRETTY_PRINT_H) \
index 3b97367e761b75167af39d765ab98e8302e66713..88fba4f55e8b44e30f9c6888390cb9c1ff341bb1 100644 (file)
@@ -48,6 +48,7 @@ Boston, MA 02111-1307, USA.  */
 #include "tree-mudflap.h"
 #include "cgraph.h"
 #include "tree-inline.h"
+#include "c-pragma.h"
 
 extern cpp_reader *parse_in;
 
@@ -3062,6 +3063,9 @@ cp_finish_file (void)
   if (priority_info_map)
     splay_tree_delete (priority_info_map);
 
+  /* Generate any missing aliases.  */
+  maybe_apply_pending_pragma_weaks ();
+
   /* We're done with static constructors, so we can go back to "C++"
      linkage now.  */
   pop_lang_context ();
index 6eaa96429da8f58e995a33686b998ba566900725..e745f41f9d7372433b970bead08a69f5c4073052 100644 (file)
@@ -1,3 +1,10 @@
+2004-11-29  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/7544
+       * Make-lang.in (objc/objc-act.o): Update dependencies.
+       * objc-act.c (objc_finish_file): Call
+       maybe_apply_pending_pragma_weaks if not OBJCPLUS.
+
 2004-11-09  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR objc/18406
index d0900243c26b8a4663efc34328e597d4e2b4bdd4..08909437aa6848ec4b147f633f486a7316cbd0a0 100644 (file)
@@ -73,7 +73,7 @@ objc/objc-act.o : objc/objc-act.c \
    $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_H) $(TM_P_H) \
    $(EXPR_H) $(TARGET_H) $(C_TREE_H) diagnostic.h toplev.h flags.h \
    objc/objc-act.h input.h function.h output.h debug.h langhooks.h \
-   $(LANGHOOKS_DEF_H) $(HASHTAB_H) gt-objc-objc-act.h
+   $(LANGHOOKS_DEF_H) $(HASHTAB_H) c-pragma.h gt-objc-objc-act.h
 
 objc.srcextra: objc/objc-parse.c objc/objc-parse.y
        -cp -p $^ $(srcdir)/objc
index 408f25709a41827fd8bd7d3918e0644cbe0255c8..2da313d2983777a894edaa913532669a872a0186 100644 (file)
@@ -55,6 +55,7 @@ Boston, MA 02111-1307, USA.  */
 #endif
 
 #include "c-common.h"
+#include "c-pragma.h"
 #include "flags.h"
 #include "langhooks.h"
 #include "objc-act.h"
@@ -602,6 +603,8 @@ objc_finish_file (void)
 
 #ifdef OBJCPLUS
   cp_finish_file ();
+#else
+  maybe_apply_pending_pragma_weaks ();
 #endif
 }
 \f
index 289d124d3de81f41e9fe74d4dc327cca6cb8f953..83f1554f40925bf537b24e6839787ac37bbee4c8 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-29  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/7544
+       * g++.dg/ext/weak1.C, gcc.dg/weak/weak-10.c, objc.dg/weak-1.m: New
+       tests.
+
 2004-11-29  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/18652
diff --git a/gcc/testsuite/g++.dg/ext/weak1.C b/gcc/testsuite/g++.dg/ext/weak1.C
new file mode 100644 (file)
index 0000000..b7a448f
--- /dev/null
@@ -0,0 +1,13 @@
+// Test for #pragma weak where the weak alias symbol isn't declared,
+// although the symbol it is an alias for is defined in the
+// translation unit.  Bug 7544.
+// Origin: Joseph Myers <joseph@codesourcery.com>
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-require-alias "" }
+// { dg-options "-fno-common" }
+
+// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } 
+
+#pragma weak bar1 = foo1
+extern "C" void foo1 (void) {}
diff --git a/gcc/testsuite/gcc.dg/weak/weak-10.c b/gcc/testsuite/gcc.dg/weak/weak-10.c
new file mode 100644 (file)
index 0000000..f39fbc4
--- /dev/null
@@ -0,0 +1,13 @@
+/* Test for #pragma weak where the weak alias symbol isn't declared,
+   although the symbol it is an alias for is defined in the
+   translation unit.  Bug 7544.  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-require-weak "" } */
+/* { dg-require-alias "" } */
+/* { dg-options "-fno-common" } */
+
+/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } */
+
+#pragma weak bar1 = foo1
+void foo1 (void) {}
diff --git a/gcc/testsuite/objc.dg/weak-1.m b/gcc/testsuite/objc.dg/weak-1.m
new file mode 100644 (file)
index 0000000..f39fbc4
--- /dev/null
@@ -0,0 +1,13 @@
+/* Test for #pragma weak where the weak alias symbol isn't declared,
+   although the symbol it is an alias for is defined in the
+   translation unit.  Bug 7544.  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-require-weak "" } */
+/* { dg-require-alias "" } */
+/* { dg-options "-fno-common" } */
+
+/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } */
+
+#pragma weak bar1 = foo1
+void foo1 (void) {}