From 94645a02dca8b5b103278ec48b4c7e0fe82ccfbf Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Oct 2012 21:25:58 +0200 Subject: [PATCH] tree-inline.c (expand_call_inline): Move VAR_DECLs with PARM_DECL origins from remapped DECL_INITIAL's BLOCK_VARS... * tree-inline.c (expand_call_inline): Move VAR_DECLs with PARM_DECL origins from remapped DECL_INITIAL's BLOCK_VARS into id->block's BLOCK_VARS. From-SVN: r192140 --- gcc/ChangeLog | 4 ++++ gcc/tree-inline.c | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 371a5fb70ac..8a7ac54a3ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2012-10-05 Jakub Jelinek + * tree-inline.c (expand_call_inline): Move VAR_DECLs with + PARM_DECL origins from remapped DECL_INITIAL's BLOCK_VARS + into id->block's BLOCK_VARS. + PR debug/54519 * ipa-split.c (split_function): Add debug args and debug source and normal stmts for args_to_skip which are diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 04f87a3e309..2c8071e8c99 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3952,7 +3952,29 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) initialize_inlined_parameters (id, stmt, fn, bb); if (DECL_INITIAL (fn)) - prepend_lexical_block (id->block, remap_blocks (DECL_INITIAL (fn), id)); + { + tree *var; + + prepend_lexical_block (id->block, remap_blocks (DECL_INITIAL (fn), id)); + gcc_checking_assert (BLOCK_SUBBLOCKS (id->block) + && (BLOCK_CHAIN (BLOCK_SUBBLOCKS (id->block)) + == NULL_TREE)); + /* Move vars for PARM_DECLs from DECL_INITIAL block to id->block, + otherwise for DWARF DW_TAG_formal_parameter will not be children of + DW_TAG_inlined_subroutine, but of a DW_TAG_lexical_block + under it. The parameters can be then evaluated in the debugger, + but don't show in backtraces. */ + for (var = &BLOCK_VARS (BLOCK_SUBBLOCKS (id->block)); *var; ) + if (TREE_CODE (DECL_ORIGIN (*var)) == PARM_DECL) + { + tree v = *var; + *var = TREE_CHAIN (v); + TREE_CHAIN (v) = BLOCK_VARS (id->block); + BLOCK_VARS (id->block) = v; + } + else + var = &TREE_CHAIN (*var); + } /* Return statements in the function body will be replaced by jumps to the RET_LABEL. */ -- 2.34.1