On Thu, 20 Mar 2014, Martin Jambor wrote:

> Hi,
> 
> in PR 60419 we end up with a call graph node for a thunk that has no
> callee because symtab_remove_unreachable_nodes has determined its body
> is not needed although its declaration is still reachable (more
> details in comment 11 in bugzilla) and removal of callees is a part of
> the zombification process that such nodes undergo.  Later on, the last
> stage of inlining that runs after that connects the thunk to the call
> graph and we segfault because we expect thunks to have a callee.
> 
> So we can either keep thunk targets alive or clear the thunk flag.
> Thunks and aliases are quite similar and
> symtab_remove_unreachable_nodes does clear the alias flag and the "in
> border" nodes are referred to but not output and thus just another
> symbol.  Therefore I believe it is correct and much simpler to remove
> the thunk flag s well.
> 
> Bootstrapped and tested on x86_64, I have also build Mozilla Firefox
> witht the patch (without LTO, partly on purpose, partly because again
> I'm having issues with LTO after updating FF).  OK for trunk?

Ok.

Thanks,
Richard.

> There is the same issue on the 4.8 branch, but the patch does not
> apply, I'm in the process of preparing it.
> 
> Thanks,
> 
> Martin
> 
> 
> 2014-03-20  Martin Jambor  <mjam...@suse.cz>
> 
>       PR ipa/60419
>       * ipa.c (symtab_remove_unreachable_nodes): Clear thunk flag of nodes
>       in the border.
> 
> testsuite/
>       * g++.dg/ipa/pr60419.C: New test.
> 
> diff --git a/gcc/ipa.c b/gcc/ipa.c
> index 572dba1..164de0d 100644
> --- a/gcc/ipa.c
> +++ b/gcc/ipa.c
> @@ -488,6 +488,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, 
> FILE *file)
>             node->definition = false;
>             node->cpp_implicit_alias = false;
>             node->alias = false;
> +           node->thunk.thunk_p = false;
>             node->weakref = false;
>             if (!node->in_other_partition)
>               node->local.local = false;
> diff --git a/gcc/testsuite/g++.dg/ipa/pr60419.C 
> b/gcc/testsuite/g++.dg/ipa/pr60419.C
> new file mode 100644
> index 0000000..84461f3
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ipa/pr60419.C
> @@ -0,0 +1,80 @@
> +// PR middle-end/60419
> +// { dg-do compile }
> +// { dg-options "-O2" }
> +
> +struct C
> +{
> +};
> +
> +struct I : C
> +{
> +  I ();
> +};
> +
> +struct J
> +{
> +  void foo ();
> +  J ();
> +  virtual void foo (int &, int);
> +};
> +
> +template <class>
> +struct D
> +{
> +  virtual void foo (I &) const;
> +  void bar ()
> +  {
> +    I p;
> +    foo (p);
> +  }
> +};
> +
> +struct K : J, public D<int>
> +{
> +};
> +
> +struct F
> +{
> +  K *operator->();
> +};
> +
> +struct N : public K
> +{
> +  void foo (int &, int);
> +  I n;
> +  void foo (I &) const {}
> +};
> +
> +struct L : J
> +{
> +  F l;
> +};
> +
> +struct M : F
> +{
> +  L *operator->();
> +};
> +
> +struct G
> +{
> +  G ();
> +};
> +
> +M h;
> +
> +G::G ()
> +try
> +{
> +  N f;
> +  f.bar ();
> +  throw;
> +}
> +catch (int)
> +{
> +}
> +
> +void
> +baz ()
> +{
> +  h->l->bar ();
> +}
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer

Reply via email to