[Bug debug/105636] -gctf causes an ICE on some invalid code
ibhagat at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu May 19 21:31:08 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105636
--- Comment #2 from Indu Bhagat <ibhagat at gcc dot gnu.org> ---
I found the minimum reproducer to be:
$ cat testcase.c
static int sa[100];
int n;
static int (*a2)[] = (__typeof__(int (*)[n]))sa;
I tried to debug this and found out that the likely cause is some invalidity in
the DWARF DIE generation.
$ gcc -g3 -c testcase.c
$ objdump --dwarf=info testcase.o
[...]
<1><39>: Abbrev Number: 6 (DW_TAG_base_type)
<3a> DW_AT_byte_size : 4
<3b> DW_AT_encoding : 5 (signed)
<3c> DW_AT_name : int
<1><40>: Abbrev Number: 2 (DW_TAG_variable)
<41> DW_AT_name : sa
<44> DW_AT_decl_file : 1
<44> DW_AT_decl_line : 1
<45> DW_AT_decl_column : 12
<46> DW_AT_type : <0x22>
<4a> DW_AT_location : 9 byte block: 3 20 0 0 0 0 0 0 0
(DW_OP_addr: 20)
<1><54>: Abbrev Number: 7 (DW_TAG_variable)
<55> DW_AT_name : n
<57> DW_AT_decl_file : 1
<58> DW_AT_decl_line : 2
<59> DW_AT_decl_column : 5
<5a> DW_AT_type : <0x39>
<5e> DW_AT_external : 1
<5e> DW_AT_location : 9 byte block: 3 0 0 0 0 0 0 0 0 (DW_OP_addr: 0)
<1><68>: Abbrev Number: 8 (DW_TAG_array_type)
<69> DW_AT_type : <0x39>
<1><6d>: Abbrev Number: 1 (DW_TAG_array_type)
<6e> DW_AT_type : <0x39>
<72> DW_AT_sibling : <0x78>
<2><76>: Abbrev Number: 9 (DW_TAG_subrange_type)
<2><77>: Abbrev Number: 0
<1><78>: Abbrev Number: 2 (DW_TAG_variable)
<79> DW_AT_name : a2
<7c> DW_AT_decl_file : 1
<7c> DW_AT_decl_line : 3
<7d> DW_AT_decl_column : 14
<7e> DW_AT_type : <0x8c>
<82> DW_AT_location : 9 byte block: 3 0 0 0 0 0 0 0 0 (DW_OP_addr: 0)
<1><8c>: Abbrev Number: 10 (DW_TAG_pointer_type)
<8d> DW_AT_byte_size : 8
<8e> DW_AT_type : <0x6d>
<1><92>: Abbrev Number: 0
The dwarf2ctf functionality relies on the presence of a child DIE for a die of
type DW_TAG_array_type, where the child is either of type DW_TAG_subrange_type
or DW_TAG_enumeration_type. I believe that this is a sound assumption. The
DWARF5 manual specifies the same.
Notice how the DIE <1><68>: Abbrev Number: 8 (DW_TAG_array_type) does not have
any child.
I see that add_subscipt_info () did add the DW_TAG_subrange_type with some
information:
1: debug_dwarf_die((dw_die_ref)0x7fffea2f15a0) = DIE 0: DW_TAG_array_type
(0x7fffea2f15a0)
abbrev id: 0 offset: 0 mark: 2
DW_AT_type: die -> 0 (0x7fffea2f1410)
DIE 0: DW_TAG_subrange_type (0x7fffea2f15f0)
abbrev id: 0 offset: 0 mark: 0
DW_AT_type: die -> 0 (0x7fffea2f13c0)
DW_AT_upper_bound: location descriptor:
(0x7fffea2f17d0) DW_OP_addr address, 0
(0x7fffea2f1820) DW_OP_deref_size 4, 0
(0x7fffea2f1870) DW_OP_lit1 1, 0
(0x7fffea2f18c0) DW_OP_minus 0, 0
But looks like the dwarf2out::prune_unused_types () was not able to prune this
type completely as it should ? Am I on the right track?
More information about the Gcc-bugs
mailing list