+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
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. */
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. */
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
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);
{
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. */
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.
+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
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)