From: Jens Remus Date: Tue, 4 Feb 2025 14:13:24 +0000 (+0100) Subject: gas: Skip SFrame FDE if .cfi_val_offset specifies non-default offset X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49da9e9d9e6dfdca620cd9d953b543598d7b61cf;p=thirdparty%2Fbinutils-gdb.git 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 , 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 --- 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);