tree-inline.c (expand_call_inline): Move VAR_DECLs with PARM_DECL origins from remapp...
authorJakub Jelinek <jakub@redhat.com>
Fri, 5 Oct 2012 19:25:58 +0000 (21:25 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 5 Oct 2012 19:25:58 +0000 (21:25 +0200)
* 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
gcc/tree-inline.c

index 371a5fb70ac7b817688e4cd6755bf76056628879..8a7ac54a3ec450502a6e1fda08d121266320ee58 100644 (file)
@@ -1,5 +1,9 @@
 2012-10-05  Jakub Jelinek  <jakub@redhat.com>
 
+       * 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
index 04f87a3e309863ce3cd8c99737de0d986487b31c..2c8071e8c99d6766703b4985a4558eb45c85a350 100644 (file)
@@ -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.  */