Hi! i686-linux LTO bootstrap currently fails, because in one partition we emit .Ldebug_info0 label twice. The problem is that resolve_addr for call_site support attempts to force_decl_die external function decls, and at least with LTO that in turn can attempt to create new type DIEs, in this case an enumeration with context_die being NULL. Unfortunately the code to add proper parents to limbo nodes is done right before resolve_addr (and should be done there, so that resolve_addr reaches all the needed DIEs).
This patch fixes it by running over limbo_die_list nodes again if resolve_addr created any. LTO bootstrapped/regtested on i686-linux, ok for trunk? 2011-04-05 Jakub Jelinek <ja...@redhat.com> PR bootstrap/48148 * dwarf2out.c (add_parents_for_limbo_dies): New function. (dwarf2out_finish): Call it, and call it again if any new limbo_die_list nodes appeared after resolve_addr. --- gcc/dwarf2out.c.jj 2011-04-05 12:34:11.000000000 +0200 +++ gcc/dwarf2out.c 2011-04-05 13:34:04.628420737 +0200 @@ -23495,47 +23495,17 @@ optimize_location_lists (dw_die_ref die) htab_delete (htab); } -/* Output stuff that dwarf requires at the end of every file, - and generate the DWARF-2 debugging info. */ +/* Traverse the limbo die list, and add parent/child links. The only + dies without parents that should be here are concrete instances of + inline functions, and the comp_unit_die. We can ignore the comp_unit_die. + For concrete instances, we can get the parent die from the abstract + instance. */ static void -dwarf2out_finish (const char *filename) +add_parents_for_limbo_dies (void) { limbo_die_node *node, *next_node; - comdat_type_node *ctnode; - htab_t comdat_type_table; - unsigned int i; - - gen_scheduled_generic_parms_dies (); - gen_remaining_tmpl_value_param_die_attribute (); - /* Add the name for the main input file now. We delayed this from - dwarf2out_init to avoid complications with PCH. */ - add_name_attribute (comp_unit_die (), remap_debug_filename (filename)); - if (!IS_ABSOLUTE_PATH (filename)) - add_comp_dir_attribute (comp_unit_die ()); - else if (get_AT (comp_unit_die (), DW_AT_comp_dir) == NULL) - { - bool p = false; - htab_traverse (file_table, file_table_relative_p, &p); - if (p) - add_comp_dir_attribute (comp_unit_die ()); - } - - for (i = 0; i < VEC_length (deferred_locations, deferred_locations_list); i++) - { - add_location_or_const_value_attribute ( - VEC_index (deferred_locations, deferred_locations_list, i)->die, - VEC_index (deferred_locations, deferred_locations_list, i)->variable, - false, - DW_AT_location); - } - - /* Traverse the limbo die list, and add parent/child links. The only - dies without parents that should be here are concrete instances of - inline functions, and the comp_unit_die. We can ignore the comp_unit_die. - For concrete instances, we can get the parent die from the abstract - instance. */ for (node = limbo_die_list; node; node = next_node) { dw_die_ref die = node->die; @@ -23587,9 +23557,52 @@ dwarf2out_finish (const char *filename) } limbo_die_list = NULL; +} + +/* Output stuff that dwarf requires at the end of every file, + and generate the DWARF-2 debugging info. */ + +static void +dwarf2out_finish (const char *filename) +{ + limbo_die_node *node; + comdat_type_node *ctnode; + htab_t comdat_type_table; + unsigned int i; + + gen_scheduled_generic_parms_dies (); + gen_remaining_tmpl_value_param_die_attribute (); + + /* Add the name for the main input file now. We delayed this from + dwarf2out_init to avoid complications with PCH. */ + add_name_attribute (comp_unit_die (), remap_debug_filename (filename)); + if (!IS_ABSOLUTE_PATH (filename)) + add_comp_dir_attribute (comp_unit_die ()); + else if (get_AT (comp_unit_die (), DW_AT_comp_dir) == NULL) + { + bool p = false; + htab_traverse (file_table, file_table_relative_p, &p); + if (p) + add_comp_dir_attribute (comp_unit_die ()); + } + + for (i = 0; i < VEC_length (deferred_locations, deferred_locations_list); i++) + { + add_location_or_const_value_attribute ( + VEC_index (deferred_locations, deferred_locations_list, i)->die, + VEC_index (deferred_locations, deferred_locations_list, i)->variable, + false, + DW_AT_location); + } + + add_parents_for_limbo_dies (); resolve_addr (comp_unit_die ()); + /* resolve_addr might have created new DIEs. */ + if (limbo_die_list) + add_parents_for_limbo_dies (); + for (node = deferred_asm_name; node; node = node->next) { tree decl = node->created_for; Jakub