This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: #pragma weak is broken in 3.1, partail fix
- From: Marc Espie <espie at nerim dot net>
- To: Richard Henderson <rth at redhat dot com>, gcc at gcc dot gnu dot org,gcc-patches at gcc dot gnu dot org
- Date: Sat, 25 May 2002 10:55:38 +0200
- Subject: Re: #pragma weak is broken in 3.1, partail fix
- References: <20020521165708.A6328@tetto.liafa.jussieu.fr> <20020521113149.C24775@redhat.com>
- Reply-to: espie at nerim dot net
On Tue, May 21, 2002 at 11:31:49AM -0700, Richard Henderson wrote:
> On Tue, May 21, 2002 at 04:57:08PM +0200, Marc Espie wrote:
> > Both the following snippets show the same problem:
> > void f();
> > #pragma weak f=_f
> This one should work,
> > void f() __attribute__ ((weak, alias("_f")));
> > #pragma weak f=_f
> This one defines the weak alias twice, and is in error.
> A declaration with an alias attribute is a definition,
> not a declaration.
Here is a better patch, that fixes things on gcc 3.1.
Basically, there are two problems.
* one is structural: I don't understand how new code to handle #pragma
weak could have been written and never even TESTED on any testcase before
being committed.
* the code that handles attribute lists is exceptionally brittle. It
shouldn't matter in which order alias/weak attributes are declared. Well,
right now it does.
So, I'd like the following patch in both HEAD and 3.1 branch. And I think
that mid-term, fixing the handling of __attribute__((alias("string"), weak)
so that it *works* should be done.
2002-05-25 Marc Espie <espie@openbsd.org>
c-pragma.c (apply_pragma_weak): Rearrange attribute building to work.
*** c-pragma.c.orig Tue May 21 08:28:15 2002
--- c-pragma.c Sat May 25 10:48:45 2002
*************** static void
*** 283,297 ****
apply_pragma_weak (decl, value)
tree decl, value;
{
if (value)
! decl_attributes (&decl, build_tree_list (get_identifier ("alias"),
! build_tree_list (NULL, value)),
0);
if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl)
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
warning_with_decl (decl, "applying #pragma weak `%s' after first use results in unspecified behavior");
-
- declare_weak (decl);
}
void
--- 283,299 ----
apply_pragma_weak (decl, value)
tree decl, value;
{
+ declare_weak (decl);
if (value)
! decl_attributes (&decl,
! build_tree_list (get_identifier ("alias"),
! build_tree_list (NULL,
! build_string (IDENTIFIER_LENGTH (value),
! IDENTIFIER_POINTER (value)))),
0);
if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl)
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
warning_with_decl (decl, "applying #pragma weak `%s' after first use results in unspecified behavior");
}
void