On Wed, Oct 24, 2018 at 3:34 PM Martin Liška <mli...@suse.cz> wrote:
>
> On 10/23/18 1:19 PM, Richard Biener wrote:
> > On Tue, Oct 23, 2018 at 10:59 AM Martin Liška <mli...@suse.cz> wrote:
> >>
> >> Hi.
> >>
> >> I've returned to this long-lasting issue after quite some time. Thanks to 
> >> Honza I hope
> >> I can now address the root cause which caused output of a string constant 
> >> when debug info
> >> was emitted. The problematic situation happened with following back-trace:
> >>
> >> #0  mergeable_string_section (decl=<string_cst 0x7ffff67be210>, align=64, 
> >> flags=0) at /home/marxin/Programming/gcc/gcc/varasm.c:808
> >> #1  0x0000000001779bf3 in default_elf_select_section (decl=<string_cst 
> >> 0x7ffff67be210>, reloc=0, align=64) at 
> >> /home/marxin/Programming/gcc/gcc/varasm.c:6739
> >> #2  0x000000000176efb6 in get_constant_section (exp=<string_cst 
> >> 0x7ffff67be210>, align=64) at 
> >> /home/marxin/Programming/gcc/gcc/varasm.c:3302
> >> #3  0x000000000176f468 in build_constant_desc (exp=<string_cst 
> >> 0x7ffff67be210>) at /home/marxin/Programming/gcc/gcc/varasm.c:3371
> >> #4  0x000000000176f81c in output_constant_def (exp=<string_cst 
> >> 0x7ffff67be210>, defer=1) at /home/marxin/Programming/gcc/gcc/varasm.c:3434
> >> #5  0x000000000176d406 in decode_addr_const (exp=<addr_expr 
> >> 0x7ffff682f8c0>, value=0x7fffffffc540) at 
> >> /home/marxin/Programming/gcc/gcc/varasm.c:2951
> >> #6  0x000000000176d93f in const_hash_1 (exp=<addr_expr 0x7ffff682f8c0>) at 
> >> /home/marxin/Programming/gcc/gcc/varasm.c:3054
> >> #7  0x000000000176fdc2 in lookup_constant_def (exp=<addr_expr 
> >> 0x7ffff682f8c0>) at /home/marxin/Programming/gcc/gcc/varasm.c:3557
> >> #8  0x0000000000dd5778 in cst_pool_loc_descr (loc=<addr_expr 
> >> 0x7ffff682f8c0>) at /home/marxin/Programming/gcc/gcc/dwarf2out.c:17288
> >>
> >> That was in situation where we emit debug info of a function that has an 
> >> inlined __PRETTY_FUNCTION__ from
> >> a different function. As seen, the constant is output due to const_hash_1 
> >> function call. Proper fix would
> >> be to not emit these string constants for purpose of hash function.
> >
> > possibly sth like the following - that avoids all cases of calling
> > output_constant_def.  Probably worth testing
> > separately.
>
> Thanks for the hint. I can confirm it works for the pretty function patch.
> I also tested the patch separately on current trunk. May I install the hunk
> right now, or should I wait?

You can install it right now I think.

Richard.

