https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101452
Bug ID: 101452
Summary: [debug, dwarf-5] undefined static member removed by
-feliminate-unused-debug-symbols
Product: gcc
Version: 11.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: debug
Assignee: unassigned at gcc dot gnu.org
Reporter: vries at gcc dot gnu.org
Target Milestone: ---
Test-case:
...
$ cat test.c
struct a {
int a;
static int sa;
};
int
main (void)
{
struct a a;
a.a = 1;
return 0;
}
...
Compile with dwarf v4:
...
$ ./install/bin/g++ test.c -c -g -gdwarf-4
$ readelf -wi test.o
...
<1><2d>: Abbrev Number: 2 (DW_TAG_structure_type)
<2e> DW_AT_name : a
...
<2><38>: Abbrev Number: 3 (DW_TAG_member)
<39> DW_AT_name : a
...
<2><43>: Abbrev Number: 4 (DW_TAG_member)
<44> DW_AT_name : sa
...
<2><4e>: Abbrev Number: 0
...
Compile with dwarf v5:
...
$ ./install/bin/g++ test.c -c -g -gdwarf-5
$ readelf -wi test.o
...
<1><2e>: Abbrev Number: 2 (DW_TAG_structure_type)
<2f> DW_AT_name : a
...
<2><39>: Abbrev Number: 3 (DW_TAG_member)
<3a> DW_AT_name : a
...
<2><44>: Abbrev Number: 0
...
The sa member is dropped by -feliminate-unused-debug-symbols.
Fixed by:
...
$ git diff
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 82783c4968b..fa9a97f3ebb 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -29952,7 +29952,8 @@ prune_unused_types_walk (dw_die_ref die)
if (get_AT (die, DW_AT_external))
{
for (c = die->die_parent; c; c = c->die_parent)
- if (c->die_tag == DW_TAG_subprogram)
+ if (c->die_tag == DW_TAG_subprogram
+ || c->die_tag == DW_TAG_structure_type)
break;
if (!c)
return;
...
Note that actually defining the var using this:
...
int a::sa;
...
also brings back the missing DIE.