From 434eba35c00fe13a817a4f799e8b6b1fcb1f8065 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 4 Jan 2006 09:05:29 +0100 Subject: [PATCH] re PR debug/25562 (cannot debug VLA local) PR debug/25562 * function.c (instantiate_expr): New function. (instantiate_decls_1, instantiate_decls): If DECL_HAS_VALUE_EXPR_P, walk its DECL_VALUE_EXPR with instantiate_expr. * dwarf2out.c (loc_descriptor_from_tree_1): Don't add DW_OP_deref{,_size} if address isn't going to be added. From-SVN: r109315 --- gcc/ChangeLog | 10 ++++++++++ gcc/dwarf2out.c | 2 +- gcc/function.c | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 252537f605a..c4f8b626fe2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-01-04 Jakub Jelinek + + PR debug/25562 + * function.c (instantiate_expr): New function. + (instantiate_decls_1, instantiate_decls): If DECL_HAS_VALUE_EXPR_P, + walk its DECL_VALUE_EXPR with instantiate_expr. + + * dwarf2out.c (loc_descriptor_from_tree_1): Don't add + DW_OP_deref{,_size} if address isn't going to be added. + 2006-01-04 Ben Elliston * config/fp-bit.h: Use top-of-file comment from libgcc2.c. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 868333d46e0..572bfc9a5be 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -9420,7 +9420,7 @@ loc_descriptor_from_tree_1 (tree loc, int want_address) return 0; /* If we've got an address and don't want one, dereference. */ - if (!want_address && have_address) + if (!want_address && have_address && ret) { HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (loc)); diff --git a/gcc/function.c b/gcc/function.c index 0ece698f859..f5da84c8241 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1590,6 +1590,22 @@ instantiate_decl (rtx x) for_each_rtx (&XEXP (x, 0), instantiate_virtual_regs_in_rtx, NULL); } +/* Helper for instantiate_decls called via walk_tree: Process all decls + in the given DECL_VALUE_EXPR. */ + +static tree +instantiate_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) +{ + tree t = *tp; + if (! EXPR_P (t)) + { + *walk_subtrees = 0; + if (DECL_P (t) && DECL_RTL_SET_P (t)) + instantiate_decl (DECL_RTL (t)); + } + return NULL; +} + /* Subroutine of instantiate_decls: Process all decls in the given BLOCK node and all its subblocks. */ @@ -1599,8 +1615,15 @@ instantiate_decls_1 (tree let) tree t; for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t)) - if (DECL_RTL_SET_P (t)) - instantiate_decl (DECL_RTL (t)); + { + if (DECL_RTL_SET_P (t)) + instantiate_decl (DECL_RTL (t)); + if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t)) + { + tree v = DECL_VALUE_EXPR (t); + walk_tree (&v, instantiate_expr, NULL, NULL); + } + } /* Process all subblocks. */ for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t)) @@ -1620,6 +1643,11 @@ instantiate_decls (tree fndecl) { instantiate_decl (DECL_RTL (decl)); instantiate_decl (DECL_INCOMING_RTL (decl)); + if (DECL_HAS_VALUE_EXPR_P (decl)) + { + tree v = DECL_VALUE_EXPR (decl); + walk_tree (&v, instantiate_expr, NULL, NULL); + } } /* Now process all variables defined in the function or its subblocks. */