> Thanks,
> Martin
>
> >
> > diff --git a/gcc/varasm.c b/gcc/varasm.c
> > index 91650eea9f7..9121dbd2c84 100644
> > --- a/gcc/varasm.c
> > +++ b/gcc/varasm.c
> > @@ -3047,6 +3047,10 @@ const_hash_1 (const tree exp)
> >        }
> >
> >      case ADDR_EXPR:
> > +      if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
> > +       return const_hash_1 (TREE_OPERAND (exp, 0));
> > +
> > +      /* Fallthru.  */
> >      case FDESC_EXPR:
> >        {
> >         struct addr_const value;
> >
> >> However, I still see some minor ICEs, it's probably related to 
> >> decay_conversion in cp_fname_init:
> >>
> >> 1) ./xg++ -B. 
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__2.C
> >>
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__2.C:6:17:
> >>  internal compiler error: Segmentation fault
> >> 6 |     [] { return __func__; }();
> >>   |                 ^~~~~~~~
> >> 0x1344568 crash_signal
> >>         /home/marxin/Programming/gcc/gcc/toplev.c:325
> >> 0x7ffff6bc310f ???
> >>         
> >> /usr/src/debug/glibc-2.27-6.1.x86_64/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
> >> 0x9db134 is_capture_proxy(tree_node*)
> >>         /home/marxin/Programming/gcc/gcc/cp/lambda.c:261
> >> 0xaeecb7 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
> >>         /home/marxin/Programming/gcc/gcc/cp/pt.c:16700
> >> 0xaee5fd tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
> >>         /home/marxin/Programming/gcc/gcc/cp/pt.c:16636
> >> 0xaf0ffb tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
> >>         /home/marxin/Programming/gcc/gcc/cp/pt.c:16942
> >>
> >> where
> >> (gdb) p debug_tree(decl)
> >>  <var_decl 0x7ffff7fee480 __func__
> >>     type <pointer_type 0x7ffff69b5540
> >>         type <integer_type 0x7ffff69b5498 char readonly unsigned 
> >> string-flag type_6 QI
> >>             size <integer_cst 0x7ffff698df78 constant 8>
> >>             unit-size <integer_cst 0x7ffff698df90 constant 1>
> >>             align:8 warn_if_not_align:0 symtab:0 alias-set -1 
> >> canonical-type 0x7ffff69b5498 precision:8 min <integer_cst 0x7ffff698dfd8 
> >> 0> max <integer_cst 0x7ffff698dfc0 255>
> >>             pointer_to_this <pointer_type 0x7ffff69b5540>>
> >>         unsigned DI
> >>         size <integer_cst 0x7ffff698de88 constant 64>
> >>         unit-size <integer_cst 0x7ffff698dea0 constant 8>
> >>         align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
> >> 0x7ffff69b5540>
> >>     readonly used tree_2 unsigned DI 
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__2.C:6:17
> >>  size <integer_cst 0x7ffff698de88 64> unit-size <integer_cst 
> >> 0x7ffff698dea0 8>
> >>     align:64 warn_if_not_align:0 context <function_decl 0x7ffff67abd00 
> >> operator()>
> >>     value-expr <nop_expr 0x7ffff67b7660 type <pointer_type 0x7ffff69b5540>
> >>         constant
> >>         arg:0 <addr_expr 0x7ffff67b7640 type <pointer_type 0x7ffff67bd3f0>
> >>             constant
> >>             arg:0 <string_cst 0x7ffff67b7620 type <array_type 
> >> 0x7ffff67bd348>
> >>                 constant "operator()\000">>>>
> >>
> >> and
> >> #0  0x00000000009db134 in is_capture_proxy (decl=<tree 0x0>) at 
> >> /home/marxin/Programming/gcc/gcc/cp/lambda.c:261
> >>
> >> 2 ) ./xg++ -B. 
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/ext/pretty2.C -c
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/ext/pretty2.C:16:24: 
> >> internal compiler error: Segmentation fault
> >> 16 |     __PRETTY_FUNCTION__), 0))
> >>    |                        ^
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/ext/pretty2.C:36:10: 
> >> note: in expansion of macro ‘assert’
> >> 36 | int a = (assert (foo ()), 1);
> >>    |          ^~~~~~
> >> 0x1344568 crash_signal
> >>         /home/marxin/Programming/gcc/gcc/toplev.c:325
> >> 0x7ffff6bc310f ???
> >>         
> >> /usr/src/debug/glibc-2.27-6.1.x86_64/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
> >> 0x9db270 is_capture_proxy(tree_node*)
> >>         /home/marxin/Programming/gcc/gcc/cp/lambda.c:265
> >> 0x9dbad9 is_normal_capture_proxy(tree_node*)
> >>         /home/marxin/Programming/gcc/gcc/cp/lambda.c:274
> >> 0x9c1fe6 mark_use(tree_node*, bool, bool, unsigned int, bool)
> >>         /home/marxin/Programming/gcc/gcc/cp/expr.c:114
> >> 0x89d9ab convert_like_real
> >>         /home/marxin/Programming/gcc/gcc/cp/call.c:6905
> >>
> >> where:
> >>
> >> (gdb) p debug_tree(decl)
> >>  <var_decl 0x7ffff7fee870 __PRETTY_FUNCTION__
> >>     type <pointer_type 0x7ffff69b4540
> >>         type <integer_type 0x7ffff69b4498 char readonly unsigned 
> >> string-flag type_6 QI
> >>             size <integer_cst 0x7ffff698df78 constant 8>
> >>             unit-size <integer_cst 0x7ffff698df90 constant 1>
> >>             align:8 warn_if_not_align:0 symtab:0 alias-set -1 
> >> canonical-type 0x7ffff69b4498 precision:8 min <integer_cst 0x7ffff698dfd8 
> >> 0> max <integer_cst 0x7ffff698dfc0 255>
> >>             pointer_to_this <pointer_type 0x7ffff69b4540>>
> >>         unsigned type_6 DI
> >>         size <integer_cst 0x7ffff698de88 constant 64>
> >>         unit-size <integer_cst 0x7ffff698dea0 constant 8>
> >>         align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
> >> 0x7ffff69b4540>
> >>     readonly used tree_1 tree_2 unsigned read decl_6 DI 
> >> /home/marxin/Programming/gcc/gcc/testsuite/g++.dg/ext/pretty2.C:36:10 size 
> >> <integer_cst 0x7ffff698de88 64> unit-size <integer_cst 0x7ffff698dea0 8>
> >>     align:64 warn_if_not_align:0
> >>     value-expr <nop_expr 0x7ffff67b69a0 type <pointer_type 0x7ffff69b4540>
> >>         constant
> >>         arg:0 <addr_expr 0x7ffff67b6980 type <pointer_type 0x7ffff67c3738>
> >>             constant
> >>             arg:0 <string_cst 0x7ffff67b6960 type <array_type 
> >> 0x7ffff67c3690>
> >>                 constant "top level\000">>> chain <var_decl 0x7ffff7fee7e0 
> >> a>>
> >>
> >> Can please a C++ maintainer help me with that? Having that I hope I can 
> >> finish the patch.
> >>
> >> Thank you,
> >> Martin
>

Reply via email to