[libc] implement aarch64 sigsetjmp (#136706)
- **[libc][aarch64] implement sigsetjmp** On top of https://github.com/llvm/llvm-project/pull/136072 See also https://github.com/llvm/llvm-project/issues/137055 for remarks on naked attributes. ```c++ //===-- Implementation of setjmp ------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "src/setjmp/sigsetjmp.h" #include "hdr/offsetof_macros.h" #include "src/__support/common.h" #include "src/__support/macros/config.h" #include "src/setjmp/setjmp_impl.h" #include "src/setjmp/sigsetjmp_epilogue.h" namespace LIBC_NAMESPACE_DECL { [[gnu::naked]] LLVM_LIBC_FUNCTION(int, sigsetjmp, (sigjmp_buf, int)) { asm(R"( cbz w1, %c[setjmp] str x30, [x0, %c[retaddr]] str x19, [x0, %c[extra]] mov x19, x0 bl %c[setjmp] mov w1, w0 mov x0, x19 ldr x30, [x0, %c[retaddr]] ldr x19, [x0, %c[extra]] b %c[epilogue])" ::[retaddr] "i"(offsetof(__jmp_buf, sig_retaddr)), [extra] "i"(offsetof(__jmp_buf, sig_extra)), [setjmp] "i"(setjmp), [epilogue] "i"(sigsetjmp_epilogue) : "x0", "x1", "x19", "x30"); } } // namespace LIBC_NAMESPACE_DECL ```
This commit is contained in:
parent
1a6b0413e0
commit
9ebaa9d483
@ -933,6 +933,8 @@ if(LLVM_LIBC_FULL_BUILD)
|
||||
# setjmp.h entrypoints
|
||||
libc.src.setjmp.longjmp
|
||||
libc.src.setjmp.setjmp
|
||||
libc.src.setjmp.siglongjmp
|
||||
libc.src.setjmp.sigsetjmp
|
||||
|
||||
# stdio.h entrypoints
|
||||
libc.src.stdio.clearerr
|
||||
|
@ -12,7 +12,7 @@
|
||||
// TODO: implement sigjmp_buf related functions for other architectures
|
||||
// Issue: https://github.com/llvm/llvm-project/issues/136358
|
||||
#if defined(__linux__)
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)
|
||||
#define __LIBC_HAS_SIGJMP_BUF
|
||||
#endif
|
||||
#endif
|
||||
|
@ -26,3 +26,17 @@ add_entrypoint_object(
|
||||
libc.hdr.types.jmp_buf
|
||||
${setjmp_config_options}
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
sigsetjmp
|
||||
SRCS
|
||||
sigsetjmp.cpp
|
||||
HDRS
|
||||
../sigsetjmp.h
|
||||
DEPENDS
|
||||
libc.hdr.types.jmp_buf
|
||||
libc.hdr.types.sigset_t
|
||||
libc.hdr.offsetof_macros
|
||||
libc.src.setjmp.sigsetjmp_epilogue
|
||||
libc.src.setjmp.setjmp
|
||||
)
|
||||
|
36
libc/src/setjmp/aarch64/sigsetjmp.cpp
Normal file
36
libc/src/setjmp/aarch64/sigsetjmp.cpp
Normal file
@ -0,0 +1,36 @@
|
||||
//===-- Implementation of sigsetjmp ---------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/setjmp/sigsetjmp.h"
|
||||
#include "hdr/offsetof_macros.h"
|
||||
#include "src/__support/common.h"
|
||||
#include "src/__support/macros/config.h"
|
||||
#include "src/setjmp/setjmp_impl.h"
|
||||
#include "src/setjmp/sigsetjmp_epilogue.h"
|
||||
|
||||
namespace LIBC_NAMESPACE_DECL {
|
||||
[[gnu::naked]]
|
||||
LLVM_LIBC_FUNCTION(int, sigsetjmp, (sigjmp_buf, int)) {
|
||||
asm(R"(
|
||||
cbz w1, %c[setjmp]
|
||||
|
||||
str x30, [x0, %c[retaddr]]
|
||||
str x19, [x0, %c[extra]]
|
||||
mov x19, x0
|
||||
bl %c[setjmp]
|
||||
|
||||
mov w1, w0
|
||||
mov x0, x19
|
||||
ldr x30, [x0, %c[retaddr]]
|
||||
ldr x19, [x0, %c[extra]]
|
||||
b %c[epilogue])" ::[retaddr] "i"(offsetof(__jmp_buf, sig_retaddr)),
|
||||
[extra] "i"(offsetof(__jmp_buf, sig_extra)), [setjmp] "i"(setjmp),
|
||||
[epilogue] "i"(sigsetjmp_epilogue)
|
||||
: "x0", "x1", "x19", "x30");
|
||||
}
|
||||
} // namespace LIBC_NAMESPACE_DECL
|
Loading…
x
Reference in New Issue
Block a user