This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix #pragma weak/intermodule interaction
- From: Geoffrey Keating <gkeating at apple dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 21 Jul 2003 19:23:09 -0700 (PDT)
- Subject: Fix #pragma weak/intermodule interaction
This:
- Adds some checks to ensure that DECL_ASSEMBLER_NAME isn't set before
TREE_PUBLIC/TREE_STATIC.
- Fixes the problems this reveals with the timing of
maybe_apply_pragma_weak.
Bootstrapped & tested on powerpc-darwin.
--
- Geoffrey Keating <geoffk@apple.com>
===File ~/patches/gcc-imipragmaweak.patch===================
2003-07-22 Geoffrey Keating <geoffk@apple.com>
* c-decl.c (start_decl): Don't call maybe_apply_pragma_weak here.
(finish_decl): Call maybe_apply_pragma_weak here.
(grokdeclarator): Check that DECL_ASSEMBLER_NAME isn't set before
TREE_PUBLIC and TREE_STATIC are decided.
(start_function): Move call to maybe_apply_pragma_weak. Check that
DECL_ASSEMBLER_NAME isn't set too early.
Index: c-decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-decl.c,v
retrieving revision 1.412
diff -u -p -u -p -r1.412 c-decl.c
--- c-decl.c 21 Jul 2003 21:25:46 -0000 1.412
+++ c-decl.c 22 Jul 2003 02:21:40 -0000
@@ -2706,10 +2706,6 @@ start_decl (tree declarator, tree declsp
/* Set attributes here so if duplicate decl, will have proper attributes. */
decl_attributes (&decl, attributes, 0);
- /* If #pragma weak was used, mark the decl weak now. */
- if (current_binding_level == global_binding_level)
- maybe_apply_pragma_weak (decl);
-
if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl)
&& DECL_UNINLINABLE (decl)
@@ -2890,6 +2886,10 @@ finish_decl (tree decl, tree init, tree
SET_DECL_ASSEMBLER_NAME (decl, get_identifier (starred));
}
+ /* If #pragma weak was used, mark the decl weak now. */
+ if (current_binding_level == global_binding_level)
+ maybe_apply_pragma_weak (decl);
+
/* Output the assembler code and/or RTL code for variables and functions,
unless the type is an undefined structure or union.
If not, it will get done when the type is completed. */
@@ -4466,6 +4466,13 @@ grokdeclarator (tree declarator, tree de
if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl)))
c_mark_addressable (decl);
+#ifdef ENABLE_CHECKING
+ /* This is the earliest point at which we might know the assembler
+ name of a variable. Thus, if it's known before this, die horribly. */
+ if (DECL_ASSEMBLER_NAME_SET_P (decl))
+ abort ();
+#endif
+
decl_attributes (&decl, returned_attrs, 0);
return decl;
@@ -5540,10 +5547,6 @@ start_function (tree declspecs, tree dec
decl_attributes (&decl1, attributes, 0);
- /* If #pragma weak was used, mark the decl weak now. */
- if (current_binding_level == global_binding_level)
- maybe_apply_pragma_weak (decl1);
-
if (DECL_DECLARED_INLINE_P (decl1)
&& DECL_UNINLINABLE (decl1)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1)))
@@ -5634,6 +5637,17 @@ start_function (tree declspecs, tree dec
/* A nested function is not global. */
if (current_function_decl != 0)
TREE_PUBLIC (decl1) = 0;
+
+#ifdef ENABLE_CHECKING
+ /* This is the earliest point at which we might know the assembler
+ name of the function. Thus, if it's set before this, die horribly. */
+ if (DECL_ASSEMBLER_NAME_SET_P (decl1))
+ abort ();
+#endif
+
+ /* If #pragma weak was used, mark the decl weak now. */
+ if (current_binding_level == global_binding_level)
+ maybe_apply_pragma_weak (decl1);
/* Warn for unlikely, improbable, or stupid declarations of `main'. */
if (warn_main > 0 && MAIN_NAME_P (DECL_NAME (decl1)))
============================================================