diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-01-04 09:05:29 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-01-04 09:05:29 +0100 |
commit | 434eba35c00fe13a817a4f799e8b6b1fcb1f8065 (patch) | |
tree | b1683e1d380b9d2469d81bb04642c70217286a89 /gcc | |
parent | 9c3b204ab89bdf9fa42fc0e8b8f3c710f03d35a4 (diff) | |
download | gcc-434eba35c00fe13a817a4f799e8b6b1fcb1f8065.zip gcc-434eba35c00fe13a817a4f799e8b6b1fcb1f8065.tar.gz gcc-434eba35c00fe13a817a4f799e8b6b1fcb1f8065.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 2 | ||||
-rw-r--r-- | gcc/function.c | 32 |
3 files changed, 41 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 252537f..c4f8b62 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-01-04 Jakub Jelinek <jakub@redhat.com> + + 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 <bje@au.ibm.com> * config/fp-bit.h: Use top-of-file comment from libgcc2.c. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 868333d..572bfc9 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 0ece698..f5da84c 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. */ |