summaryrefslogtreecommitdiff
path: root/sysdeps/aarch64
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/aarch64')
-rw-r--r--sysdeps/aarch64/machine-gmon.h3
-rw-r--r--sysdeps/aarch64/sysdep.h11
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. */