diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-03-26 21:54:43 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-03-26 21:54:43 +0100 |
commit | e80691a0d79f8245f4bf08c4173b0f127404f2d0 (patch) | |
tree | cd698261470944727b0a0ac8e1ecb90cbb4452e6 | |
parent | 89245ef27b0846d47bceab52811ec6e529caa272 (diff) | |
download | gcc-e80691a0d79f8245f4bf08c4173b0f127404f2d0.zip gcc-e80691a0d79f8245f4bf08c4173b0f127404f2d0.tar.gz gcc-e80691a0d79f8245f4bf08c4173b0f127404f2d0.tar.bz2 |
var-tracking.c (emit_note_insn_var_location): For one part notes with offset 0, don't add EXPR_LIST around the location.
* var-tracking.c (emit_note_insn_var_location): For one part
notes with offset 0, don't add EXPR_LIST around the location.
* dwarf2out.c (loc_descriptor, dw_loc_list_1,
add_location_or_const_value_attribute): Adjust for that change.
From-SVN: r157763
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 16 | ||||
-rw-r--r-- | gcc/var-tracking.c | 8 |
3 files changed, 21 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 528a299..85cd6c7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2010-03-26 Jakub Jelinek <jakub@redhat.com> + * var-tracking.c (emit_note_insn_var_location): For one part + notes with offset 0, don't add EXPR_LIST around the location. + * dwarf2out.c (loc_descriptor, dw_loc_list_1, + add_location_or_const_value_attribute): Adjust for that change. + PR debug/43540 * dwarf2out.c (reg_save): For DW_CFA_expression put regnum into first operand and location into second. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index bd75de9..a3de759 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -13731,10 +13731,12 @@ loc_descriptor (rtx rtl, enum machine_mode mode, case VAR_LOCATION: /* Single part. */ - if (GET_CODE (XEXP (rtl, 1)) != PARALLEL) + if (GET_CODE (PAT_VAR_LOCATION_LOC (rtl)) != PARALLEL) { - loc_result = loc_descriptor (XEXP (XEXP (rtl, 1), 0), mode, - initialized); + rtx loc = PAT_VAR_LOCATION_LOC (rtl); + if (GET_CODE (loc) == EXPR_LIST) + loc = XEXP (loc, 0); + loc_result = loc_descriptor (loc, mode, initialized); break; } @@ -13986,9 +13988,11 @@ dw_loc_list_1 (tree loc, rtx varloc, int want_address, { gcc_assert (GET_CODE (varloc) == VAR_LOCATION); /* Single part. */ - if (GET_CODE (XEXP (varloc, 1)) != PARALLEL) + if (GET_CODE (PAT_VAR_LOCATION_LOC (varloc)) != PARALLEL) { - varloc = XEXP (XEXP (varloc, 1), 0); + varloc = PAT_VAR_LOCATION_LOC (varloc); + if (GET_CODE (varloc) == EXPR_LIST) + varloc = XEXP (varloc, 0); mode = GET_MODE (varloc); if (MEM_P (varloc)) { @@ -15891,7 +15895,7 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, node = loc_list->first; rtl = NOTE_VAR_LOCATION_LOC (node->var_loc_note); - if (GET_CODE (rtl) != PARALLEL) + if (GET_CODE (rtl) == EXPR_LIST) rtl = XEXP (rtl, 0); if ((CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING) && add_const_value_attribute (die, rtl)) diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index cec6c34..d1ecc86 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -7099,8 +7099,12 @@ emit_note_insn_var_location (void **varp, void *data) (int) initialized); else if (n_var_parts == 1) { - rtx expr_list - = gen_rtx_EXPR_LIST (VOIDmode, loc[0], GEN_INT (offsets[0])); + rtx expr_list; + + if (offsets[0] || GET_CODE (loc[0]) == PARALLEL) + expr_list = gen_rtx_EXPR_LIST (VOIDmode, loc[0], GEN_INT (offsets[0])); + else + expr_list = loc[0]; note_vl = gen_rtx_VAR_LOCATION (VOIDmode, decl, expr_list, (int) initialized); |