[binutils-gdb] gas: Skip SFrame FDE if .cfi_val_offset specifies non-default offset

Jens Remus jremus@sourceware.org
Tue Feb 4 14:14:35 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=49da9e9d9e6dfdca620cd9d953b543598d7b61cf

commit 49da9e9d9e6dfdca620cd9d953b543598d7b61cf
Author: Jens Remus <jremus@linux.ibm.com>
Date:   Tue Feb 4 15:13:24 2025 +0100

    gas: Skip SFrame FDE if .cfi_val_offset specifies non-default offset
    
    Unwinding of the stack pointer (SP) is performed using the assumed
    default rule ".cfi_val_offset <SP-reg>, 0", so that SP unwinds as:
    
      SP = CFA
    
    Warn if the CFI directive .cfi_val_offset is encountered for the
    SP register with a different offset.
    
    gas/
            * gen-sframe.c (sframe_xlate_do_val_offset): Skip SFrame FDE
            if non-default SP value offset.
    
    Signed-off-by: Jens Remus <jremus@linux.ibm.com>

Diff:
---
 gas/gen-sframe.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index e7397e040c6..13478efab6b 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -1124,15 +1124,15 @@ sframe_xlate_do_val_offset (struct sframe_xlate_ctx *xlate_ctx ATTRIBUTE_UNUSED,
 			    struct cfi_insn_data *cfi_insn)
 {
   /* Previous value of register is CFA + offset.  However, if the specified
-     register is not interesting (FP or RA reg), the current DW_CFA_val_offset
-     instruction can be safely skipped without sacrificing the asynchronicity of
-     stack trace information.  */
+     register is not interesting (SP, FP, or RA reg), the current
+     DW_CFA_val_offset instruction can be safely skipped without sacrificing
+     the asynchronicity of stack trace information.  */
   if (cfi_insn->u.ri.reg == SFRAME_CFA_FP_REG
 #ifdef SFRAME_FRE_RA_TRACKING
       || (sframe_ra_tracking_p () && cfi_insn->u.ri.reg == SFRAME_CFA_RA_REG)
 #endif
-      /* Ignore SP reg, as it can be recovered from the CFA tracking info.  */
-      )
+      /* Ignore SP reg, if offset matches assumed default rule.  */
+      || (cfi_insn->u.ri.reg == SFRAME_CFA_SP_REG && cfi_insn->u.ri.offset != 0))
     {
       as_warn (_("skipping SFrame FDE; %s register %u in .cfi_val_offset"),
 	       sframe_register_name (cfi_insn->u.ri.reg), cfi_insn->u.ri.reg);


More information about the Binutils-cvs mailing list