From 80adf8399949f1890632e572d756ebf81bea94a6 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 31 Jan 2024 17:26:59 +0000 Subject: aarch64: Fix gmon profiling with clang Different than gcc, clang does not pass the LR value as the first argument. To avoid requiring change clang generated code (since same ABI is used on other OS, like FreeBSD), use a similar strategy as x86_64 to obtain both the frompc and the selfpc from the stack frame. Checked on aarch64-linux-gnu. --- sysdeps/aarch64/Makefile | 3 +++ sysdeps/aarch64/__mcount.S | 47 ++++++++++++++++++++++++++++++++++++++++++ sysdeps/aarch64/machine-gmon.h | 12 +++-------- sysdeps/aarch64/mcount.c | 33 ----------------------------- 4 files changed, 53 insertions(+), 42 deletions(-) create mode 100644 sysdeps/aarch64/__mcount.S delete mode 100644 sysdeps/aarch64/mcount.c 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.S b/sysdeps/aarch64/__mcount.S new file mode 100644 index 0000000000..9688c41459 --- /dev/null +++ b/sysdeps/aarch64/__mcount.S @@ -0,0 +1,47 @@ +/* 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +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, + setting the version is not straight forward because a generic + Version file includes an earlier 2.xx version for each this symbol + and the linker uses the first version it sees. */ + +#if SHLIB_COMPAT (libc, GLIBC_2_17, GLIBC_2_18) +versioned_symbol (libc, __mcount, _mcount, GLIBC_2_18); +#else +strong_alias (__mcount, _mcount); +#endif 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 -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 diff --git a/sysdeps/aarch64/mcount.c b/sysdeps/aarch64/mcount.c deleted file mode 100644 index 1651ab9c8f..0000000000 --- a/sysdeps/aarch64/mcount.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2013-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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include - -#include - -/* 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, - setting the version is not straight forward because a generic - Version file includes an earlier 2.xx version for each this symbol - and the linker uses the first version it sees. */ - -#if SHLIB_COMPAT (libc, GLIBC_2_17, GLIBC_2_18) -versioned_symbol (libc, __mcount, _mcount, GLIBC_2_18); -#else -strong_alias (__mcount, _mcount); -#endif -- cgit v1.2.3