This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] MIPS: Fix unwinding through signal frames on -EB o32.


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]