diff options
Diffstat (limited to 'sysdeps/aarch64')
-rw-r--r-- | sysdeps/aarch64/machine-gmon.h | 3 | ||||
-rw-r--r-- | sysdeps/aarch64/sysdep.h | 11 |
2 files changed, 13 insertions, 1 deletions
diff --git a/sysdeps/aarch64/machine-gmon.h b/sysdeps/aarch64/machine-gmon.h index 730a23b781..a687298b1c 100644 --- a/sysdeps/aarch64/machine-gmon.h +++ b/sysdeps/aarch64/machine-gmon.h @@ -27,8 +27,9 @@ static void mcount_internal (u_long frompc, u_long selfpc); #define _MCOUNT_DECL(frompc, selfpc) \ static inline void mcount_internal (u_long frompc, u_long selfpc) +/* Note: strip_pac is needed for frompc because of gcc PR target/94791. */ #define MCOUNT \ void __mcount (void *frompc) \ { \ - mcount_internal ((u_long) frompc, (u_long) RETURN_ADDRESS (0)); \ + mcount_internal ((u_long) strip_pac (frompc), (u_long) RETURN_ADDRESS (0)); \ } diff --git a/sysdeps/aarch64/sysdep.h b/sysdeps/aarch64/sysdep.h index cd88023163..f442506952 100644 --- a/sysdeps/aarch64/sysdep.h +++ b/sysdeps/aarch64/sysdep.h @@ -35,6 +35,17 @@ #define PTR_SIZE (1<<PTR_LOG_SIZE) +#ifndef __ASSEMBLER__ +/* Strip pointer authentication code from pointer p. */ +static inline void * +strip_pac (void *p) +{ + register void *ra asm ("x30") = (p); + asm ("hint 7 // xpaclri" : "+r"(ra)); + return ra; +} +#endif + #ifdef __ASSEMBLER__ /* Syntactic details of assembler. */ |