aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2004-04-28 15:13:42 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2004-04-28 15:13:42 +0000
commit40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d (patch)
tree2a79bb82f6bc6c61a5e280fc09264feb49d2c1dd
parentf0e6f845917627613b387adc83e915fafedadb30 (diff)
downloadgcc-40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d.zip
gcc-40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d.tar.gz
gcc-40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d.tar.bz2
* dwarf2out.c (mem_loc_descriptor): Handle shifts.
From-SVN: r81252
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/dwarf2out.c23
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e750885..69cafbb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2004-04-28 Paul Brook <paul@codesourcery.com>
+
+ * dwarf2out.c (mem_loc_descriptor): Handle shifts.
+
2004-04-28 Ulrich Weigand <uweigand@de.ibm.com>
* gcse.c (find_moveable_store): Do not accept store insns with
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 83c6821..7f234ee 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -8435,6 +8435,7 @@ static dw_loc_descr_ref
mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
{
dw_loc_descr_ref mem_loc_result = NULL;
+ enum dwarf_location_atom op;
/* Note that for a dynamically sized array, the location we will generate a
description of here will be the lowest numbered location which is
@@ -8576,10 +8577,26 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
}
break;
+ /* If a pseudo-reg is optimized away, it is possible for it to
+ be replaced with a MEM containing a multiply or shift. */
case MULT:
+ op = DW_OP_mul;
+ goto do_binop;
+
+ case ASHIFT:
+ op = DW_OP_shl;
+ goto do_binop;
+
+ case ASHIFTRT:
+ op = DW_OP_shra;
+ goto do_binop;
+
+ case LSHIFTRT:
+ op = DW_OP_shr;
+ goto do_binop;
+
+ do_binop:
{
- /* If a pseudo-reg is optimized away, it is possible for it to
- be replaced with a MEM containing a multiply. */
dw_loc_descr_ref op0 = mem_loc_descriptor (XEXP (rtl, 0), mode,
can_use_fbreg);
dw_loc_descr_ref op1 = mem_loc_descriptor (XEXP (rtl, 1), mode,
@@ -8590,7 +8607,7 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, bool can_use_fbreg)
mem_loc_result = op0;
add_loc_descr (&mem_loc_result, op1);
- add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0));
+ add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
break;
}