This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix LTO bootstrap on i686-linux (problem with two Ldebug_info0 labels; PR bootstrap/48148)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>, Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 5 Apr 2011 16:19:39 +0200
- Subject: [PATCH] Fix LTO bootstrap on i686-linux (problem with two Ldebug_info0 labels; PR bootstrap/48148)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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 <jakub@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