From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7850) id CA49B3858D37; Mon, 9 Jan 2023 17:59:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CA49B3858D37 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1673287163; bh=6RmqAxQnH9FFWHNy7Yun5pFP9JvUgwD8R9/Frzc7j+0=; h=From:To:Subject:Date:From; b=T/RxyXqhAAUtFRwPjF6o6XoxS+0ZkQjGpQTE4B3MxncivPmmgmD4acePxx5DqMPv3 3war+wRKRRRaXAAy9KB3Y2+yNKbRr/Eos2Pcjhr8M4tqPfVOq18e8Er9WAgiJudUv0 L9sRlH+uKo5BKglYDcgRWvStERu+inXjHOvtcE64= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Indu Bhagat To: bfd-cvs@sourceware.org, gdb-cvs@sourceware.org Subject: [binutils-gdb/binutils-2_40-branch] sframe: fix the defined SFRAME_FRE_TYPE_*_LIMIT constants X-Act-Checkin: binutils-gdb X-Git-Author: Indu Bhagat X-Git-Refname: refs/heads/binutils-2_40-branch X-Git-Oldrev: 2ffa66fc9f2a23119e799455f6f94ade8d710d3f X-Git-Newrev: b6250e0b724231e8456293c364b344aa6ffeea95 Message-Id: <20230109175923.CA49B3858D37@sourceware.org> Date: Mon, 9 Jan 2023 17:59:23 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Db6250e0b7242= 31e8456293c364b344aa6ffeea95 commit b6250e0b724231e8456293c364b344aa6ffeea95 Author: Indu Bhagat Date: Fri Jan 6 09:30:20 2023 -0800 sframe: fix the defined SFRAME_FRE_TYPE_*_LIMIT constants =20 An earlier commit 3f107464 defined the SFRAME_FRE_TYPE_*_LIMIT constants. These constants are used (by gas and libsframe) to pick an SFrame FRE type based on the function size. Those constants, however, were buggy, causing the generated SFrame sections to be bloated as SFRAME_FRE_TYPE_ADDR2/SFRAME_FRE_TYPE_ADDR4 got chosen more often than necessary. =20 gas/ * sframe-opt.c (sframe_estimate_size_before_relax): Use typecast. (sframe_convert_frag): Likewise. =20 libsframe/ * sframe.c (sframe_calc_fre_type): Use a more appropriate type for argument. Adjust the check for SFRAME_FRE_TYPE_ADDR4_LIMIT to keep it warning-free but meaningful. =20 include/ * sframe-api.h (sframe_calc_fre_type): Use a more appropriate type for the argument. * sframe.h (SFRAME_FRE_TYPE_ADDR1_LIMIT): Correct the constant. (SFRAME_FRE_TYPE_ADDR2_LIMIT): Likewise. (SFRAME_FRE_TYPE_ADDR4_LIMIT): Likewise. =20 (cherry picked from commit 725a19bfd142c845bf76ae28f6289972fd1cf5db) Diff: --- gas/sframe-opt.c | 12 ++++++------ include/sframe-api.h | 2 +- include/sframe.h | 9 ++++++--- libsframe/sframe.c | 6 ++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/gas/sframe-opt.c b/gas/sframe-opt.c index 01138f28deb..ec0509f8977 100644 --- a/gas/sframe-opt.c +++ b/gas/sframe-opt.c @@ -53,9 +53,9 @@ sframe_estimate_size_before_relax (fragS *frag) widthS =3D exp->X_op_symbol; width =3D resolve_symbol_value (widthS); =20 - if (width < SFRAME_FRE_TYPE_ADDR1_LIMIT) + if (width < (offsetT) SFRAME_FRE_TYPE_ADDR1_LIMIT) ret =3D 1; - else if (width < SFRAME_FRE_TYPE_ADDR2_LIMIT) + else if (width < (offsetT) SFRAME_FRE_TYPE_ADDR2_LIMIT) ret =3D 2; else ret =3D 4; @@ -123,9 +123,9 @@ sframe_convert_frag (fragS *frag) /* Calculate the applicable fre_type. */ fsizeS =3D exp->X_op_symbol; fsize =3D resolve_symbol_value (fsizeS); - if (fsize < SFRAME_FRE_TYPE_ADDR1_LIMIT) + if (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR1_LIMIT) fre_type =3D SFRAME_FRE_TYPE_ADDR1; - else if (fsize < SFRAME_FRE_TYPE_ADDR2_LIMIT) + else if (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR2_LIMIT) fre_type =3D SFRAME_FRE_TYPE_ADDR2; else fre_type =3D SFRAME_FRE_TYPE_ADDR4; @@ -150,11 +150,11 @@ sframe_convert_frag (fragS *frag) switch (frag->fr_subtype & 7) { case 1: - gas_assert (fsize < SFRAME_FRE_TYPE_ADDR1_LIMIT); + gas_assert (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR1_LIMIT); frag->fr_literal[frag->fr_fix] =3D diff; break; case 2: - gas_assert (fsize < SFRAME_FRE_TYPE_ADDR2_LIMIT); + gas_assert (fsize < (offsetT) SFRAME_FRE_TYPE_ADDR2_LIMIT); md_number_to_chars (frag->fr_literal + frag->fr_fix, diff, 2); break; case 4: diff --git a/include/sframe-api.h b/include/sframe-api.h index cdffc25d2cd..405e30c27e8 100644 --- a/include/sframe-api.h +++ b/include/sframe-api.h @@ -96,7 +96,7 @@ sframe_fde_create_func_info (unsigned int fre_type, unsig= ned int fde_type); /* Gather the FRE type given the function size. */ =20 extern unsigned int -sframe_calc_fre_type (unsigned int func_size); +sframe_calc_fre_type (size_t func_size); =20 /* The SFrame Decoder. */ =20 diff --git a/include/sframe.h b/include/sframe.h index 7e7840b605c..58ef07dcc21 100644 --- a/include/sframe.h +++ b/include/sframe.h @@ -304,7 +304,8 @@ typedef struct sframe_frame_row_entry_addr1 =20 /* Upper limit of start address in sframe_frame_row_entry_addr1 is 0x100 (not inclusive). */ -#define SFRAME_FRE_TYPE_ADDR1_LIMIT ((SFRAME_FRE_TYPE_ADDR1 + 1) * 8) +#define SFRAME_FRE_TYPE_ADDR1_LIMIT \ + (1ULL << ((SFRAME_FRE_TYPE_ADDR1 + 1) * 8)) =20 /* Used when SFRAME_FRE_TYPE_ADDR2 is specified as FRE type. */ typedef struct sframe_frame_row_entry_addr2 @@ -317,7 +318,8 @@ typedef struct sframe_frame_row_entry_addr2 =20 /* Upper limit of start address in sframe_frame_row_entry_addr2 is 0x10000 (not inclusive). */ -#define SFRAME_FRE_TYPE_ADDR2_LIMIT ((SFRAME_FRE_TYPE_ADDR2 * 2) * 8) +#define SFRAME_FRE_TYPE_ADDR2_LIMIT \ + (1ULL << ((SFRAME_FRE_TYPE_ADDR2 * 2) * 8)) =20 /* Used when SFRAME_FRE_TYPE_ADDR4 is specified as FRE type. */ typedef struct sframe_frame_row_entry_addr4 @@ -330,7 +332,8 @@ typedef struct sframe_frame_row_entry_addr4 =20 /* Upper limit of start address in sframe_frame_row_entry_addr2 is 0x100000000 (not inclusive). */ -#define SFRAME_FRE_TYPE_ADDR4_LIMIT ((SFRAME_FRE_TYPE_ADDR4 * 2) * 8) +#define SFRAME_FRE_TYPE_ADDR4_LIMIT \ + (1ULL << ((SFRAME_FRE_TYPE_ADDR4 * 2) * 8)) =20 #ifdef __cplusplus } diff --git a/libsframe/sframe.c b/libsframe/sframe.c index d206780289a..ea3169ba7aa 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -584,14 +584,16 @@ sframe_fde_create_func_info (unsigned int fre_type, /* FIXME API for linker. Revisit if its better placed somewhere else? */ =20 unsigned int -sframe_calc_fre_type (unsigned int func_size) +sframe_calc_fre_type (size_t func_size) { unsigned int fre_type =3D 0; if (func_size < SFRAME_FRE_TYPE_ADDR1_LIMIT) fre_type =3D SFRAME_FRE_TYPE_ADDR1; else if (func_size < SFRAME_FRE_TYPE_ADDR2_LIMIT) fre_type =3D SFRAME_FRE_TYPE_ADDR2; - else if (func_size < SFRAME_FRE_TYPE_ADDR4_LIMIT) + /* Adjust the check a bit so that it remains warning-free but meaningful + on 32-bit systems. */ + else if (func_size <=3D (size_t) (SFRAME_FRE_TYPE_ADDR4_LIMIT - 1)) fre_type =3D SFRAME_FRE_TYPE_ADDR4; return fre_type; }