[PATCH 1/2] gas: sframe: Fix non-SP/FP CFA base register if flexible FDE

Jens Remus <[email protected]> Wed, 29 Jul 2026 18:34:44 +0200
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
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 <[email protected]>
---

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

 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:
 
-- 
2.53.0