diff options
author | Paul Brook <paul@codesourcery.com> | 2004-04-28 15:13:42 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-04-28 15:13:42 +0000 |
commit | 40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d (patch) | |
tree | 2a79bb82f6bc6c61a5e280fc09264feb49d2c1dd | |
parent | f0e6f845917627613b387adc83e915fafedadb30 (diff) | |
download | gcc-40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d.zip gcc-40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d.tar.gz gcc-40f0b3eeabef5a34aa121237a6ce4bcdbd91a64d.tar.bz2 |
* dwarf2out.c (mem_loc_descriptor): Handle shifts.
From-SVN: r81252
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 23 |
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; } |