On Mon, Nov 7, 2011 at 8:53 AM, Xinliang David Li <davi...@google.com> wrote:
> I have seen compiler build error (segmentation fault) in libstdc++-v3.
> It turns out that a vector allocated in gc memory is GCed before the
> vector is released. The gc call is from a call to synethesize_method
> from cp_finish_decl.
>
> The following patch fixes the problem. Compiler bootstraps and tested
> on linux/x86-64. Ok for trunk (or better fix suggested)?

The context looks different on trunk.  Do you have a backtrace on where
we ggc collect from a frame starting at cp_finish_decl?

> thanks,
>
> David
>
> 2011-11-05  Xinliang David Li  <davi...@google.com>
>
>        * cp/decl.c (cp_finish_decl): Prevent cleanups from
>        being garbage collected before being released.
>
>
> Index: cp/decl.c
> ===================================================================
> --- cp/decl.c   (revision 181013)
> +++ cp/decl.c   (working copy)
> @@ -5902,6 +5902,8 @@ value_dependent_init_p (tree init)
>    FLAGS is LOOKUP_ONLYCONVERTING if the = init syntax was used, else 0
>    if the (init) syntax was used.  */
>
> +static GTY (()) VEC(tree,gc) *cleanups_vec;
> +
>  void
>  cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
>                tree asmspec_tree, int flags)
> @@ -5914,6 +5916,7 @@ cp_finish_decl (tree decl, tree init, bo
>   bool var_definition_p = false;
>   tree auto_node;
>
> +  cleanups_vec = cleanups;
>   if (decl == error_mark_node)
>     return;
>   else if (! decl)
> @@ -6319,6 +6322,7 @@ cp_finish_decl (tree decl, tree init, bo
>   FOR_EACH_VEC_ELT (tree, cleanups, i, t)
>     push_cleanup (decl, t, false);
>   release_tree_vector (cleanups);
> +  cleanups_vec = NULL;
>
>   if (was_readonly)
>     TREE_READONLY (decl) = 1;
>

Reply via email to