[PATCH v2 2/2] Enable arch-specific CFI directives and DWARF instructions only when required by the target (part 1)

Indu Bhagat indu.bhagat@oracle.com
Fri Apr 25 22:00:31 GMT 2025


On 4/25/25 7:02 AM, Matthieu Longo wrote:
> On 2025-04-25 14:10, Jan Beulich wrote:
>> On 25.04.2025 13:04, Matthieu Longo wrote:
>>> --- a/gas/dw2gencfi.c
>>> +++ b/gas/dw2gencfi.c
>>> @@ -720,9 +720,16 @@ const pseudo_typeS cfi_pseudo_table[] =
>>>       { "cfi_same_value", dot_cfi, DW_CFA_same_value },
>>>       { "cfi_remember_state", dot_cfi, DW_CFA_remember_state },
>>>       { "cfi_restore_state", dot_cfi, DW_CFA_restore_state },
>>> -    { "cfi_window_save", dot_cfi, DW_CFA_GNU_window_save },
>>> +#if TC_AARCH64
>>> +    /* cfi_window_save is an alias of cfi_negate_ra_state which is 
>>> kept for
>>> +       backward-compatibility concerns.  */
>>> +    { "cfi_window_save", dot_cfi, DW_CFA_AARCH64_negate_ra_state },
>>
>> Why's this of concern only for Arm64?
>>
> 
> I am not sure that I understand what your question is here.
> cfi_window_save is only used by AArch64 and Sparc.
> 
>>> --- a/gas/gen-sframe.c
>>> +++ b/gas/gen-sframe.c
>>> @@ -1257,6 +1257,8 @@ sframe_xlate_do_restore (struct 
>>> sframe_xlate_ctx *xlate_ctx,
>>>     return SFRAME_XLATE_OK;
>>>   }
>>> +#if TC_AARCH64
>>> +
>>>   /* Translate DW_CFA_AARCH64_negate_ra_state into SFrame context.
>>>      Return SFRAME_XLATE_OK if success.  */
>>> @@ -1287,30 +1289,7 @@ 
>>> sframe_xlate_do_aarch64_negate_ra_state_with_pc (struct 
>>> sframe_xlate_ctx *xlate_
>>>     return SFRAME_XLATE_ERR_NOTREPRESENTED;  /* Not represented.  */
>>>   }
>>> -/* Translate DW_CFA_GNU_window_save into SFrame context.
>>> -   DW_CFA_GNU_window_save is a DWARF Sparc extension, but is 
>>> multiplexed with a
>>> -   directive of DWARF AArch64 extension: 
>>> DW_CFA_AARCH64_negate_ra_state.
>>> -   The AArch64 backend of GCC 14 and older versions was emitting 
>>> mistakenly the
>>> -   Sparc CFI directive (.cfi_window_save).  From GCC 15, the AArch64 
>>> backend
>>> -   only emits .cfi_negate_ra_state.  For backward compatibility, the 
>>> handler for
>>> -   .cfi_window_save needs to check whether the directive was used in 
>>> a AArch64
>>> -   ABI context or not.
>>> -   Return SFRAME_XLATE_OK if success.  */
>>> -
>>> -static int
>>> -sframe_xlate_do_gnu_window_save (struct sframe_xlate_ctx *xlate_ctx,
>>> -                 struct cfi_insn_data *cfi_insn)
>>> -{
>>> -  unsigned char abi_arch = sframe_get_abi_arch ();
>>> -
>>> -  /* Translate DW_CFA_AARCH64_negate_ra_state into SFrame context.  */
>>> -  if (abi_arch == SFRAME_ABI_AARCH64_ENDIAN_BIG
>>> -      || abi_arch == SFRAME_ABI_AARCH64_ENDIAN_LITTLE)
>>> -    return sframe_xlate_do_aarch64_negate_ra_state (xlate_ctx, 
>>> cfi_insn);
>>> -
>>> -  as_warn (_("skipping SFrame FDE; .cfi_window_save"));
>>> -  return SFRAME_XLATE_ERR_NOTREPRESENTED;  /* Not represented.  */
>>> -}
>>> +#endif /* TC_AARCH64 */
>>>   /* Handle DW_CFA_expression in .cfi_escape.
>>> @@ -1622,14 +1601,14 @@ sframe_do_cfi_insn (struct sframe_xlate_ctx 
>>> *xlate_ctx,
>>>       case DW_CFA_restore:
>>>         err = sframe_xlate_do_restore (xlate_ctx, cfi_insn);
>>>         break;
>>> -    /* DW_CFA_AARCH64_negate_ra_state is multiplexed with
>>> -       DW_CFA_GNU_window_save.  */
>>> -    case DW_CFA_GNU_window_save:
>>> -      err = sframe_xlate_do_gnu_window_save (xlate_ctx, cfi_insn);
>>> +#if TC_AARCH64
>>> +    case DW_CFA_AARCH64_negate_ra_state:
>>> +      err = sframe_xlate_do_aarch64_negate_ra_state (xlate_ctx, 
>>> cfi_insn);
>>>         break;
>>>       case DW_CFA_AARCH64_negate_ra_state_with_pc:
>>>         err = sframe_xlate_do_aarch64_negate_ra_state_with_pc 
>>> (xlate_ctx, cfi_insn);
>>>         break;
>>> +#endif /* TC_AARCH64 */
>>>       case DW_CFA_register:
>>>         err = sframe_xlate_do_register (xlate_ctx, cfi_insn);
>>>         break;
>>
>> This wants looking over by Indu (now Cc-ed).
> 
> FYI I removed DW_CFA_GNU_window_save following the suggestion of Jens 
> Remus:
> https://inbox.sourceware.org/binutils/08aa86e2-f1ba-49cf-a755- 
> ecb7114308e5@linux.ibm.com/

Hi Matthieu,

I think the diffs for gen-sframe.c can be dropped altogether.

The code in gen-sframe.c is already checking for the relevant ABI.  And 
SFrame
generation here feeds off the DWARF cfi_insn created by dw2gencfi* process.
With your changes in gas/dw2gencfi.c, user will anyway see a 'Error: unknown
pseudo-op: ' for say .cfi_window_save on AMD64.

Having said that, IMO, inspite of whether we error out / silently ignore 
these
usages for non-supported arches in dw2gencfi, its best that the code in
gen-sframe.c continues to warn and skip FDE like it was doing earlier.

Thanks
Indu


More information about the Binutils mailing list