[V3 18/36] [SFrame-V3] gas: sframe: output new FDE type SFRAME_FDE_TYPE_FLEX

Jens Remus jremus@linux.ibm.com
Thu Jan 15 11:54:41 GMT 2026


On 1/13/2026 12:12 PM, Indu Bhagat wrote:
> This patch updates the routines for emission of the new FDE type
> SFRAME_FDE_TYPE_FLEX in the SFrame output section.  The support for
> generating these flex FDEs themselves is added in a subsequent commit.
> 
> Update struct sframe_row_entry to track additional state for CFA,
> FP, and RA.  Modify output_sframe_row_entry_offsets () to emit
> metadata/offset pairs for flexible FDEs or padding where applicable,
> ensuring the usual ordering (CFA, RA, FP).  The padding data, a.k.a.
> SFRAME_FRE_RA_OFFSET_INVALID is emitted in flexible FDEs when RA is
> untracked but FP offsets follow.  Trailing padding offsets should not
> occur.  Add a new function get_udata_size_in_bytes () to account for
> sizing of unsigned register metadata.
> 
> gas/
> 	* gen-sframe.c (get_udata_size_in_bytes): Get size of unsigned
> 	int data in bytes.
> 	(get_fre_num_offsets): Handle SFRAME_FDE_TYPE_FLEX.
> 	(sframe_get_fre_offset_size): Account for register metadata
> 	in flexible FDEs.
> 	(output_sframe_row_entry_offsets): Add logic for flexible
> 	FDE offset pairs.
> 	(output_sframe_row_entry): Reset base register for flex FDEs.
> 	(output_sframe_funcdesc): Emit FDE type in func_info2.
> 	(sframe_xlate_ctx_init): Initialize flex_p.
> 	(sframe_xlate_ctx_finalize): Finalize flex_p status.
> 	(sframe_row_entry_initialize): Copy new deref tracking bits.
> 	(sframe_xlate_do_offset): Set deref bits during translation.
> 	* gen-sframe.h (struct sframe_row_entry): Add cfa_deref_p,
> 	fp_deref_p, and ra_deref_p.
> 	(struct sframe_func_entry): Add fde_flex_p.
> 	(struct sframe_xlate_ctx): Add flex_p.

> diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c

> @@ -667,10 +786,17 @@ output_sframe_row_entry (const struct sframe_func_entry *sframe_fde,
>    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_num_offsets = get_fre_num_offsets (sframe_fre,
> +					     sframe_fde->fde_flex_p);
> +      fre_offset_size = sframe_get_fre_offset_size (sframe_fre,
> +						    sframe_fde->fde_flex_p);
>        fre_mangled_ra_p = sframe_fre->mangled_ra_p;
>      }
> +
> +  /* Unused for flex FDE.  Set to zero.  */
> +  if (sframe_fde->fde_flex_p)
> +    fre_base_reg = SFRAME_BASE_REG_FP;

I would prefer the following, as it took me a while to realize that
SFRAME_BASE_REG_FP is defined as 0:

    fre_base_reg = 0;

> +
>    fre_info = sframe_set_fre_info (fre_base_reg, fre_num_offsets,
>  				  fre_offset_size, fre_mangled_ra_p);
>    out_one (fre_info);
Regards,
Jens
-- 
Jens Remus
Linux on Z Development (D3303)
jremus@de.ibm.com / jremus@linux.ibm.com

IBM Deutschland Research & Development GmbH; Vorsitzender des Aufsichtsrats: Wolfgang Wendt; Geschäftsführung: David Faller; Sitz der Gesellschaft: Ehningen; Registergericht: Amtsgericht Stuttgart, HRB 243294
IBM Data Privacy Statement: https://www.ibm.com/privacy/



More information about the Binutils mailing list