summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-12-03 16:39:56 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-12-03 16:39:56 +0000
commit88f2e16bb28fb750679c6c2b24e0ff3e0ab73f26 (patch)
tree1c54a346df5ae59f2f23d251a7bb9830f3367d17 /gcc
parent4f6cadc51f13c6da8748a5a2eff042d468661082 (diff)
downloadgcc-88f2e16bb28fb750679c6c2b24e0ff3e0ab73f26.tar.gz
PR debug/50317
* tree-ssa.c (target_for_debug_bind): Also allow is_gimple_reg_type vars that aren't referenced. (tree-ssa-live.c (remove_unused_locals): Don't clear TREE_ADDRESSABLE of unreferenced local vars. * cfgexpand.c (expand_debug_expr): For DEBUG_IMPLICIT_PTR allow also TREE_ADDRESSABLE vars that satisfy target_for_debug_bind. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181971 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/cfgexpand.c6
-rw-r--r--gcc/tree-ssa-live.c10
-rw-r--r--gcc/tree-ssa.c7
4 files changed, 21 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3b4bf139961..178e2224088 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2011-12-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/50317
+ * tree-ssa.c (target_for_debug_bind): Also allow is_gimple_reg_type
+ vars that aren't referenced.
+ (tree-ssa-live.c (remove_unused_locals): Don't clear TREE_ADDRESSABLE
+ of unreferenced local vars.
+ * cfgexpand.c (expand_debug_expr): For DEBUG_IMPLICIT_PTR allow also
+ TREE_ADDRESSABLE vars that satisfy target_for_debug_bind.
+
2011-12-03 Anatoly Sokolov <aesok@post.ru>
* config/arm/arm.h (LIBCALL_VALUE, FUNCTION_VALUE_REGNO_P): Remove.
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index e5a7a392eb4..15e8231ca72 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -3325,7 +3325,8 @@ expand_debug_expr (tree exp)
if ((TREE_CODE (TREE_OPERAND (exp, 0)) == VAR_DECL
|| TREE_CODE (TREE_OPERAND (exp, 0)) == PARM_DECL
|| TREE_CODE (TREE_OPERAND (exp, 0)) == RESULT_DECL)
- && !TREE_ADDRESSABLE (TREE_OPERAND (exp, 0)))
+ && (!TREE_ADDRESSABLE (TREE_OPERAND (exp, 0))
+ || target_for_debug_bind (TREE_OPERAND (exp, 0))))
return gen_rtx_DEBUG_IMPLICIT_PTR (mode, TREE_OPERAND (exp, 0));
if (handled_component_p (TREE_OPERAND (exp, 0)))
@@ -3337,7 +3338,8 @@ expand_debug_expr (tree exp)
if ((TREE_CODE (decl) == VAR_DECL
|| TREE_CODE (decl) == PARM_DECL
|| TREE_CODE (decl) == RESULT_DECL)
- && !TREE_ADDRESSABLE (decl)
+ && (!TREE_ADDRESSABLE (decl)
+ || target_for_debug_bind (decl))
&& (bitoffset % BITS_PER_UNIT) == 0
&& bitsize > 0
&& bitsize == maxsize)
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index 103e4f7155a..31eac11ba67 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -814,15 +814,7 @@ remove_unused_locals (void)
bitmap_set_bit (global_unused_vars, DECL_UID (var));
}
else
- {
- /* For unreferenced local vars drop TREE_ADDRESSABLE
- bit in case it is referenced from debug stmts. */
- if (DECL_CONTEXT (var) == current_function_decl
- && TREE_ADDRESSABLE (var)
- && is_gimple_reg_type (TREE_TYPE (var)))
- TREE_ADDRESSABLE (var) = 0;
- continue;
- }
+ continue;
}
else if (TREE_CODE (var) == VAR_DECL
&& DECL_HARD_REGISTER (var)
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 97857217ce7..8485af0a165 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -264,7 +264,12 @@ target_for_debug_bind (tree var)
return NULL_TREE;
if (!is_gimple_reg (var))
- return NULL_TREE;
+ {
+ if (is_gimple_reg_type (TREE_TYPE (var))
+ && referenced_var_lookup (cfun, DECL_UID (var)) == NULL_TREE)
+ return var;
+ return NULL_TREE;
+ }
return var;
}