[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