From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1791) id B23F6385841C; Fri, 9 Feb 2024 17:39:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B23F6385841C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1707500367; bh=UcKprap/ZmnWt6BdPX7n0Ie8hsdEYHXRnmO0agudy1c=; h=From:To:Subject:Date:From; b=Zho3apKR6w3pKZih0DayiC5xMJxT1+3SUQ9yXlC1zwl0R/bWjGELs6vb+ItTEtSGL JBgiI9MqGnfSfhzC3Fl6YiXSqljEBmrJQuGR8xiJiAvZn4rEOdbNitYovGxoU4PFPW lLvlQFwqkPCN4JLW6RMmEtI+Dj5VYGCa81kCU9BU= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Adhemerval Zanella To: glibc-cvs@sourceware.org Subject: [glibc/azanella/clang] aarch64: Fix gmon profiling with clang X-Act-Checkin: glibc X-Git-Author: Adhemerval Zanella X-Git-Refname: refs/heads/azanella/clang X-Git-Oldrev: 102f6424791ee49c9600898dc9312ba278a7f8c5 X-Git-Newrev: 80adf8399949f1890632e572d756ebf81bea94a6 Message-Id: <20240209173927.B23F6385841C@sourceware.org> Date: Fri, 9 Feb 2024 17:39:27 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=80adf8399949f1890632e572d756ebf81bea94a6 commit 80adf8399949f1890632e572d756ebf81bea94a6 Author: Adhemerval Zanella Date: Wed Jan 31 17:26:59 2024 +0000 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. Diff: --- sysdeps/aarch64/Makefile | 3 +++ sysdeps/aarch64/{mcount.c => __mcount.S} | 20 +++++++++++++++++--- 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 similarity index 72% rename from sysdeps/aarch64/mcount.c rename to 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 . */ +#include #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, 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