re PR debug/39267 (gdb testsuite regressions)

PR debug/39267
	* cgraph.h (varpool_output_debug_info): Remove.
	* cgraphunit.c (varpool_output_debug_info): Remove.
	* dwarf2out.c (deferred_locations_struct): New struct
	(deferred_locations): New type.
	(deferred_locations_list): New static var.
	(deffer_location): New function.
	(gen_variable_die): Use it.
	(decls_for_scope): Output info on local static vars.
	(dwarf2out_finish): Process deferred locations.
	* varpool.c (varpool_output_debug_info): Remove.

From-SVN: r144496
This commit is contained in:
Jan Hubicka 2009-02-28 22:34:23 +01:00 committed by Jan Hubicka
parent 593b6421cd
commit 261401301f
7 changed files with 72 additions and 36 deletions

View File

@ -1,3 +1,17 @@
2009-02-27 Jan Hubicka <jh@suse.cz>
PR debug/39267
* cgraph.h (varpool_output_debug_info): Remove.
* cgraphunit.c (varpool_output_debug_info): Remove.
* dwarf2out.c (deferred_locations_struct): New struct
(deferred_locations): New type.
(deferred_locations_list): New static var.
(deffer_location): New function.
(gen_variable_die): Use it.
(decls_for_scope): Output info on local static vars.
(dwarf2out_finish): Process deferred locations.
* varpool.c (varpool_output_debug_info): Remove.
2009-02-27 Jan Hubicka <jh@suse.cz>
PR debug/39267

View File

@ -413,7 +413,6 @@ enum availability cgraph_variable_initializer_availability (struct varpool_node
bool varpool_assemble_pending_decls (void);
bool varpool_assemble_decl (struct varpool_node *node);
bool varpool_analyze_pending_decls (void);
void varpool_output_debug_info (void);
void varpool_remove_unreferenced_decls (void);
void varpool_empty_needed_queue (void);

View File

@ -1313,7 +1313,6 @@ cgraph_optimize (void)
varpool_assemble_pending_decls ();
}
varpool_output_debug_info ();
cgraph_process_new_functions ();
cgraph_state = CGRAPH_STATE_FINISHED;

View File

@ -3405,6 +3405,17 @@ typedef const struct die_struct *const_dw_die_ref;
typedef struct dw_loc_descr_struct *dw_loc_descr_ref;
typedef struct dw_loc_list_struct *dw_loc_list_ref;
typedef struct deferred_locations_struct GTY(())
{
tree variable;
dw_die_ref die;
} deferred_locations;
DEF_VEC_O(deferred_locations);
DEF_VEC_ALLOC_O(deferred_locations,gc);
static GTY(()) VEC(deferred_locations, gc) *deferred_locations_list;
/* Each DIE may have a series of attribute/value pairs. Values
can take on several forms. The forms that are used in this
implementation are listed below. */
@ -11858,6 +11869,17 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl,
tree_add_const_value_attribute (die, decl);
}
/* Add VARIABLE and DIE into deferred locations list. */
static void
defer_location (tree variable, dw_die_ref die)
{
deferred_locations entry;
entry.variable = variable;
entry.die = die;
VEC_safe_push (deferred_locations, gc, deferred_locations_list, &entry);
}
/* Helper function for tree_add_const_value_attribute. Natively encode
initializer INIT into an array. Return true if successful. */
@ -14054,7 +14076,11 @@ gen_variable_die (tree decl, dw_die_ref context_die)
if (! declaration && ! DECL_ABSTRACT (decl))
{
add_location_or_const_value_attribute (var_die, decl, DW_AT_location);
if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
&& !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
defer_location (decl, var_die);
else
add_location_or_const_value_attribute (var_die, decl, DW_AT_location);
add_pubname (decl, var_die);
}
else
@ -14934,16 +14960,6 @@ decls_for_scope (tree stmt, dw_die_ref context_die, int depth)
if (die != NULL && die->die_parent == NULL)
add_child_die (context_die, die);
/* Do not produce debug information for static variables since
these might be optimized out. We are called for these later
in varpool_analyze_pending_decls.
But *do* produce it for Fortran COMMON variables because,
even though they are static, their names can differ depending
on the scope, which we need to preserve. */
if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
&& !(is_fortran () && TREE_PUBLIC (decl)))
;
else if (TREE_CODE (decl) == IMPORTED_DECL)
dwarf2out_imported_module_or_decl_1 (decl, DECL_NAME (decl),
stmt, context_die);
@ -16443,6 +16459,7 @@ dwarf2out_finish (const char *filename)
{
limbo_die_node *node, *next_node;
dw_die_ref die = 0;
unsigned int i;
/* Add the name for the main input file now. We delayed this from
dwarf2out_init to avoid complications with PCH. */
@ -16457,6 +16474,14 @@ dwarf2out_finish (const char *filename)
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,
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.

View File

@ -1,3 +1,17 @@
2009-02-26 Jan Hubicka <jh@suse.cz>
PR debug/39267
* cgraph.h (varpool_output_debug_info): Remove.
* cgraphunit.c (varpool_output_debug_info): Remove.
* dwarf2out.c (deferred_locations_struct): New struct
(deferred_locations): New type.
(deferred_locations_list): New static var.
(deffer_location): New function.
(gen_variable_die): Use it.
(decls_for_scope): Output info on local static vars.
(dwarf2out_finish): Process deferred locations.
* varpool.c (varpool_output_debug_info): Remove.
2009-02-26 H.J. Lu <hongjiu.lu@intel.com>
PR c++/37789

View File

@ -0,0 +1,8 @@
/* { dg-do compile } */
/* { dg-options "-O2 -gdwarf-2" } */
void
main(void)
{
static int unused_local_var;
}
/* { dg-final { scan-assembler "unused_local_var" } } */

View File

@ -456,29 +456,6 @@ varpool_empty_needed_queue (void)
varpool_last_needed_node = NULL;
}
/* Output all variables enqueued to be assembled. */
void
varpool_output_debug_info (void)
{
timevar_push (TV_SYMOUT);
if (errorcount == 0 && sorrycount == 0)
while (varpool_assembled_nodes_queue)
{
struct varpool_node *node = varpool_assembled_nodes_queue;
/* Local static variables are never seen by check_global_declarations
so we need to output debug info by hand. */
if (DECL_CONTEXT (node->decl)
&& (TREE_CODE (DECL_CONTEXT (node->decl)) == BLOCK
|| TREE_CODE (DECL_CONTEXT (node->decl)) == FUNCTION_DECL)
&& errorcount == 0 && sorrycount == 0)
(*debug_hooks->global_decl) (node->decl);
varpool_assembled_nodes_queue = node->next_needed;
node->next_needed = 0;
}
timevar_pop (TV_SYMOUT);
}
/* Create a new global variable of type TYPE. */
tree
add_new_static_var (tree type)