[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 ed8056a..8a2c5f8 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 74d362c..09195be 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 8eb090c..1552448 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 91efc4a..cc1dd28 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 669d122..f7f609c 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 e2f7dc4..1a1dcbe 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 245f406..8757116 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 3b97367..88fba4f 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 6eaa964..e745f41 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 d090024..0890943 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 408f257..2da313d 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 289d124..83f1554 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) {}