Commit f79c81b9 by Alexandre Oliva Committed by Alexandre Oliva

Reset inlined debug variables at the end of the inlined function

for  gcc/ChangeLog

	PR debug/58315
	* tree-inline.c (reset_debug_binding): New.
	(reset_debug_bindings): Likewise.
	(expand_call_inline): Call it.

From-SVN: r224261
parent 04fb9539
2015-06-09 Alexandre Oliva <aoliva@redhat.com>
PR debug/58315
* tree-inline.c (reset_debug_binding): New.
(reset_debug_bindings): Likewise.
(expand_call_inline): Call it.
2015-06-08 Jan Hubicka <hubicka@ucw.cz>
* tree.c (gimple_canonical_types_compatible_p): Drop comparsion of
......
......@@ -4335,6 +4335,60 @@ add_local_variables (struct function *callee, struct function *caller,
}
}
/* Add to BINDINGS a debug stmt resetting SRCVAR if inlining might
have brought in or introduced any debug stmts for SRCVAR. */
static inline void
reset_debug_binding (copy_body_data *id, tree srcvar, gimple_seq *bindings)
{
tree *remappedvarp = id->decl_map->get (srcvar);
if (!remappedvarp)
return;
if (TREE_CODE (*remappedvarp) != VAR_DECL)
return;
if (*remappedvarp == id->retvar || *remappedvarp == id->retbnd)
return;
tree tvar = target_for_debug_bind (*remappedvarp);
if (!tvar)
return;
gdebug *stmt = gimple_build_debug_bind (tvar, NULL_TREE,
id->call_stmt);
gimple_seq_add_stmt (bindings, stmt);
}
/* For each inlined variable for which we may have debug bind stmts,
add before GSI a final debug stmt resetting it, marking the end of
its life, so that var-tracking knows it doesn't have to compute
further locations for it. */
static inline void
reset_debug_bindings (copy_body_data *id, gimple_stmt_iterator gsi)
{
tree var;
unsigned ix;
gimple_seq bindings = NULL;
if (!gimple_in_ssa_p (id->src_cfun))
return;
if (!opt_for_fn (id->dst_fn, flag_var_tracking_assignments))
return;
for (var = DECL_ARGUMENTS (id->src_fn);
var; var = DECL_CHAIN (var))
reset_debug_binding (id, var, &bindings);
FOR_EACH_LOCAL_DECL (id->src_cfun, ix, var)
reset_debug_binding (id, var, &bindings);
gsi_insert_seq_before_without_update (&gsi, bindings, GSI_SAME_STMT);
}
/* If STMT is a GIMPLE_CALL, replace it with its inline expansion. */
static bool
......@@ -4648,6 +4702,8 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
GCOV_COMPUTE_SCALE (cg_edge->frequency, CGRAPH_FREQ_BASE),
bb, return_block, NULL);
reset_debug_bindings (id, stmt_gsi);
/* Reset the escaped solution. */
if (cfun->gimple_df)
pt_solution_reset (&cfun->gimple_df->escaped);
......
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