mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
libgcc: aarch64: Add SME unwinder support
To support the ZA lazy save scheme, the PCS requires the unwinder to reset the SME state to PSTATE.SM=0, PSTATE.ZA=0, TPIDR2_EL0=0 on entry to an exception handler. We use the __arm_za_disable SME runtime call unconditionally to achieve this. https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#exceptions The hidden alias is used to avoid a PLT and avoid inconsistent VPCS marking (we don't rely on special PCS at the call site). In case of static linking the SME runtime init code is linked in code that raises exceptions. libgcc/ChangeLog: * config/aarch64/__arm_za_disable.S: Add hidden alias. * config/aarch64/aarch64-unwind.h: Reset the SME state before EH return via the _Unwind_Frames_Extra hook.
This commit is contained in:
parent
328c17af77
commit
91d68665b8
@ -63,3 +63,8 @@ ENTRY (__arm_za_disable)
|
||||
L(end):
|
||||
ret
|
||||
END (__arm_za_disable)
|
||||
|
||||
/* Hidden alias used by the unwinder. */
|
||||
.global __libgcc_arm_za_disable
|
||||
.hidden __libgcc_arm_za_disable
|
||||
.set __libgcc_arm_za_disable, __arm_za_disable
|
||||
|
@ -78,4 +78,20 @@ aarch64_demangle_return_addr (struct _Unwind_Context *context,
|
||||
return addr;
|
||||
}
|
||||
|
||||
/* SME runtime function local to libgcc, streaming compatible
|
||||
and preserves more registers than the base PCS requires, but
|
||||
we don't rely on that here. */
|
||||
__attribute__ ((visibility ("hidden")))
|
||||
void __libgcc_arm_za_disable (void);
|
||||
|
||||
/* Disable the SME ZA state in case an unwound frame used the ZA
|
||||
lazy saving scheme. */
|
||||
#undef _Unwind_Frames_Extra
|
||||
#define _Unwind_Frames_Extra(x) \
|
||||
do \
|
||||
{ \
|
||||
__libgcc_arm_za_disable (); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#endif /* defined AARCH64_UNWIND_H && defined __ILP32__ */
|
||||
|
Loading…
Reference in New Issue
Block a user