https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94875
Bug ID: 94875
Summary: -fdebug-types-section drops DW_AT_object_pointer
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: debug
Assignee: unassigned at gcc dot gnu.org
Reporter: vries at gcc dot gnu.org
Target Milestone: ---
Consider the test-case consisting of gdb.cp/derivation.cc and
gdb.cp/derivation2.cc (
https://sourceware.org/git/?p=binutils-gdb.git;a=blob_plain;f=gdb/testsuite/gdb.cp/derivation.cc;hb=HEAD
and
https://sourceware.org/git/?p=binutils-gdb.git;a=blob_plain;f=gdb/testsuite/gdb.cp/derivation2.cc;hb=HEAD
).
Without -fdebug-types-section:
...
$ g++ derivation.cc derivation2.cc -g
...
we have:
...
<0><d2>: Abbrev Number: 1 (DW_TAG_compile_unit)
<d8> DW_AT_name : derivation.cc
<1><161>: Abbrev Number: 11 (DW_TAG_class_type)
<162> DW_AT_name : A
<164> DW_AT_byte_size : 8
<165> DW_AT_decl_file : 1
<166> DW_AT_decl_line : 33
<167> DW_AT_sibling : <0x1df>
<2><16b>: Abbrev Number: 12 (DW_TAG_typedef)
<16c> DW_AT_name : value_type
<170> DW_AT_decl_file : 1
<171> DW_AT_decl_line : 35
<172> DW_AT_type : <0x14a>
<176> DW_AT_accessibility: 1 (public)
<2><1a6>: Abbrev Number: 15 (DW_TAG_subprogram)
<1a7> DW_AT_external : 1
<1a7> DW_AT_name : afoo
<1ab> DW_AT_decl_file : 1
<1ac> DW_AT_decl_line : 44
<1ad> DW_AT_linkage_name: _ZN1A4afooEv
<1b1> DW_AT_type : <0x16b>
<1b5> DW_AT_accessibility: 1 (public)
<1b6> DW_AT_declaration : 1
<1b6> DW_AT_object_pointer: <0x1be>
<1ba> DW_AT_sibling : <0x1c4>
<3><1be>: Abbrev Number: 7 (DW_TAG_formal_parameter)
<1bf> DW_AT_type : <0x1df>
<1c3> DW_AT_artificial : 1
<1><d15>: Abbrev Number: 48 (DW_TAG_subprogram)
<d16> DW_AT_specification: <0x1a6>
<d1a> DW_AT_decl_line : 198
<d1b> DW_AT_object_pointer: <0xd39>
<d1f> DW_AT_low_pc : 0x400640
<d27> DW_AT_high_pc : 0xf
<d2f> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
<d31> DW_AT_object_pointer: <0xd39>
<d35> DW_AT_GNU_all_call_sites: 1
<d35> DW_AT_sibling : <0xd46>
<2><d39>: Abbrev Number: 47 (DW_TAG_formal_parameter)
<d3a> DW_AT_name : this
<d3e> DW_AT_type : <0x1e5>
<d42> DW_AT_artificial : 1
<d42> DW_AT_location : 2 byte block: 91 68 (DW_OP_fbreg: -24)
...
OTOH with -fdebug-types-section:
...
$ g++ derivation.cc derivation2.cc -g -fdebug-types-section
...
we have:
...
.debug_info:
<0><d2>: Abbrev Number: 41 (DW_TAG_compile_unit)
<d8> DW_AT_name : derivation.cc
<1><13e>: Abbrev Number: 45 (DW_TAG_class_type)
<13f> DW_AT_name : A
<141> DW_AT_signature : <0xccc>
<145> DW_AT_declaration : 1
<145> DW_AT_sibling : <0x174>
<2><153>: Abbrev Number: 47 (DW_TAG_subprogram)
<154> DW_AT_external : 1
<154> DW_AT_name : afoo
<158> DW_AT_decl_file : 1
<159> DW_AT_decl_line : 44
<15a> DW_AT_linkage_name: _ZN1A4afooEv
<15e> DW_AT_type : <0xcdb>
<162> DW_AT_accessibility: 1 (public)
<163> DW_AT_declaration : 1
<1><8fd>: Abbrev Number: 68 (DW_TAG_subprogram)
<8fe> DW_AT_specification: <0x153>
<902> DW_AT_decl_line : 198
<903> DW_AT_object_pointer: <0x921>
<907> DW_AT_low_pc : 0x400640
<90f> DW_AT_high_pc : 0xf
<917> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
<919> DW_AT_object_pointer: <0x921>
<91d> DW_AT_GNU_all_call_sites: 1
<91d> DW_AT_sibling : <0x92e>
<2><921>: Abbrev Number: 67 (DW_TAG_formal_parameter)
<922> DW_AT_name : (indirect string, offset: 0x63c): this
<926> DW_AT_type : <0x17a>
<92a> DW_AT_artificial : 1
<92a> DW_AT_location : 2 byte block: 91 68 (DW_OP_fbreg: -24)
<1><ccc>: Abbrev Number: 27 (DW_TAG_class_type)
<ccd> DW_AT_name : A
<ccf> DW_AT_signature : signature: 0xbb06cf12bfa5e351
<cd7> DW_AT_declaration : 1
<cd7> DW_AT_sibling : <0xce8>
<2><cdb>: Abbrev Number: 28 (DW_TAG_typedef)
<cdc> DW_AT_name : (indirect string, offset: 0x515): value_type
<ce0> DW_AT_decl_file : 1
<ce1> DW_AT_decl_line : 35
<ce2> DW_AT_type : <0xce8>
<ce6> DW_AT_accessibility: 1 (public)
.debug_types:
Compilation Unit @ offset 0x94b:
Signature: 0xbb06cf12bfa5e351
Type Offset: 0x25 (0x94b + 0x25 == 0x970)
<0><962>: Abbrev Number: 1 (DW_TAG_type_unit)
<1><970>: Abbrev Number: 25 (DW_TAG_class_type)
<971> DW_AT_name : A
<973> DW_AT_byte_size : 8
<974> DW_AT_decl_file : 1
<975> DW_AT_decl_line : 33
<976> DW_AT_sibling : <0x9ee>
<2><97a>: Abbrev Number: 28 (DW_TAG_typedef)
<97b> DW_AT_name : (indirect string, offset: 0x515): value_type
<97f> DW_AT_decl_file : 1
<980> DW_AT_decl_line : 35
<981> DW_AT_type : <0x9ee>
<985> DW_AT_accessibility: 1 (public)
<2><9b5>: Abbrev Number: 32 (DW_TAG_subprogram)
<9b6> DW_AT_external : 1
<9b6> DW_AT_name : (indirect string, offset: 0x26e): afoo
<9ba> DW_AT_decl_file : 1
<9bb> DW_AT_decl_line : 44
<9bc> DW_AT_linkage_name: (indirect string, offset: 0x37e): _ZN1A4afooEv
<9c0> DW_AT_type : <0x97a>
<9c4> DW_AT_accessibility: 1 (public)
<9c5> DW_AT_declaration : 1
<9c5> DW_AT_object_pointer: <0x9cd>
<9c9> DW_AT_sibling : <0x9d3>
<3><9cd>: Abbrev Number: 6 (DW_TAG_formal_parameter)
<9ce> DW_AT_type : <0x9f5>
<9d2> DW_AT_artificial : 1
...
The curious thing is that DIE 0x153 has no DW_AT_object_pointer.
Gdb normally ignores DIE 0x153, but I just tested a gdb fix that doesn't ignore
it (to fix another problem in gdb related to -fdebug-types-section,
https://sourceware.org/bugzilla/show_bug.cgi?id=25898) and got:
...
$ gdb -batch a.out \
-ex "ptype A::value_type" \
-ex "break marker1" \
-ex r \
-ex up \
-ex "ptype/r a_instance"
type = int
Breakpoint 1 at 0x400723: file derivation.cc, line 271.
Breakpoint 1, marker1 () at derivation.cc:271
271 }
#1 0x00000000004007ae in main () at derivation.cc:287
287 marker1(); // marker1-returns-here
type = class A {
public:
A::value_type a;
A::value_type aa;
static A(void);
static A::value_type afoo(void);
static A::value_type foo(void);
typedef int value_type;
}
...
GDB now prints afoo as static, because of the missing DW_AT_object_pointer.