Hi, this is the second ICE during an LTO bootstrap with Ada enabled: the assertion at dwarf2out.c:11422 fails:
11422 gcc_assert (AT_ref (a)->die_offset); It's again a fallout of the DW_TAG_GNU_call_site patch: (gdb) p debug_dwarf_die(die) DIE 1022787: DW_TAG_GNU_call_site (0x7ffff3d20640) abbrev id: 103 offset: 1022787 mark: 1 DW_AT_low_pc: label: *.LVL21357 DW_AT_abstract_origin: die -> 0 (0x7ffff31f62d0) DW_AT_sibling: die -> 1022817 (0x7ffff3d20730) DIE 1022804: DW_TAG_GNU_call_site_parameter (0x7ffff3d20690) abbrev id: 48 offset: 1022804 mark: 1 DW_AT_location: location descriptor DW_AT_GNU_call_site_value: location descriptor DIE 1022810: DW_TAG_GNU_call_site_parameter (0x7ffff3d206e0) abbrev id: 48 offset: 1022810 mark: 1 DW_AT_location: location descriptor DW_AT_GNU_call_site_value: location descriptor DW_AT_abstract_origin link: (gdb) p debug_dwarf_die(0x7ffff31f62d0) DIE 0: DW_TAG_subprogram (0x7ffff31f62d0) abbrev id: 0 offset: 0 mark: 2 <---- zero offset! DW_AT_abstract_origin: die -> 1067604 (0x7ffff13b3820) DW_AT_low_pc: label: *.LFB4069 DW_AT_high_pc: label: *.LFE4069 DW_AT_frame_base: location list -> label:*.LLST6555 DW_AT_static_link: location descriptor DW_AT_abstract_origin link: DIE 1067604: DW_TAG_subprogram (0x7ffff13b3820) abbrev id: 12 offset: 1067604 mark: 1 DW_AT_name: "sem_ch10__build_limited_views__new_internal_shadow_entity" DW_AT_decl_file: "/home/eric/svn/gcc/gcc/ada/sem_ch10.adb" (66) DW_AT_decl_line: 5540 DW_AT_prototyped: 1 DW_AT_type: die -> 194 (0x7ffff15762d0) DW_AT_inline: 1 In the source file: Lim_Typ := New_Internal_Shadow_Entity (Kind => Ekind (Comp_Typ), Sloc_Value => Sloc (Comp_Typ), Id_Char => 'Z'); In the assembly file: call atree__ekind movzbl %al, %edi movq %rbx, %r10 movl %r13d, %esi call sem_ch10__build_limited_views__new_internal_shadow_entity.4857.134033.constprop.66.6913 (gdb) p debug_tree(decl) <function_decl 0x7ffff6c4dc00 sem_ch10__build_limited_views__new_internal_shadow_entity.4857.134033.constprop.66 whose DECL_CONTEXT is: <function_decl 0x7ffff6c4da00 sem_ch10__build_limited_views type <function_type 0x7ffff70e3f18 type <void_type 0x7ffff7ee0d20 void asm_written VOID align 8 symtab 0 alias set -1 canonical type 0x7ffff7ee0d20 pointer_to_this <pointer_type 0x7ffff7ee0dc8>> QI size <integer_cst 0x7ffff7ed0f80 constant 8> unit size <integer_cst 0x7ffff7ed0fa0 constant 1> align 8 symtab 0 alias set -1 canonical type 0x7ffff70e3f18 arg-types <tree_list 0x7ffff70f5258 value <integer_type 0x7ffff7ee0540 unsigned int> chain <tree_list 0x7ffff70f5280 value <void_type 0x7ffff7ee0d20 void>>> pointer_to_this <pointer_type 0x7ffff6536930>> addressable nothrow static QI file /home/eric/svn/gcc/gcc/ada/sem_ch10.adb line 5246 col 4 align 8 initial <error_mark 0x7ffff7ed7990> This DECL is stream out as DECL_CONTEXT but isn't in the LTRANS partition so its DECL_INITIAL is ERROR_MARK and its nested functions aren't declared with the DWARF back-end. As a result, both DW_TAG_subprogram DIEs above end up on the limbo list, in the above order. So when: dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin); if (origin) add_child_die (origin->die_parent, die); is run, origin->die_parent is NULL for the first DIE; it will only be set when the second DIE is processed on the limbo list. Hence the proposed fix: not to attach a DIE to a NULL parent. LTO bootstrapped with Ada on x86_64-suse-linux, OK for the mainline? 2011-04-18 Eric Botcazou <ebotca...@adacore.com> PR lto/48492 * dwarf2out.c (dwarf2out_finish): Do not attach a DIE on the limbo list to a NULL parent. -- Eric Botcazou
Index: dwarf2out.c =================================================================== --- dwarf2out.c (revision 172617) +++ dwarf2out.c (working copy) @@ -23559,7 +23559,7 @@ dwarf2out_finish (const char *filename) { dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin); - if (origin) + if (origin && origin->die_parent) add_child_die (origin->die_parent, die); else if (is_cu_die (die)) ;