aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/aarch64/Makefile3
-rw-r--r--sysdeps/aarch64/__mcount.S (renamed from sysdeps/aarch64/mcount.c)20
-rw-r--r--sysdeps/aarch64/machine-gmon.h12
3 files changed, 23 insertions, 12 deletions
diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile
index 141d7d9cc2..bac84c6144 100644
--- a/sysdeps/aarch64/Makefile
+++ b/sysdeps/aarch64/Makefile
@@ -54,6 +54,9 @@ gen-as-const-headers += \
endif
ifeq ($(subdir),gmon)
+sysdep_routines += \
+ __mcount \
+ # sysdep_routines
CFLAGS-mcount.c += -mgeneral-regs-only
endif
diff --git a/sysdeps/aarch64/mcount.c b/sysdeps/aarch64/__mcount.S
index 1651ab9c8f..9688c41459 100644
--- a/sysdeps/aarch64/mcount.c
+++ b/sysdeps/aarch64/__mcount.S
@@ -1,5 +1,5 @@
-/* Copyright (C) 2013-2024 Free Software Foundation, Inc.
-
+/* AArch64 definitions for profiling support.
+ Copyright (C) 2024 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -16,9 +16,23 @@
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
+#include <sysdep.h>
#include <shlib-compat.h>
-#include <gmon/mcount.c>
+ENTRY (__mcount)
+ stp x29, x30, [sp, -16]!
+ /* Note: xpaclri is needed for frompc because of gcc PR target/94791. */
+ hint 7
+ mov x1, x30
+ /* Load the caller return address as frompc. */
+ ldr x0, [x29, #8]
+ mov x30, x0
+ mov x0, x30
+ /* Use the return address as selfpc. */
+ mov x0, x30
+ ldp x29, x30, [sp], 16
+ b __mcount_internal
+END (__mcount)
/* We forgot to add _mcount in glibc 2.17. We added it in 2.18
therefore we want it to be added with version GLIBC_2_18. However,
diff --git a/sysdeps/aarch64/machine-gmon.h b/sysdeps/aarch64/machine-gmon.h
index 6890b9912b..a703f5ca4d 100644
--- a/sysdeps/aarch64/machine-gmon.h
+++ b/sysdeps/aarch64/machine-gmon.h
@@ -22,14 +22,8 @@
#include <sysdep.h>
-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)
+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) strip_pac (frompc), (u_long) RETURN_ADDRESS (0)); \
-}
+/* Implemented by __mcount.S. */
+#define MCOUNT