[PATCH v4 3/4] gas: sframe: Represent .cfi_undefined RA as FRE without offsets

Indu Bhagat indu.bhagat@oracle.com
Wed Jul 30 08:30:14 GMT 2025


On 7/29/25 4:19 AM, Jens Remus wrote:
>>> @@ -164,6 +164,7 @@ sframe_fre_set_ra_track (struct sframe_row_entry *fre, offsetT ra_offset)
>>>    {
>>>      fre->ra_loc = SFRAME_FRE_ELEM_LOC_STACK;
>>>      fre->ra_offset = ra_offset;
>>> +  fre->ra_undefined = false;
>>>      fre->merge_candidate = false;
>>>    }
>>>    @@ -335,6 +336,9 @@ get_fre_base_reg_id (struct sframe_row_entry *sframe_fre)
>>>      unsigned int cfi_insn_cfa_base_reg = sframe_fre->cfa_base_reg;
>>>      unsigned fre_base_reg = SFRAME_BASE_REG_SP;
>>>    +  if (sframe_fre->ra_undefined)
>>> +    return 0;
>>> +
>> This effectively means SFRAME_BASE_REG_FP; return 0 is generally
>> confusing to read (at least for me).
>>
>> How about we return the SFRAME_BASE_REG_SP instead with some code
>> comments if you see fit.
> My intend was to set as much of the FRE info word zero as possible,
> to make it easier for humans to parse SFrame data for debugging
> purposes.  I did not touch mangled_ra_p, as I was unsure whether
> that can also be unconditionally set to zero.  But I guess that
> would be fine?
> 
> I used zero, to denote that this is about setting the field to zero
> instead of a specific value with an assigned meaning, like
> SFRAME_BASE_REG_SP.
> 
> What if I reverted all the changes to the SFrame helpers and did the
> following change to output_sframe_row_entry instead, to make that
> more explicit?
> 
>     /* Create the fre_info using the CFA base register, number of offsets and max
> -     size of offset in this frame row entry.  */
> -  fre_base_reg = get_fre_base_reg_id (sframe_fre);
> -  fre_num_offsets = get_fre_num_offsets (sframe_fre);
> -  fre_offset_size = sframe_get_fre_offset_size (sframe_fre);
> +     size of offset in this frame row entry.  RA undefined is represented
> +     as FRE without any offsets and all FRE info word fields zeroed.  */
> +  if (sframe_fre->ra_undefined)
> +    {
> +      fre_base_reg = 0;
> +      fre_num_offsets = 0;
> +      fre_offset_size = 0;
> +      fre_mangled_ra_p = 0;
> +    }
> +  else
> +    {
> +      fre_base_reg = get_fre_base_reg_id (sframe_fre);
> +      fre_num_offsets = get_fre_num_offsets (sframe_fre);
> +      fre_offset_size = sframe_get_fre_offset_size (sframe_fre);
> +      fre_mangled_ra_p = sframe_fre->mangled_ra_p;
> +    }
>     fre_info = sframe_set_fre_info (fre_base_reg, fre_num_offsets,
> -                                 fre_offset_size, sframe_fre->mangled_ra_p);
> +                                 fre_offset_size, fre_mangled_ra_p);
>     out_one (fre_info);
> 
>     /* Represent RA undefined as FRE without any offsets.  */
> 
> Alternatively:
> 
>    fre_info = 0;

How about we reset the state of cur_fre when handling the case in 
sframe_xlate_do_cfi_undefined () itself. Then this handling in 
output_sframe_row_entry will not be necessary.


More information about the Binutils mailing list