diff options
-rw-r--r-- | sysdeps/aarch64/Makefile | 3 | ||||
-rw-r--r-- | sysdeps/aarch64/__mcount.S (renamed from sysdeps/aarch64/mcount.c) | 20 | ||||
-rw-r--r-- | sysdeps/aarch64/machine-gmon.h | 12 |
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 |