diff options
author | Schrodinger ZHU Yifan <yifanzhu@rochester.edu> | 2025-05-04 16:21:48 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-04 16:21:48 -0400 |
commit | a1803ea063c06c005ba50053f0e2cdb8f852871f (patch) | |
tree | 98eb96590b10a21f60060f4aa29e07ec3cd6b66a /clang/unittests/Tooling/CompilationDatabaseTest.cpp | |
parent | c51a3aa6ceb63a58ab7658ea999c65b818da6b1d (diff) | |
download | llvm-a1803ea063c06c005ba50053f0e2cdb8f852871f.zip llvm-a1803ea063c06c005ba50053f0e2cdb8f852871f.tar.gz llvm-a1803ea063c06c005ba50053f0e2cdb8f852871f.tar.bz2 |
[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");
}
```
Diffstat (limited to 'clang/unittests/Tooling/CompilationDatabaseTest.cpp')
0 files changed, 0 insertions, 0 deletions