[2/3] gas: Skip SFrame FDE if .cfi_val_offset specifies non-default offset

Message ID 20250203135707.1300569-3-jremus@linux.ibm.com
State New
Headers
Series sframe: Cleanups an documentation improvement |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Test passed

Commit Message

Jens Remus Feb. 3, 2025, 1:57 p.m. UTC
  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>
---
 gas/gen-sframe.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
  

Patch

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index e7397e040c65..13478efab6b9 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);