[PATCH] Remove NEWDECL from WEAK_DECLS chain in merge_decls (PR c++/20961)
Devang Patel
dpatel@apple.com
Thu May 5 18:46:00 GMT 2005
On May 5, 2005, at 11:40 AM, Jakub Jelinek wrote:
> Hi!
>
> In merge_weak, if NEWDECL is weak and OLDDECL is not, NEWDECL is
> replaced
> with OLDDECL in weak_decls chain, but not so if both NEWDECL and
> OLDDECL
> are weak already when merge_weak is called. But merge_weak is called
> by C/C++ duplicate_decls when we know NEWDECL is going to be not used
> any more, and C++ even ggc_free's it.
> Without this patch, weak_decls contains a ggc_free'd memory and thus
> can crash in various interesting ways.
>
> Ok to commit if it bootstraps and passes regtesting? For 4.0 as well,
> as this appears to be a 4.0/4.1 regression?
What a coincident. I was about to send this patch (Only difference is
that I
used new function replace_weak()). It is running dejagnu tests.
I ran into this crash while building large App here, with PCH.
Thanks!
-
Devang
> 2005-05-05 Jakub Jelinek <jakub@redhat.com>
>
> PR c++/20961
> * varasm.c (merge_weak): Remove NEWDECL from WEAK_DECLS chain
> if both NEWDECL and OLDDECL are already weak.
>
> * g++.dg/ext/weak3.C: New test.
>
> --- gcc/varasm.c.jj 2005-04-29 09:18:11.000000000 +0200
> +++ gcc/varasm.c 2005-05-05 20:07:37.000000000 +0200
> @@ -4303,7 +4303,21 @@ void
> merge_weak (tree newdecl, tree olddecl)
> {
> if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
> - return;
> + {
> + if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
> + {
> + tree *pwd;
> + /* We put the NEWDECL on the weak_decls list at some point
> + and OLDDECL as well. Keep just OLDDECL on the list. */
> + for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
> + if (TREE_VALUE (*pwd) == newdecl)
> + {
> + *pwd = TREE_CHAIN (*pwd);
> + break;
> + }
> + }
> + return;
> + }
>
> if (DECL_WEAK (newdecl))
> {
> --- gcc/testsuite/g++.dg/ext/weak3.C.jj 2005-05-05
> 20:10:34.000000000 +0200
> +++ gcc/testsuite/g++.dg/ext/weak3.C 2005-05-05
> 20:12:24.000000000 +0200
> @@ -0,0 +1,17 @@
> +// PR c++/20961
> +// Test for #pragma weak and __attribute__((weak)) being used
> together.
> +// { dg-do compile }
> +// { dg-require-weak "" }
> +// { dg-options "" }
> +
> +// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } }
> +
> +int foo ();
> +#pragma weak foo
> +
> +int
> +__attribute__((weak))
> +foo ()
> +{
> + return 0;
> +}
>
> Jakub
>
More information about the Gcc-patches
mailing list