Commit 26140130 by Jan Hubicka Committed by Jan Hubicka

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
parent 593b6421
2009-02-27 Jan Hubicka <jh@suse.cz> 2009-02-27 Jan Hubicka <jh@suse.cz>
PR debug/39267 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
* tree.h (TREE_PROTECTED): Fix comment. * tree.h (TREE_PROTECTED): Fix comment.
(BLOCK_HANDLER_BLOCK): Remove. (BLOCK_HANDLER_BLOCK): Remove.
(struct tree_block): Remove handler_block add body_block. (struct tree_block): Remove handler_block add body_block.
......
...@@ -413,7 +413,6 @@ enum availability cgraph_variable_initializer_availability (struct varpool_node ...@@ -413,7 +413,6 @@ enum availability cgraph_variable_initializer_availability (struct varpool_node
bool varpool_assemble_pending_decls (void); bool varpool_assemble_pending_decls (void);
bool varpool_assemble_decl (struct varpool_node *node); bool varpool_assemble_decl (struct varpool_node *node);
bool varpool_analyze_pending_decls (void); bool varpool_analyze_pending_decls (void);
void varpool_output_debug_info (void);
void varpool_remove_unreferenced_decls (void); void varpool_remove_unreferenced_decls (void);
void varpool_empty_needed_queue (void); void varpool_empty_needed_queue (void);
......
...@@ -1313,7 +1313,6 @@ cgraph_optimize (void) ...@@ -1313,7 +1313,6 @@ cgraph_optimize (void)
varpool_assemble_pending_decls (); varpool_assemble_pending_decls ();
} }
varpool_output_debug_info ();
cgraph_process_new_functions (); cgraph_process_new_functions ();
cgraph_state = CGRAPH_STATE_FINISHED; cgraph_state = CGRAPH_STATE_FINISHED;
......
...@@ -3405,6 +3405,17 @@ typedef const struct die_struct *const_dw_die_ref; ...@@ -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_descr_struct *dw_loc_descr_ref;
typedef struct dw_loc_list_struct *dw_loc_list_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 /* Each DIE may have a series of attribute/value pairs. Values
can take on several forms. The forms that are used in this can take on several forms. The forms that are used in this
implementation are listed below. */ implementation are listed below. */
...@@ -11858,6 +11869,17 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, ...@@ -11858,6 +11869,17 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl,
tree_add_const_value_attribute (die, 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 /* Helper function for tree_add_const_value_attribute. Natively encode
initializer INIT into an array. Return true if successful. */ initializer INIT into an array. Return true if successful. */
...@@ -14054,7 +14076,11 @@ gen_variable_die (tree decl, dw_die_ref context_die) ...@@ -14054,7 +14076,11 @@ gen_variable_die (tree decl, dw_die_ref context_die)
if (! declaration && ! DECL_ABSTRACT (decl)) 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); add_pubname (decl, var_die);
} }
else else
...@@ -14934,16 +14960,6 @@ decls_for_scope (tree stmt, dw_die_ref context_die, int depth) ...@@ -14934,16 +14960,6 @@ decls_for_scope (tree stmt, dw_die_ref context_die, int depth)
if (die != NULL && die->die_parent == NULL) if (die != NULL && die->die_parent == NULL)
add_child_die (context_die, die); 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) else if (TREE_CODE (decl) == IMPORTED_DECL)
dwarf2out_imported_module_or_decl_1 (decl, DECL_NAME (decl), dwarf2out_imported_module_or_decl_1 (decl, DECL_NAME (decl),
stmt, context_die); stmt, context_die);
...@@ -16443,6 +16459,7 @@ dwarf2out_finish (const char *filename) ...@@ -16443,6 +16459,7 @@ dwarf2out_finish (const char *filename)
{ {
limbo_die_node *node, *next_node; limbo_die_node *node, *next_node;
dw_die_ref die = 0; dw_die_ref die = 0;
unsigned int i;
/* Add the name for the main input file now. We delayed this from /* Add the name for the main input file now. We delayed this from
dwarf2out_init to avoid complications with PCH. */ dwarf2out_init to avoid complications with PCH. */
...@@ -16457,6 +16474,14 @@ dwarf2out_finish (const char *filename) ...@@ -16457,6 +16474,14 @@ dwarf2out_finish (const char *filename)
add_comp_dir_attribute (comp_unit_die); 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 /* Traverse the limbo die list, and add parent/child links. The only
dies without parents that should be here are concrete instances of 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. inline functions, and the comp_unit_die. We can ignore the comp_unit_die.
......
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> 2009-02-26 H.J. Lu <hongjiu.lu@intel.com>
PR c++/37789 PR c++/37789
......
/* { dg-do compile } */
/* { dg-options "-O2 -gdwarf-2" } */
void
main(void)
{
static int unused_local_var;
}
/* { dg-final { scan-assembler "unused_local_var" } } */
...@@ -456,29 +456,6 @@ varpool_empty_needed_queue (void) ...@@ -456,29 +456,6 @@ varpool_empty_needed_queue (void)
varpool_last_needed_node = NULL; 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. */ /* Create a new global variable of type TYPE. */
tree tree
add_new_static_var (tree type) add_new_static_var (tree type)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment