[PATCH 2/5] include: gas: sframe: fix terminology from offset to data word
Indu Bhagat
indu.bhagat@oracle.com
Fri Jan 23 10:47:03 GMT 2026
On 1/22/26 2:35 AM, Jens Remus wrote:
> On 1/20/2026 11:28 AM, Indu Bhagat wrote:
>> In SFrame V3, with the addition of flexible FDE type means that the
>> variable-length data trailing the SFrame FRE header is no longer
>> exclusively composed of offsets. This data can now include unsigned
>> control data or signed offset data. Consequently, using the term
>> "offsets" to describe this trailing data is inaccurate and can be
>> confusing.
>>
>> This patch updates the terminology to 'Data Word' across the assembler
>> and the SFrame header file. Note that, the term 'Word' is used
>> colloquially here, the actual size (1, 2, or 4 bytes) remains determined
>> by the applicable bits in the FRE info byte.
>>
>> gas/
>> * gen-sframe.c: Rename SFrame FRE 'offset' to 'data word'.
>> include/
>> * sframe.h (SFRAME_FRE_DATAWORD_1B, SFRAME_FRE_DATAWORD_2B,
>> SFRAME_FRE_DATAWORD_4B): New constants.
>> (struct sframe_fre_info): Update bitfield documentation.
>> (SFRAME_V3_FRE_DATAWORD_COUNT): New macro.
>> (SFRAME_V1_FRE_DATAWORD_SIZE): New macro.
>
> Nice!
>
>> ---
>> gas/gen-sframe.c | 263 +++++++++++++++++++++++------------------------
>> include/sframe.h | 29 +++++-
>> 2 files changed, 155 insertions(+), 137 deletions(-)
>>
>> diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
>> index 5aae1adcb48..b7332e86fe7 100644
>> --- a/gas/gen-sframe.c
>> +++ b/gas/gen-sframe.c
>> @@ -159,8 +159,8 @@ sframe_fre_get_cfa_offset (const struct sframe_row_entry * fre)
>> }
>>
>> /* All stack offsets in SFrame stack trace format must be representable as a
>> - 1-byte (SFRAME_FRE_OFFSET_1B), 2-byte (SFRAME_FRE_OFFSET_2B) or 4-byte
>> - (SFRAME_FRE_OFFSET_4B) value.
>> + 1-byte (SFRAME_FRE_DATAWORD_1B), 2-byte (SFRAME_FRE_DATAWORD_2B) or 4-byte
>> + (SFRAME_FRE_DATAWORD_4B) value.
>>
>> At the moment, sanity check on CFA offset (only) is performed to address PR
>> gas/33277. Arguably, such updates to ra_offset or fp_offset will only
>> @@ -240,37 +240,38 @@ get_udata_size_in_bytes (unsigned int value)
>>
>> return size;
>> }
>> -#define SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_1B 0 /* SFRAME_FRE_OFFSET_1B. */
>> -#define SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_2B 1 /* SFRAME_FRE_OFFSET_2B. */
>> -#define SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_4B 2 /* SFRAME_FRE_OFFSET_4B. */
>> -#define SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_8B 3 /* Not supported in SFrame. */
>> -#define SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_MAX SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_8B
>> +#define SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_1B 0 /* SFRAME_FRE_DATAWORD_1B. */
>> +#define SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_2B 1 /* SFRAME_FRE_DATAWORD_2B. */
>> +#define SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_4B 2 /* SFRAME_FRE_DATAWORD_4B. */
>> +#define SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_8B 3 /* Not supported in SFrame. */
>> +#define SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_MAX \
>> + SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_8B
>>
>> -/* Helper struct for mapping offset size to output functions. */
>> +/* Helper struct for mapping FRE data word size to output functions. */
>>
>> -struct sframe_fre_offset_func_map
>> +struct sframe_fre_dataword_func_map
>> {
>> - unsigned int offset_size;
>> + unsigned int dataword_size;
>> void (*out_func)(int);
>> };
>>
>> /* Given an OFFSET_SIZE, return the size in bytes needed to represent it. */
>>
>> static unsigned int
>> -sframe_fre_offset_func_map_index (unsigned int offset_size)
>> +sframe_fre_dataword_func_map_index (unsigned int dataword_size)
>> {
>> - unsigned int idx = SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_MAX;
>> + unsigned int idx = SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_MAX;
>>
>> - switch (offset_size)
>> + switch (dataword_size)
>> {
>> - case SFRAME_FRE_OFFSET_1B:
>> - idx = SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_1B;
>> + case SFRAME_FRE_DATAWORD_1B:
>> + idx = SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_1B;
>> break;
>> - case SFRAME_FRE_OFFSET_2B:
>> - idx = SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_2B;
>> + case SFRAME_FRE_DATAWORD_2B:
>> + idx = SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_2B;
>> break;
>> - case SFRAME_FRE_OFFSET_4B:
>> - idx = SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_4B;
>> + case SFRAME_FRE_DATAWORD_4B:
>> + idx = SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_4B;
>> break;
>> default:
>> /* Not supported in SFrame. */
>> @@ -280,15 +281,15 @@ sframe_fre_offset_func_map_index (unsigned int offset_size)
>> return idx;
>> }
>>
>> -/* Mapping from offset size to the output function to emit the value. */
>> +/* Mapping from data word size to the output function to emit the value. */
>>
>> static const
>> -struct sframe_fre_offset_func_map
>> -fre_offset_func_map[SFRAME_FRE_OFFSET_FUNC_MAP_INDEX_MAX+1] =
>> +struct sframe_fre_dataword_func_map
>> +dataword_func_map[SFRAME_FRE_DATAWORD_FUNC_MAP_INDEX_MAX+1] =
>> {
>> - { SFRAME_FRE_OFFSET_1B, out_one },
>> - { SFRAME_FRE_OFFSET_2B, out_two },
>> - { SFRAME_FRE_OFFSET_4B, out_four },
>> + { SFRAME_FRE_DATAWORD_1B, out_one },
>> + { SFRAME_FRE_DATAWORD_2B, out_two },
>> + { SFRAME_FRE_DATAWORD_4B, out_four },
>> { -1, NULL } /* Not Supported in SFrame. */
>> };
>>
>> @@ -299,11 +300,11 @@ static struct sframe_version_ops sframe_ver_ops;
>> /* SFrame (SFRAME_VERSION_1) set FRE info. */
>>
>> static unsigned char
>> -sframe_v1_set_fre_info (unsigned int cfa_base_reg, unsigned int num_offsets,
>> - unsigned int offset_size, bool mangled_ra_p)
>> +sframe_v1_set_fre_info (unsigned int cfa_base_reg, unsigned int dataword_count,
>> + unsigned int dataword_size, bool mangled_ra_p)
>> {
>> unsigned char fre_info;
>> - fre_info = SFRAME_V1_FRE_INFO (cfa_base_reg, num_offsets, offset_size);
>> + fre_info = SFRAME_V1_FRE_INFO (cfa_base_reg, dataword_count, dataword_size);
>> fre_info = SFRAME_V1_FRE_INFO_UPDATE_MANGLED_RA_P (mangled_ra_p, fre_info);
>> return fre_info;
>> }
>> @@ -340,11 +341,11 @@ sframe_set_version (enum gen_sframe_version flag_ver)
>> /* SFrame set FRE info. */
>>
>> static unsigned char
>> -sframe_set_fre_info (unsigned int cfa_base_reg, unsigned int num_offsets,
>> - unsigned int offset_size, bool mangled_ra_p)
>> +sframe_set_fre_info (unsigned int cfa_base_reg, unsigned int dataword_count,
>> + unsigned int dataword_size, bool mangled_ra_p)
>> {
>> - return sframe_ver_ops.set_fre_info (cfa_base_reg, num_offsets,
>> - offset_size, mangled_ra_p);
>> + return sframe_ver_ops.set_fre_info (cfa_base_reg, dataword_count,
>> + dataword_size, mangled_ra_p);
>> }
>>
>> /* SFrame set func info. */
>> @@ -385,57 +386,56 @@ get_fre_base_reg_id (const struct sframe_row_entry *sframe_fre)
>> return fre_base_reg;
>> }
>>
>> -/* Get number of offsets necessary for the SFrame Frame Row Entry. */
>> +/* Get number of data words necessary for the SFrame Frame Row Entry. */
>>
>> static unsigned int
>> -get_fre_num_offsets (const struct sframe_row_entry *sframe_fre,
>> - bool flex_p)
>> +get_fre_dataword_count (const struct sframe_row_entry *sframe_fre, bool flex_p)
>> {
>> /* For SFRAME_FDE_TYPE_FLEX FDE type, each entity (CFA, FP, RA) may carry up
>> - to two offsets. */
>> + to two data words. */
>> unsigned int count = flex_p ? 2 : 1;
>>
>> - /* CFA offset (or offsets when flex_p) must always be present. */
>> - unsigned int fre_num_offsets = count;
>> + /* CFA data word (or data words when flex_p) must always be present. */
>> + unsigned int fre_dataword_count = count;
>>
>> - /* For flexible frames encoding, there will be two offsets for RA (if RA is
>> - being tracked). 1 padding offset otherwise. */
>> + /* For flexible FDE type, there will be two data words for RA (if RA
>> + has a recovery rule applicable). 1 padding data word otherwise. */
>> if (flex_p)
>> {
>> if (sframe_fre->ra_loc != SFRAME_FRE_ELEM_LOC_NONE)
>> - fre_num_offsets += count;
>> + fre_dataword_count += count;
>> else if (sframe_fre->fp_loc != SFRAME_FRE_ELEM_LOC_NONE)
>> - fre_num_offsets += 1;
>> + fre_dataword_count += 1;
>> }
>> else if (sframe_ra_tracking_p ()
>> && (sframe_fre->ra_loc != SFRAME_FRE_ELEM_LOC_NONE
>> - /* For s390x account padding RA offset, if FP without RA
>> + /* For s390x account padding RA data word, if FP without RA
>> saved. */
>> || (sframe_get_abi_arch () == SFRAME_ABI_S390X_ENDIAN_BIG
>> && sframe_fre->fp_loc != SFRAME_FRE_ELEM_LOC_NONE)))
>> - fre_num_offsets++;
>> + fre_dataword_count++;
>>
>> if (sframe_fre->fp_loc != SFRAME_FRE_ELEM_LOC_NONE)
>> - fre_num_offsets += count;
>> + fre_dataword_count += count;
>>
>> - return fre_num_offsets;
>> + return fre_dataword_count;
>> }
>>
>> -/* Get the minimum necessary offset size (in bytes) for this
>> +/* Get the minimum necessary data word size (in bytes) for this
>> SFrame frame row entry. */
>>
>> static unsigned int
>> -sframe_get_fre_offset_size (const struct sframe_row_entry *sframe_fre,
>> +sframe_get_fre_dataword_size (const struct sframe_row_entry *sframe_fre,
>> bool flex_p)
>> {
>> - unsigned int max_offset_size = 0;
>> + unsigned int max_dataword_size = 0;
>> unsigned int cfa_offset_size = 0;
>> unsigned int fp_offset_size = 0;
>> unsigned int ra_offset_size = 0;
>>
>> - unsigned int fre_offset_size = 0;
>> + unsigned int fre_dataword_size = 0;
>>
>> - /* What size of offsets appear in this frame row entry. */
>> + /* What size of data words appear in this frame row entry. */
>> cfa_offset_size = get_offset_size_in_bytes (sframe_fre->cfa_offset);
>> if (sframe_fre->fp_loc == SFRAME_FRE_ELEM_LOC_STACK)
>> fp_offset_size = get_offset_size_in_bytes (sframe_fre->fp_offset);
>> @@ -450,11 +450,11 @@ sframe_get_fre_offset_size (const struct sframe_row_entry *sframe_fre,
>> }
>>
>> /* Get the maximum size needed to represent the offsets. */
>> - max_offset_size = cfa_offset_size;
>> - if (fp_offset_size > max_offset_size)
>> - max_offset_size = fp_offset_size;
>> - if (ra_offset_size > max_offset_size)
>> - max_offset_size = ra_offset_size;
>> + max_dataword_size = cfa_offset_size;
>> + if (fp_offset_size > max_dataword_size)
>> + max_dataword_size = fp_offset_size;
>> + if (ra_offset_size > max_dataword_size)
>> + max_dataword_size = ra_offset_size;
>>
>> /* If flex FDE, account for reg data too. */
>> if (flex_p)
>> @@ -463,18 +463,18 @@ sframe_get_fre_offset_size (const struct sframe_row_entry *sframe_fre,
>> unsigned int data
>> = SFRAME_V3_FLEX_FDE_REG_ENCODE (sframe_fre->cfa_base_reg,
>> sframe_fre->cfa_deref_p, reg_p);
>> - unsigned int data_size = get_udata_size_in_bytes (data);
>> - if (data_size > max_offset_size)
>> - max_offset_size = data_size;
>> + unsigned int udata_size = get_udata_size_in_bytes (data);
>> + if (udata_size > max_dataword_size)
>> + max_dataword_size = udata_size;
>
> Maybe "control_word_size" or "cfa_control_word_size"?
>
OK, if you prefer that.
>>
>> if (sframe_fre->ra_loc == SFRAME_FRE_ELEM_LOC_REG)
>> {
>> data = SFRAME_V3_FLEX_FDE_REG_ENCODE (sframe_fre->ra_reg,
>> sframe_fre->ra_deref_p,
>> 1 /* reg_p. */);
>> - data_size = get_udata_size_in_bytes (data);
>> - if (data_size > max_offset_size)
>> - max_offset_size = data_size;
>> + udata_size = get_udata_size_in_bytes (data);
>> + if (udata_size > max_dataword_size)
>> + max_dataword_size = udata_size;
>
> Likewise.
>
Done.
>> }
>>
>> if (sframe_fre->fp_loc == SFRAME_FRE_ELEM_LOC_REG)
>> @@ -482,33 +482,32 @@ sframe_get_fre_offset_size (const struct sframe_row_entry *sframe_fre,
>> data = SFRAME_V3_FLEX_FDE_REG_ENCODE (sframe_fre->fp_reg,
>> sframe_fre->fp_deref_p,
>> 1 /* reg_p. */);
>> - data_size = get_udata_size_in_bytes (data);
>> - if (data_size > max_offset_size)
>> - max_offset_size = data_size;
>> + udata_size = get_udata_size_in_bytes (data);
>> + if (udata_size > max_dataword_size)
>> + max_dataword_size = udata_size;
>
> Likewise.
>
Done.
>> }
>> }
>>
>> - gas_assert (max_offset_size);
>> + gas_assert (max_dataword_size);
>>
>> - switch (max_offset_size)
>> + switch (max_dataword_size)
>> {
>> case 1:
>> - fre_offset_size = SFRAME_FRE_OFFSET_1B;
>> + fre_dataword_size = SFRAME_FRE_DATAWORD_1B;
>> break;
>> case 2:
>> - fre_offset_size = SFRAME_FRE_OFFSET_2B;
>> + fre_dataword_size = SFRAME_FRE_DATAWORD_2B;
>> break;
>> case 4:
>> - fre_offset_size = SFRAME_FRE_OFFSET_4B;
>> + fre_dataword_size = SFRAME_FRE_DATAWORD_4B;
>> break;
>> default:
>> - /* Offset of size 8 bytes is not supported in SFrame format
>> - version 1. */
>> - as_fatal (_("SFrame unsupported offset value\n"));
>> + /* FRE data words of size 8 bytes is not supported in SFrame. */
>> + as_fatal (_("SFrame unsupported FRE data word size\n"));
>> break;
>> }
>>
>> - return fre_offset_size;
>> + return fre_dataword_size;
>> }
>>
>> /* Create a composite expression CEXP (for SFrame FRE start address) such that:
>> @@ -642,101 +641,101 @@ sframe_fde_free (struct sframe_func_entry *sframe_fde)
>> XDELETE (sframe_fde);
>> }
>>
>> -/* Output the varlen data (SFrame FRE stack offsets) for SFrame FRE object
>> +/* Output the varlen data (SFrame FRE data words) for SFrame FRE object
>> SFRAME_FRE of the SFrame FDE object SFRAME_FDE. Each emitted entry is of
>> - size FRE_OFFSET_SIZE. Write out the offsets in order - CFA, RA, FP. */
>> + size FRE_DWORD_SIZE. Write out the data words in order - CFA, RA, FP. */
>
> s/FRE_DWORD_SIZE/FRE_DATAWORD_SIZE/ ?
>
Yes. Thanks.
>>
>> static unsigned int
>> -output_sframe_row_entry_offsets (const struct sframe_func_entry *sframe_fde,
>> - const struct sframe_row_entry *sframe_fre,
>> - unsigned int fre_offset_size)
>> +output_sframe_row_entry_datawords (const struct sframe_func_entry *sframe_fde,
>> + const struct sframe_row_entry *sframe_fre,
>> + unsigned int fre_dataword_size)
Also fixed this indentation.
> Regards,
> Jens
More information about the Binutils
mailing list