[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