Schrodinger ZHU Yifan
a1803ea063
[libc] implement sigsetjmp/siglongjmp for riscv (#137992)
See https://godbolt.org/z/jo7s6j7sq for compiled code.
```c++
#if __riscv_xlen == 64
#define STORE(A, B, C) "sd " #A ", %c[" #B "](" #C ")\n\t"
#define LOAD(A, B, C) "ld " #A ", %c[" #B "](" #C ")\n\t"
#elif __riscv_xlen == 32
#define STORE(A, B, C) "sw " #A ", %c[" #B "](" #C ")\n\t"
#define LOAD(A, B, C) "lw " #A ", %c[" #B "](" #C ")\n\t"
#else
#error "Unsupported RISC-V architecture"
#endif
namespace LIBC_NAMESPACE_DECL {
[[gnu::naked]]
LLVM_LIBC_FUNCTION(int, sigsetjmp, (sigjmp_buf, int)) {
// clang-format off
asm("beqz a1, .Lnosave\n\t"
STORE(ra, retaddr, a0)
STORE(s0, extra, a0)
"mv s0, a0\n\t"
"call %c[setjmp]\n\t"
"mv a1, a0\n\t"
"mv a0, s0\n\t"
LOAD(s0, extra, a0)
LOAD(ra, retaddr, a0)
"tail %c[epilogue]\n"
".Lnosave:\n\t"
"tail %c[setjmp]"
// clang-format on
::[retaddr] "i"(offsetof(__jmp_buf, sig_retaddr)),
[extra] "i"(offsetof(__jmp_buf, sig_extra)), [setjmp] "i"(setjmp),
[epilogue] "i"(sigsetjmp_epilogue)
: "a0", "a1", "s0");
}
```
2025-05-04 16:21:48 -04:00
..
2025-01-07 15:56:12 -08:00
2025-03-19 13:44:41 -04:00
2025-05-04 16:21:48 -04:00
2025-04-14 13:39:42 -07:00
2025-02-19 23:28:11 +08:00
2025-04-28 15:06:52 -04:00
2025-01-07 15:56:12 -08:00
2025-04-04 00:36:23 +08:00
2024-10-14 13:35:04 -04:00
2025-01-07 15:56:12 -08:00
2025-02-14 14:01:18 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-07-05 22:02:04 -07:00
2025-02-13 16:07:06 -08:00
2024-08-13 08:20:37 -07:00
2025-01-07 15:56:12 -08:00
2025-02-07 09:20:18 +08:00
2025-02-07 09:20:18 +08:00
2024-07-13 10:52:42 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2025-02-17 17:06:59 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2025-03-18 11:38:33 -07:00
2025-01-28 12:22:51 -08:00
2025-01-28 12:22:51 -08:00
2025-02-15 16:32:30 -08:00
2025-01-28 12:22:51 -08:00
2025-04-25 07:53:52 -04:00
2025-02-05 13:24:39 -08:00
2025-02-05 13:24:39 -08:00
2024-12-10 09:00:06 -08:00
2025-01-23 10:01:39 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-04-04 00:36:23 +08:00
2025-01-28 12:22:51 -08:00
2025-04-29 09:28:42 -04:00
2024-03-22 08:24:08 -07:00
2025-02-07 10:43:56 -08:00
2024-03-22 08:24:08 -07:00
2025-01-29 00:23:09 +08:00
2024-03-22 08:24:08 -07:00
2025-02-21 08:24:59 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-04-25 07:58:16 -04:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2025-02-15 16:32:30 -08:00
2025-01-28 12:22:51 -08:00
2025-04-04 00:36:23 +08:00
2025-01-28 12:22:51 -08:00
2025-01-28 12:22:51 -08:00
2024-03-22 08:24:08 -07:00
2025-03-12 10:49:04 +08:00
2025-03-06 16:25:14 -08:00
2025-03-06 16:25:14 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-03-22 08:24:08 -07:00
2025-01-07 15:56:12 -08:00
2024-08-13 16:02:43 -05:00
2025-02-21 10:50:32 -08:00
2024-08-13 16:02:43 -05:00
2025-01-07 15:56:12 -08:00
2025-02-28 11:43:33 -05:00
2025-03-14 20:15:24 -07:00
2024-03-22 08:24:08 -07:00
2025-02-19 14:26:18 -08:00
2025-01-28 12:22:51 -08:00
2025-01-23 13:33:04 -08:00