Problems with builtin setjmp receiver getting eliminated - Help
Andrew Hutchinson
andrewhutchinson@cox.net
Tue Mar 25 06:07:00 GMT 2008
With David Daney suggestion I referred to MIPS port. And it looks like I
figured a similar workaround in target.
builin-setjmp and friends , are seriously messed up. To make matters
worse, target overrides are not well structured and various optimization
stages rip out receiver code. My solution is thus very contrived - but
no more than MIPS.
I defined a copykat nonlocal_goto_receiver. I did not need it but its
presence is the only way to override a key part of the randomly
optimized builtin_setjmp_receiver code
As receivers now contains no real instructions , it no longer matters
if optimizers removes them or not (MIPS uses unspecs to keep code - but
I can't trust that to always work)
I then defined TARGET_BUILTIN_SETJMP_FRAME_VALUE - which allows
expand_builtin_setjmp_setup to store the unadjusted frame_pointer, which
can be fully restored in expand_builtin_longjmp - rather than the receiver.
Tada!
So that got the testcase working!
I still have to check all call saved registers are saved by function
doing setjmp - they appear not to be at higher optimization levels.
Either gcc is being smarter than me or there is still a problem.
Lastly, TWO receivers still being created - one is setjmp_receiver the
other is non_local_receiver. It's not my code, it happens on HEAD - I
have not figured out why.
Andy
David Daney wrote:
> Andrew Hutchinson wrote:
>
>> I have realised that part of the problem is that the receiver block
>> has no incoming edges so cfgcleanup removes it as unreachable block -
>> right?
>>
>> So any target that need a non trivial receiver for builtin_setjmp will
>> not work? That would mean any that have an offset between stack and
>> pointers?
>>
>> I guess the same problem exists for non-local goto?
>>
>> I am not convinced it could be this wrong. So please comment and
>> suggest solution - I'm sure I can write target handler but it seems so
>> wrong to leave this as issue open.
>>
>>
> MIPS uses an unspec_volatile in the nonloca_goto_receiver That keeps it
> from being removed.
>
> David Daney
>
>
More information about the Gcc-patches
mailing list