[PATCH 1/2] gas: sframe: Fix non-SP/FP CFA base register if flexible FDE
Indu Bhagat
ibhagatgnu@gmail.com
Tue Aug 11 20:43:37 GMT 2026
On 2026-07-29 09:34, Jens Remus wrote:
> If a target supports SFrame V3 flexible FDE, a non-SP/FP CFA base
> register can be represented. Do not warn and skip generating FDE, if
> .cfi_def_cfa_offset with a non-SP/FP register in effect, if target
> supports flexible FDE.
>
> gas/
> * gen-sframe.c (sframe_xlate_do_def_cfa_offset): Allow non-SP/FP
> CFA base register if flexible FDE.
>
> gas/testsuite/
> * gas/cfi-sframe/common-empty-2.d: Skip test on targets that
> support SFrame V3 flexible FDE.
>
> Signed-off-by: Jens Remus <jremus@linux.ibm.com>
> ---
>
> Notes (jremus):
> Why does sframe_xlate_do_def_cfa_offset care about the CFA base
> register at all? With SFrame V3 it could test cur_cfa_reg for
> SFRAME_FRE_REG_INVALID. But wouldn't the following be valid DWARF CFI:
>
> .cfi_startproc simple
> .cfi_def_cfa_offset 0
> .cfi_def_cfa_register <SP>
> ...
> .cfi_endproc
>
> to express the same as:
>
> .cfi_startproc simple
> .cfi_def_cfa <SP>, 0
> ...
> .cfi_endproc
>
In theory yes, but SFrame code enforces a presence of
DW_CFA_def_cfa_register (or others as applicable to basically setup the
CFA register) to apply the following specified in the DWARF standard:
For the DW_CFA_def_cfa_offset, it says: "This operation is valid only if
the current CFA rule is defined to use a register and offset."
> gas/gen-sframe.c | 3 ++-
> gas/testsuite/gas/cfi-sframe/common-empty-2.d | 1 +
> 2 files changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
> index b5c8f649beac..f0576869579a 100644
> --- a/gas/gen-sframe.c
> +++ b/gas/gen-sframe.c
> @@ -1360,7 +1360,8 @@ sframe_xlate_do_def_cfa_offset (struct sframe_xlate_ctx *xlate_ctx,
> /* Define the current CFA rule to use the provided offset (but to keep
> the old register). However, if the old register is not FP/SP,
> skip creating SFrame stack trace info for the function. */
> - if (cur_cfa_reg == SFRAME_CFA_FP_REG || cur_cfa_reg == SFRAME_CFA_SP_REG)
> + if (cur_cfa_reg == SFRAME_CFA_FP_REG || cur_cfa_reg == SFRAME_CFA_SP_REG
> + || sframe_support_flex_fde_p ())
> {
> if (sframe_fre_stack_offset_bound_p (cfi_insn->u.i, true))
> {
> diff --git a/gas/testsuite/gas/cfi-sframe/common-empty-2.d b/gas/testsuite/gas/cfi-sframe/common-empty-2.d
> index c80ea50c75f9..ce13d5ef055a 100644
> --- a/gas/testsuite/gas/cfi-sframe/common-empty-2.d
> +++ b/gas/testsuite/gas/cfi-sframe/common-empty-2.d
> @@ -2,6 +2,7 @@
> #warning: \.cfi_def_cfa_offset without CFA base register in effect
> #objdump: --sframe=.sframe
> #name: SFrame supports only FP/SP based CFA
> +#notarget: s390x-*-* x86_64-*-*
> #...
> Contents of the SFrame section .sframe:
>
More information about the Binutils
mailing list