David Daney <ddaney@avtrex.com> writes:
When I previously changed the mips_fallback_frame_state to return an
adjusted $pc value, I overlooked the big-endian o32 case. For this case
(and only this case), we were adding 4 to $pc and also adding 4 to the
cfa resulting in a total adjustment of 8. This was causing the libjava
Array_3 test to fail as the reported $pc had been moved outside of the
catch block resulting in the exception being caught at the wrong place.
Ah, thanks, is that why that test was failing? I hadn't got around
to it yet...
The fix is to base the $pc calculation on the unadjusted cfa value and
use a new (possibly adjusted) variable 'reg_base' as the base for the
rest of the registers.
Well, going back to the review of the original endian-correction patch:
http://gcc.gnu.org/ml/gcc-patches/2005-02/msg00230.html
your experience seems to suggest even more strongly that it would be
best not to adjust "new_cfa" at all, and simply add a separate offset
to the register accesses. I.e.: set reg_offset to 0 or 4, and add
"reg_offset" to:
(_Unwind_Ptr)&(sc->sc_regs[i]) - new_cfa
I think that's equivalent to what you're doing, so the patch is
preapproved with that change, if it works.