On 6/21/2026 8:59 PM, Peter Bergner wrote:
On 6/21/26 11:58 AM, Jeffrey Law wrote:
On 6/19/2026 8:54 PM, Peter Bergner wrote:
RISC-V: GLIBC's setjmp preserves callee-saved registers [PR87466]

gcc/
        PR target/87466
        * config/riscv/riscv.cc (TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P):
        Define.
Obviously we can refine to include other libcs once someone chimes in on
their semantics.

My only worry would be cases where we have the ability to dynamically
select a different libc implementation.  Is that really a thing these
days?  I glibc vs musl, newlib vs pico, others?  Not sure where hte LLVM
libc projects fit in either.
I believe musl explicitly does not support ifunc and I don't think
newlib or picolibc support it either.  I downloaded musl, newlib and
picolibc and their riscv setjmp functions do save all non-volatile
registers, so it seems we probably don't need to worry about ifuncs
and we can probably enable TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P
for all riscv libcs.  I would go so far as saying any riscv libc that
doesn't save/restore all non-volatile regs is broken and should be fixed.

 From the old thread where I added the 
TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P
support, I think it was just the SPARC libcs that didn't save/restore the
non-volatile regs.  I think almost all other (all other?) libcs don't
push the non-volatile save/restore work onto the compilers and instead
implement that in the setjmp/longjmp routines themselves where it belongs.
I was thinking more along the lines of the changes which allow wholesale replacement of the library that went in for picolibc IIRC.  But I was mistaken, those changes allow adding bits after the C library, not wholesale replacement of the library.   So ISTM the only worry would be if setjmp was weak and could then be overridden by a routine in that additional library.  I don't think this is worth worrying about.

So the original patch is fine by me.

jeff

Reply via email to