From f8cca67b9c954eca6540832ad88c6ddeb30cbaeb Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 3 Dec 2011 17:39:56 +0100 Subject: [PATCH] re PR debug/50317 (missing DW_OP_GNU_implicit_pointer) 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. From-SVN: r181971 --- gcc/ChangeLog | 10 ++++++++++ gcc/cfgexpand.c | 6 ++++-- gcc/tree-ssa-live.c | 10 +--------- gcc/tree-ssa.c | 7 ++++++- 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 + + 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 * 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; } -- 2.30.2