[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-27 Thread cvs-commit at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

--- Comment #11 from CVS Commits  ---
The master branch has been updated by Richard Biener :

https://gcc.gnu.org/g:45cfaf9903d3f5aa916d330f2013eb7d820a7137

commit r10-7418-g45cfaf9903d3f5aa916d330f2013eb7d820a7137
Author: Richard Biener 
Date:   Fri Mar 27 13:57:42 2020 +0100

debug/94273 - avoid creating type DIEs for DINFO_LEVEL_TERSE

This avoids completing types for DINFO_LEVEL_TERSE by using
the should_emit_struct_debug machinery.

2020-03-27  Richard Biener  

PR debug/94273
* dwarf2out.c (should_emit_struct_debug): Return false for
DINFO_LEVEL_TERSE.

* g++.dg/debug/pr94273.C: New testcase.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-27 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Richard Biener  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED

--- Comment #12 from Richard Biener  ---
Fixed.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-27 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Richard Biener  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
   Assignee|unassigned at gcc dot gnu.org  |rguenth at gcc dot 
gnu.org

--- Comment #10 from Richard Biener  ---
I'm testing this patch now.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-27 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

--- Comment #9 from Richard Biener  ---
OK, so during early creation of the DIE for the type we end up in

static void
gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
enum debug_info_usage usage)
{
...
  int complete = (TYPE_SIZE (type)
  && (! TYPE_STUB_DECL (type)
  || ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type;

where complete is false because of TYPE_DECL_SUPPRESS_DEBUG.  When record
the type to be re-processed later and between now and then the C++ FE does
note_debug_info_needed via maybe_emit_vtables and clears
TYPE_DECL_SUPPRESS_DEBUG, causing the type to be completed during 
retry_incomplete_types processing.

I think PR93951 may be related in the end because the conditions on when
exactly we emit what parts of debug info is quite intricate in dwarf2out.

Now, for this bug I guess we should choose to piggy-back on that,
making should_emit_struct_debug return false for DINFO_LEVEL_TERSE
or initializing debug_struct_{generic,ordinary} accordingly.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index b1fa6f5ff7c..378a27394e8 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -399,6 +399,9 @@ get_full_len (const wide_int )
 static bool
 should_emit_struct_debug (tree type, enum debug_info_usage usage)
 {
+  if (debug_info_level <= DINFO_LEVEL_TERSE)
+return false;
+
   enum debug_struct_file criterion;
   tree type_decl;
   bool generic = lang_hooks.types.generic_p (type);

thoughts?

The DWARF we generate for the testcase at -g1 is then

 <0>: Abbrev Number: 1 (DW_TAG_compile_unit)
   DW_AT_producer: (indirect string, offset: 0x0): GNU C++14 10.0.1
2
0200325 (experimental) -mtune=generic -march=x86-64 -g1
<10>   DW_AT_language: 4(C++)
<11>   DW_AT_name: (indirect string, offset: 0x4a): t.ii
<15>   DW_AT_comp_dir: (indirect string, offset: 0x4f):
/home/rguenther/
obj/gcc
<19>   DW_AT_ranges  : 0x0
<1d>   DW_AT_low_pc  : 0x0
<25>   DW_AT_stmt_list   : 0x0
 <1><29>: Abbrev Number: 2 (DW_TAG_variable)
<2a>   DW_AT_name: b
<2c>   DW_AT_decl_file   : 1
<2d>   DW_AT_decl_line   : 3
<2e>   DW_AT_decl_column : 12
<2f>   DW_AT_external: 1
<2f>   DW_AT_declaration : 1
 <1><2f>: Abbrev Number: 3 (DW_TAG_variable)
<30>   DW_AT_specification: <0x29>
<34>   DW_AT_decl_line   : 4
<35>   DW_AT_decl_column : 5
<36>   DW_AT_location: 9 byte block: 3 0 0 0 0 0 0 0 0  (DW_OP_addr: 0)
 <1><40>: Abbrev Number: 4 (DW_TAG_subprogram)
<41>   DW_AT_external: 1
<41>   DW_AT_name: c
<43>   DW_AT_decl_file   : 1
<44>   DW_AT_decl_line   : 2
<45>   DW_AT_decl_column : 16
<46>   DW_AT_linkage_name: (indirect string, offset: 0x67): _ZN1a1cEv
<4a>   DW_AT_virtuality  : 1(virtual)
<4b>   DW_AT_vtable_elem_location: 2 byte block: 10 0   (DW_OP_constu:
0)
<4e>   DW_AT_accessibility: 3   (private)
<4f>   DW_AT_low_pc  : 0x0
<57>   DW_AT_high_pc : 0xb
<5f>   DW_AT_frame_base  : 1 byte block: 9c (DW_OP_call_frame_cfa)
<61>   DW_AT_GNU_all_call_sites: 1
 <1><61>: Abbrev Number: 0

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-26 Thread stilor at att dot net
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

--- Comment #8 from Alexey Neyman  ---
Created attachment 48129
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48129=edit
Patch

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-26 Thread stilor at att dot net
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

--- Comment #7 from Alexey Neyman  ---
(In reply to Richard Biener from comment #6)
> (In reply to Alexey Neyman from comment #4)
> > Or add a similar "return if debug level is terse" at the beginning of
> > `gen_type_die` - I didn't notice that in C++ it could also get called not
> > through the `add_type_attribute`:
> > 
> > ```
> > diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> > index 89e52a41508..b0f6680bd61 100644
> > --- a/gcc/dwarf2out.c
> > +++ b/gcc/dwarf2out.c
> > @@ -25709,6 +25709,9 @@ gen_type_die_with_usage (tree type, dw_die_ref
> > context_die,
> >  static void
> >  gen_type_die (tree type, dw_die_ref context_die)
> >  {
> > +  if (debug_info_level <= DINFO_LEVEL_TERSE)
> > +return;
> > +
> >if (type != error_mark_node)
> >  {
> >gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
> > ```
> > 
> > I verified that it makes the attached test case compile successfully.
> 
> But then the static var is improperly scoped in the debug info?  IMHO
> it's better left out.

First, which static variable? The test case for this PR does not have any
static vars:

```
class a {
  virtual void c() {}
} extern b;
a b;
```

As to DECL_FILE_SCOPE_P check, do you mean something like this?

```
@@ -26360,7 +26365,8 @@ gen_decl_die (tree decl, tree origin, struct
vlr_context *ctx,
 variable declarations or definitions unless it is external.  */
   if (debug_info_level < DINFO_LEVEL_TERSE
  || (debug_info_level == DINFO_LEVEL_TERSE
- && !TREE_PUBLIC (decl_or_origin)))
+ && (!TREE_PUBLIC (decl_or_origin)
+  || !DECL_FILE_SCOPE_P(decl_or_origin
break;

   if (debug_info_level > DINFO_LEVEL_TERSE) {
@@ -26841,7 +26847,8 @@ dwarf2out_decl (tree decl)
 variable declarations or definitions unless it is external.  */
   if (debug_info_level < DINFO_LEVEL_TERSE
  || (debug_info_level == DINFO_LEVEL_TERSE
- && !TREE_PUBLIC (decl)))
+ && (!TREE_PUBLIC (decl)
+  || !DECL_FILE_SCOPE_P(decl
return;
   break;

```

This change doesn't resolve the ICE with that test.

I am going to attach a patch with what I suggested. Whether it is accepted, or
something different needs to be done - I don't have commit access, so somebody
else will have to commit it.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-26 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Richard Biener  changed:

   What|Removed |Added

 CC||rguenth at gcc dot gnu.org

--- Comment #6 from Richard Biener  ---
(In reply to Alexey Neyman from comment #4)
> Or add a similar "return if debug level is terse" at the beginning of
> `gen_type_die` - I didn't notice that in C++ it could also get called not
> through the `add_type_attribute`:
> 
> ```
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index 89e52a41508..b0f6680bd61 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -25709,6 +25709,9 @@ gen_type_die_with_usage (tree type, dw_die_ref
> context_die,
>  static void
>  gen_type_die (tree type, dw_die_ref context_die)
>  {
> +  if (debug_info_level <= DINFO_LEVEL_TERSE)
> +return;
> +
>if (type != error_mark_node)
>  {
>gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
> ```
> 
> I verified that it makes the attached test case compile successfully.

But then the static var is improperly scoped in the debug info?  IMHO
it's better left out.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-26 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Jakub Jelinek  changed:

   What|Removed |Added

 CC||jakub at gcc dot gnu.org

--- Comment #5 from Jakub Jelinek  ---
Any progress on this?  It breaks quite a lot of stuff in real world code.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-23 Thread stilor at att dot net
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

--- Comment #4 from Alexey Neyman  ---
Or add a similar "return if debug level is terse" at the beginning of
`gen_type_die` - I didn't notice that in C++ it could also get called not
through the `add_type_attribute`:

```
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 89e52a41508..b0f6680bd61 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -25709,6 +25709,9 @@ gen_type_die_with_usage (tree type, dw_die_ref
context_die,
 static void
 gen_type_die (tree type, dw_die_ref context_die)
 {
+  if (debug_info_level <= DINFO_LEVEL_TERSE)
+return;
+
   if (type != error_mark_node)
 {
   gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
```

I verified that it makes the attached test case compile successfully.

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-23 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Richard Biener  changed:

   What|Removed |Added

 CC||jason at gcc dot gnu.org

--- Comment #3 from Richard Biener  ---
Possibly the vars we output should additionally be constrained to
DECL_FILE_SCOPE_P?

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-23 Thread marxin at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Martin Liška  changed:

   What|Removed |Added

   Priority|P3  |P1
   Target Milestone|--- |10.0

[Bug debug/94273] [10 Regression] ICE in splice_child_die, at dwarf2out.c:5657 since r10-7235-g52b3aa8be1893848

2020-03-23 Thread marxin at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94273

Martin Liška  changed:

   What|Removed |Added

 Ever confirmed|0   |1
 CC||marxin at gcc dot gnu.org,
   ||stilor at att dot net
 Status|UNCONFIRMED |NEW
  Component|c++ |debug
   Last reconfirmed||2020-03-23
  Known to fail||10.0
   Keywords||ice-on-valid-code
  Known to work||9.3.0
Summary|ice in splice_child_die, at |[10 Regression] ICE in
   |dwarf2out.c:5657|splice_child_die, at
   ||dwarf2out.c:5657 since
   ||r10-7235-g52b3aa8be1893848