[PATCH v2 2/2] Enable arch-specific CFI directives and DWARF instructions only when required by the target (part 1)
Matthieu Longo
matthieu.longo@arm.com
Fri Apr 25 14:02:37 GMT 2025
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/
>
> Jan
More information about the Binutils
mailing list