https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83368

--- Comment #8 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> You already have code in sched-deps.c to deal with setjmp potentially not
> saving registers it should across all architectures:
> 
>       if (find_reg_note (insn, REG_SETJMP, NULL))
>         {
>           /* This is setjmp.  Assume that all registers, not just
>              hard registers, may be clobbered by this call.  */
>           reg_pending_barrier = MOVE_BARRIER;
>         }

GCC expects all call-saved registers to be preserved by setjmp/longjmp though
and I think that's what is implemented in glibc for other architectures.

> Why is it so hard to fix this bug? It's a very simple problem that only
> affects %l7; all it needs is for it to be spilled and reloaded.

Because it's a call-saved register.

> This is breaking real-world code that works on every other architecture I have
> tried it on, and telling people to use non-portable built-in functions isn't 
> going to necessarily be well-received.

Then you need to convince someone to fix glibc and make setjmp/longjmp preserve
call-saved registers even if the stack pointer is subsequently clobbered.  Or
maybe just the PIC register, but I think it's only the tip of the iceberg.

Reply via email to