This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] MIPS: Fix unwinding through signal frames on -EB o32.
- From: Richard Sandiford <rsandifo at nildram dot co dot uk>
- To: David Daney <ddaney at avtrex dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 17 Oct 2007 23:13:44 +0100
- Subject: Re: [PATCH] MIPS: Fix unwinding through signal frames on -EB o32.
- References: <47163FEB.9000606@avtrex.com>
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.
Richard