diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-12-18 23:16:24 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-12-18 23:16:24 +0100 |
commit | a49de7a463519e8e3c7e903caef9e78604fd637d (patch) | |
tree | 9d8f68bcec113d5a41ce201bffd8fc2d69889feb /gcc/ipa-split.c | |
parent | ca2c1b328327f998338cfa4b9e902e439cf57278 (diff) | |
download | gcc-a49de7a463519e8e3c7e903caef9e78604fd637d.zip gcc-a49de7a463519e8e3c7e903caef9e78604fd637d.tar.gz gcc-a49de7a463519e8e3c7e903caef9e78604fd637d.tar.bz2 |
re PR debug/68860 (FAIL: gcc.dg/guality/pr36728-1.c -flto -O3 -g line 17 arg1 == 1)
PR debug/68860
* ipa-split.c (split_function): Only perform caller side
modifications for decl_debug_args here.
* cgraph.c: Include gimplify.h.
(cgraph_edge::redirect_call_stmt_to_callee): Add caller side
debug stmts for decl_debug_args. Spelling fix in a comment.
* tree-inline.c (tree_function_versioning): Populate decl_debug_args
for args_to_skip arguments and add callee side debug stmts.
Formatting fixes. Avoid shadowing i variable.
* gcc.dg/guality/pr68860-1.c: New test.
* gcc.dg/guality/pr68860-2.c: New test.
From-SVN: r231840
Diffstat (limited to 'gcc/ipa-split.c')
-rw-r--r-- | gcc/ipa-split.c | 94 |
1 files changed, 29 insertions, 65 deletions
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index f77ab52..ca82e3a 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -1209,7 +1209,6 @@ split_function (basic_block return_bb, struct split_point *split_point, gimple *last_stmt = NULL; unsigned int i; tree arg, ddef; - vec<tree, va_gc> **debug_args = NULL; if (dump_file) { @@ -1432,73 +1431,38 @@ split_function (basic_block return_bb, struct split_point *split_point, vector to say for debug info that if parameter parm had been passed, it would have value parm_Y(D). */ if (args_to_skip) - for (parm = DECL_ARGUMENTS (current_function_decl), num = 0; - parm; parm = DECL_CHAIN (parm), num++) - if (bitmap_bit_p (args_to_skip, num) - && is_gimple_reg (parm)) - { - tree ddecl; - gimple *def_temp; - - /* This needs to be done even without MAY_HAVE_DEBUG_STMTS, - otherwise if it didn't exist before, we'd end up with - different SSA_NAME_VERSIONs between -g and -g0. */ - arg = get_or_create_ssa_default_def (cfun, parm); - if (!MAY_HAVE_DEBUG_STMTS) - continue; - - if (debug_args == NULL) - debug_args = decl_debug_args_insert (node->decl); - ddecl = make_node (DEBUG_EXPR_DECL); - DECL_ARTIFICIAL (ddecl) = 1; - TREE_TYPE (ddecl) = TREE_TYPE (parm); - DECL_MODE (ddecl) = DECL_MODE (parm); - vec_safe_push (*debug_args, DECL_ORIGIN (parm)); - vec_safe_push (*debug_args, ddecl); - def_temp = gimple_build_debug_bind (ddecl, unshare_expr (arg), - call); - gsi_insert_after (&gsi, def_temp, GSI_NEW_STMT); - } - /* And on the callee side, add - DEBUG D#Y s=> parm - DEBUG var => D#Y - stmts to the first bb where var is a VAR_DECL created for the - optimized away parameter in DECL_INITIAL block. This hints - in the debug info that var (whole DECL_ORIGIN is the parm PARM_DECL) - is optimized away, but could be looked up at the call site - as value of D#X there. */ - if (debug_args != NULL) { - unsigned int i; - tree var, vexpr; - gimple_stmt_iterator cgsi; - gimple *def_temp; - - push_cfun (DECL_STRUCT_FUNCTION (node->decl)); - var = BLOCK_VARS (DECL_INITIAL (node->decl)); - i = vec_safe_length (*debug_args); - cgsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun))); - do + vec<tree, va_gc> **debug_args = NULL; + unsigned i = 0, len = 0; + if (MAY_HAVE_DEBUG_STMTS) { - i -= 2; - while (var != NULL_TREE - && DECL_ABSTRACT_ORIGIN (var) != (**debug_args)[i]) - var = TREE_CHAIN (var); - if (var == NULL_TREE) - break; - vexpr = make_node (DEBUG_EXPR_DECL); - parm = (**debug_args)[i]; - DECL_ARTIFICIAL (vexpr) = 1; - TREE_TYPE (vexpr) = TREE_TYPE (parm); - DECL_MODE (vexpr) = DECL_MODE (parm); - def_temp = gimple_build_debug_source_bind (vexpr, parm, - NULL); - gsi_insert_before (&cgsi, def_temp, GSI_SAME_STMT); - def_temp = gimple_build_debug_bind (var, vexpr, NULL); - gsi_insert_before (&cgsi, def_temp, GSI_SAME_STMT); + debug_args = decl_debug_args_lookup (node->decl); + if (debug_args) + len = vec_safe_length (*debug_args); } - while (i); - pop_cfun (); + for (parm = DECL_ARGUMENTS (current_function_decl), num = 0; + parm; parm = DECL_CHAIN (parm), num++) + if (bitmap_bit_p (args_to_skip, num) && is_gimple_reg (parm)) + { + tree ddecl; + gimple *def_temp; + + /* This needs to be done even without MAY_HAVE_DEBUG_STMTS, + otherwise if it didn't exist before, we'd end up with + different SSA_NAME_VERSIONs between -g and -g0. */ + arg = get_or_create_ssa_default_def (cfun, parm); + if (!MAY_HAVE_DEBUG_STMTS || debug_args == NULL) + continue; + + while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm)) + i += 2; + if (i >= len) + continue; + ddecl = (**debug_args)[i + 1]; + def_temp + = gimple_build_debug_bind (ddecl, unshare_expr (arg), call); + gsi_insert_after (&gsi, def_temp, GSI_NEW_STMT); + } } /* We avoid address being taken on any variable used by split part, |