On Wed, 27 Jul 2022, Jakub Jelinek wrote:

> Hi!
> 
> When -dx option is used (didn't know we have it and no idea what is it
> useful for), we just expand functions to RTL and then omit all further
> RTL passes, so the normal functions aren't actually emitted into assembly,
> just variables.
> The following testcase ICEs, because we don't emit the methods, but do
> emit thunks pointing to that and those thunks have unwind info and rely on
> at least some real functions to be emitted (which is normally the case,
> thunks are only emitted for locally defined functions) because otherwise
> there are no CIEs, only FDEs and dwarf2out is upset about it.
> 
> The following patch fixes that by not emitting assembly thunks for -dx
> either.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK/

> 2022-07-27  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR debug/106261
>       * cgraphunit.cc (cgraph_node::assemble_thunks_and_aliases): Don't
>       output asm thunks for -dx.
> 
>       * g++.dg/debug/pr106261.C: New test.
> 
> --- gcc/cgraphunit.cc.jj      2022-06-27 11:18:02.048066608 +0200
> +++ gcc/cgraphunit.cc 2022-07-26 16:01:38.696956950 +0200
> @@ -1753,7 +1753,7 @@ cgraph_node::assemble_thunks_and_aliases
>       cgraph_node *thunk = e->caller;
>  
>       e = e->next_caller;
> -     expand_thunk (thunk, true, false);
> +     expand_thunk (thunk, !rtl_dump_and_exit, false);
>       thunk->assemble_thunks_and_aliases ();
>        }
>      else
> --- gcc/testsuite/g++.dg/debug/pr106261.C.jj  2022-07-26 15:59:04.082979550 
> +0200
> +++ gcc/testsuite/g++.dg/debug/pr106261.C     2022-07-26 15:58:37.301329916 
> +0200
> @@ -0,0 +1,36 @@
> +// PR debug/106261
> +// { dg-do compile }
> +// { dg-options "-dx -fno-dwarf2-cfi-asm" }
> +
> +struct A
> +{
> +  virtual void foo ();
> +  int a;
> +};
> +class C : virtual public A
> +{
> +};
> +struct B
> +{
> +  A *b;
> +
> +  B (A *x) : b (x) { b->foo (); }
> +};
> +struct E
> +{
> +  virtual ~E ();
> +};
> +class D : public C, E
> +{
> +};
> +struct F : D
> +{
> +  F (int);
> +
> +  static void bar ()
> +  {
> +    F a (0);
> +    B b (&a);
> +  }
> +};
> +void baz () { F::bar (); }
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)

Reply via email to