From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 0D54E3858404 for ; Mon, 22 Apr 2024 15:59:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0D54E3858404 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0D54E3858404 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713801551; cv=none; b=YcPaEsEPaHxPA7BPyJSaG4cNH/ekyAYN5RJCQpW7UgEDcHLrhR2RnmoM2sUnJW/CVfz2Ymsj4+JvfuIUpWVJi3t3sDV8rljdCfbnL6lUcscJylfQwg6cdmTezjvZKH3p0rJRS43a//GJn+Yc40uS3lWgRREOzG5JhE3vVh84hT0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713801551; c=relaxed/simple; bh=o8Rpy+w1eLl2Sifik4RnRHXoetFXUPRoLkpLRQfSLXk=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=bvIw6PoSBEqLkQmEPRz5cO+SYenBkFMHMCfu2KYBGlKnV77Gcr9JUO0mxJj3v0eIjugWyaitPAetaWHC7oJF9iePPoVNOHfde1jr519q9NH6YspwCQ9PVUkgtKi1ffH+/HUpB7N44VQz4bTeH/6dBuy1fR4HVzqonIE8Kmzfi74= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353727.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 43MFw37I014660; Mon, 22 Apr 2024 15:59:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=QK3dTAzYiyPKunNPDr3GpI43qMzb2ZsS+X7oTNJrmpo=; b=LmchunSekddpfbr2x8urrrHTpugk9v0ziZpHmBo7FIJHu7TR7NlUbglThupHh06qZ+cv yjoMqfLCKPdDZWACBwSILNkyR5Bpso1Byoom5LHSEVGaDpP7y4EXmTJHVAyx64D6g8ux 4GxJw+JNnx1juttYv2//H+F3eQJ8z+3qMHGUl/DWJsyuCevjjaNWDFBKgwKxd2dmzZ6P C+aE+NNSazXcV8ax5yzkcdMPmLaBXTXU3VtJKmj0Wz4pNEvtqPV8VaLuQdXeb8UhJdSq ygahEKGXMa+n1VsV18j7IkQoRNIpuSOyO5+9S/Ne7m6PBUBhLXHL8uzQ1zsLUdJv0vh6 Bw== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3xnu01g045-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 22 Apr 2024 15:59:06 +0000 Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 43MEKFF0015289; Mon, 22 Apr 2024 15:59:04 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3xmshm0dr2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 22 Apr 2024 15:59:04 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 43MFwxnl47186278 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 22 Apr 2024 15:59:01 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 179B120043; Mon, 22 Apr 2024 15:58:59 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EE9C220063; Mon, 22 Apr 2024 15:58:58 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 22 Apr 2024 15:58:58 +0000 (GMT) From: Jens Remus To: binutils@sourceware.org, Indu Bhagat Cc: Jens Remus , Andreas Krebbel Subject: [RFC PATCH 1/1] sframe: Represent FP without RA on stack Date: Mon, 22 Apr 2024 17:58:57 +0200 Message-Id: <20240422155857.2497684-2-jremus@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240422155857.2497684-1-jremus@linux.ibm.com> References: <20240422155857.2497684-1-jremus@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: H0lM2nzGSklEE_9TIhYI981DunSyEw58 X-Proofpoint-GUID: H0lM2nzGSklEE_9TIhYI981DunSyEw58 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-04-22_09,2024-04-22_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxscore=0 suspectscore=0 spamscore=0 malwarescore=0 bulkscore=0 clxscore=1015 priorityscore=1501 adultscore=0 lowpriorityscore=0 impostorscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2404010000 definitions=main-2404220067 X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP,URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: If an architecture uses both SFrame RA and FP tracking SFrame assumes that the RA offset is the 2nd offset and the FP offset is the 3rd offset following the SFrame FRE. An architecture does not need to store both on the stack. SFrame cannot represent a FP without RA on stack, since it cannot distinguish whether the 2nd offset is the RA or FP offset. Use an invalid SFrame FRE RA offset value of zero as dummy padding to represent the FP being saved on the stack when the RA is not saved on the stack. include/ * sframe.h (SFRAME_FRE_RA_OFFSET_INVALID): New macro defining the invalid RA offset value used to represent a dummy padding offset. gas/ * gen-sframe.c (get_fre_num_offsets): Accommodate for dummy padding RA offset if FP without RA on stack. (sframe_get_fre_offset_size): Likewise. (output_sframe_row_entry): Write a dummy padding RA offset if FP without RA needs to be represented. libsframe/ * sframe-dump.c (dump_sframe_func_with_fres): Treat invalid RA offsets as if they were undefined. Display them as "u*" to distinguish them. Signed-off-by: Jens Remus --- Notes (jremus): This patch eliminates 497 occurrences of the warning "skipping SFrame FDE due to FP without RA on stack" for a build of glibc on s390x. For libc.so this increases the number of FDEs by 166 and the number of FREs by 861, while adding 337 dummy padding RA offsets. With a total of 28157 offsets the dummy padding offsets account for ~1.20 % of the offsets. SFrame statistics without patch: VALUE TOTAL MIN MAX AVG FDEs: 3478 - - - FREs/FDE: 14441 1 15 4 Offsets/FDE: 28157 1 31 8 8-bit: 0 0 0 0 16-bit: 28157 1 31 8 32-bit: 0 0 0 0 Offsets/FRE: 28157 1 3 1 8-bit: - 0 0 0 16-bit: - 1 3 1 32-bit: - 0 0 0 SFrame statistics with patch applied: VALUE TOTAL MIN MAX AVG FDEs: 3644 - - - FREs/FDE: 15302 1 20 4 Offsets/FDE: 29944 1 38 8 8-bit: 0 0 0 0 16-bit: 29944 1 38 8 32-bit: 0 0 0 0 Offsets/FRE: 29944 1 3 1 8-bit: - 0 0 0 16-bit: - 1 3 1 32-bit: - 0 0 0 O_Padd/FDE: 337 - - 0 8-bit: 0 16-bit: 337 32-bit: 0 Note that on s390x the offsets are at minimum 16-bits in size, due to the mandatory CFA offset being at least 160. gas/gen-sframe.c | 50 +++++++++++++++++++---------------------- include/sframe.h | 9 ++++++-- libsframe/sframe-dump.c | 4 ++++ 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c index 4cc86eb6c815..990b08d87953 100644 --- a/gas/gen-sframe.c +++ b/gas/gen-sframe.c @@ -347,7 +347,9 @@ get_fre_num_offsets (struct sframe_row_entry *sframe_fre) fre_num_offsets++; #ifdef SFRAME_FRE_RA_TRACKING if (sframe_ra_tracking_p () - && sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_STACK) + && (sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_STACK + /* Accommodate for padding RA offset if FP without RA on stack. */ + || sframe_fre->bp_loc == SFRAME_FRE_ELEM_LOC_STACK)) fre_num_offsets++; #endif return fre_num_offsets; @@ -371,9 +373,14 @@ sframe_get_fre_offset_size (struct sframe_row_entry *sframe_fre) if (sframe_fre->bp_loc == SFRAME_FRE_ELEM_LOC_STACK) bp_offset_size = get_offset_size_in_bytes (sframe_fre->bp_offset); #ifdef SFRAME_FRE_RA_TRACKING - if (sframe_ra_tracking_p () - && sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_STACK) - ra_offset_size = get_offset_size_in_bytes (sframe_fre->ra_offset); + if (sframe_ra_tracking_p ()) + { + if (sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_STACK) + ra_offset_size = get_offset_size_in_bytes (sframe_fre->ra_offset); + /* Accommodate for padding RA offset if FP without RA on stack. */ + else if (sframe_fre->bp_loc == SFRAME_FRE_ELEM_LOC_STACK) + ra_offset_size = get_offset_size_in_bytes (SFRAME_FRE_RA_OFFSET_INVALID); + } #endif /* Get the maximum size needed to represent the offsets. */ @@ -537,11 +544,19 @@ output_sframe_row_entry (symbolS *fde_start_addr, fre_write_offsets++; #ifdef SFRAME_FRE_RA_TRACKING - if (sframe_ra_tracking_p () - && sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_STACK) + if (sframe_ra_tracking_p ()) { - fre_offset_func_map[idx].out_func (sframe_fre->ra_offset); - fre_write_offsets++; + if (sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_STACK) + { + fre_offset_func_map[idx].out_func (sframe_fre->ra_offset); + fre_write_offsets++; + } + /* Write padding RA offset if FP without RA on stack. */ + else if (sframe_fre->bp_loc == SFRAME_FRE_ELEM_LOC_STACK) + { + fre_offset_func_map[idx].out_func (SFRAME_FRE_RA_OFFSET_INVALID); + fre_write_offsets++; + } } #endif if (sframe_fre->bp_loc == SFRAME_FRE_ELEM_LOC_STACK) @@ -1497,25 +1512,6 @@ sframe_do_fde (struct sframe_xlate_ctx *xlate_ctx, = get_dw_fde_end_addrS (xlate_ctx->dw_fde); } -#ifdef SFRAME_FRE_RA_TRACKING - if (sframe_ra_tracking_p ()) - { - struct sframe_row_entry *fre; - - /* Iterate over the scratchpad FREs and validate them. */ - for (fre = xlate_ctx->first_fre; fre; fre = fre->next) - { - /* SFrame format cannot represent FP on stack without RA on stack. */ - if (fre->ra_loc != SFRAME_FRE_ELEM_LOC_STACK - && fre->bp_loc == SFRAME_FRE_ELEM_LOC_STACK) - { - as_warn (_("skipping SFrame FDE due to FP without RA on stack")); - return SFRAME_XLATE_ERR_NOTREPRESENTED; - } - } - } -#endif /* SFRAME_FRE_RA_TRACKING */ - return SFRAME_XLATE_OK; } diff --git a/include/sframe.h b/include/sframe.h index 90bc92a32f84..d1a26875b3e2 100644 --- a/include/sframe.h +++ b/include/sframe.h @@ -237,6 +237,9 @@ typedef struct sframe_func_desc_entry may or may not be tracked. */ #define SFRAME_FRE_FP_OFFSET_IDX 2 +/* Invalid RA offset. Used as padding to represent FP without RA on stack. */ +#define SFRAME_FRE_RA_OFFSET_INVALID 0 + typedef struct sframe_fre_info { /* Information about @@ -288,9 +291,11 @@ typedef struct sframe_fre_info offset1 (interpreted as CFA = BASE_REG + offset1) if RA is being tracked - offset2 (interpreted as RA = CFA + offset2) + offset2 (interpreted as RA = CFA + offset2; an offset value of + SFRAME_FRE_RA_OFFSET_INVALID indicates a dummy padding RA offset + to represent FP without RA saved on stack) if FP is being tracked - offset3 (intrepreted as FP = CFA + offset2) + offset3 (intrepreted as FP = CFA + offset3) fi else if FP is being tracked diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c index 40ea531314ba..3ea4bc327efd 100644 --- a/libsframe/sframe-dump.c +++ b/libsframe/sframe-dump.c @@ -199,6 +199,10 @@ dump_sframe_func_with_fres (sframe_decoder_ctx *sfd_ctx, if (sframe_decoder_get_fixed_ra_offset (sfd_ctx) != SFRAME_CFA_FIXED_RA_INVALID) strcpy (temp, "f"); + /* If an ABI does track RA offset, e.g. AArch64 and S390, it can be a + dummy as padding to represent FP without RA being saved on stack. */ + else if (err[2] == 0 && ra_offset == SFRAME_FRE_RA_OFFSET_INVALID) + sprintf (temp, "u*"); else if (err[2] == 0) { if (is_sframe_abi_arch_s390 (sfd_ctx) && (ra_offset & 1)) -- 2.40.1