https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83368
--- Comment #11 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> > Again you're wrong, the call-saved registers are properly preserved if you
> > don't clobber the stack pointer, just write a small test or simply tweak
> > yours.
>
> Yes, I know that.
OK, at least something we agree on. :-)
> But GCC doesn't rely on that for *any other use* of the input and local
> registers; they are spilled to the stack and reloaded after the setjmp when
> needed.
No, that's also wrong, try:
int main(void)
{
register int i asm ("l0") = 1;
setjmp(jb);
printf("%d\n", i);
if (c < 10)
bar();
return 0;
}
main:
save %sp, -176, %sp
mov 1, %l0
sethi %hi(jb), %g1
or %g1, %lo(jb), %o0
call _setjmp, 0
nop
mov %l0, %g1
sra %g1, 0, %g1
mov %g1, %o1
sethi %hi(.LC0), %g1
or %g1, %lo(.LC0), %o0
call printf, 0
nop
GCC really expects all call-saved registers to be preserved.
> Also the fact that alloca clobbers the stack pointer
> is an implementation detail; for example, LLVM allocates all the space up
> front in the function prologue in this case, which means it would not run
> into this issue (and in fact it also spills its PIC base register).
This should also work with libc's alloca and it clobbers the stack pointer.