On Mon, Jan 29, 2024 at 08:00:26AM -0800, H.J. Lu wrote:
> Attach REG_CFA_UNDEFINED notes for unsaved callee-saved registers which
> have been used in the function to an instruction in prologue.
> 
> gcc/
> 
>       PR target/38534
>       * dwarf2cfi.cc (add_cfi_undefined): New.
>       (dwarf2out_frame_debug_cfa_undefined): Likewise.
>       (dwarf2out_frame_debug): Handle REG_CFA_UNDEFINED.
>       * reg-notes.def (REG_CFA_UNDEFINED): New.
>       * config/i386/i386.cc (ix86_expand_prologue): Attach
>       REG_CFA_UNDEFINED notes for unsaved callee-saved registers
>       which have been used in the function to an instruction in
>       prologue.
> 
> gcc/testsuite/
> 
>       PR target/38534
>       * gcc.target/i386/no-callee-saved-19.c: New test.
>       * gcc.target/i386/no-callee-saved-20.c: Likewise.
>       * gcc.target/i386/pr38534-7.c: Likewise.
>       * gcc.target/i386/pr38534-8.c: Likewise.
> ---
>  gcc/config/i386/i386.cc                       | 20 +++++++
>  gcc/dwarf2cfi.cc                              | 55 +++++++++++++++++++
>  gcc/reg-notes.def                             |  4 ++
>  .../gcc.target/i386/no-callee-saved-19.c      | 17 ++++++
>  .../gcc.target/i386/no-callee-saved-20.c      | 12 ++++
>  gcc/testsuite/gcc.target/i386/pr38534-7.c     | 18 ++++++
>  gcc/testsuite/gcc.target/i386/pr38534-8.c     | 13 +++++
>  7 files changed, 139 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/i386/no-callee-saved-19.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/no-callee-saved-20.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr38534-7.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr38534-8.c
> 
> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> index b3e7c74846e..6ec87b6a16f 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -9304,6 +9304,26 @@ ix86_expand_prologue (void)
>       combined with prologue modifications.  */
>    if (TARGET_SEH)
>      emit_insn (gen_prologue_use (stack_pointer_rtx));
> +
> +  if (cfun->machine->call_saved_registers
> +      != TYPE_NO_CALLEE_SAVED_REGISTERS)
> +    return;
> +
> +  insn = get_insns ();
> +  if (!insn)
> +    return;

You can't attach the notes to a random instruction that happens to be first
in the function.
1) it needs to be a real instruction, not a note
2) it needs to be RTX_FRAME_RELATED_P
3) if it is RTX_FRAME_RELATED_P, but doesn't contain any previous REG_CFA_*
   notes:
   3a) if it has REG_FRAME_RELATED_EXPR note, then I believe just that
       note argument is processed instead of the instruction pattern and
       I think REG_CFA_* notes which precede REG_FRAME_RELATED_EXPR are
       processed, but REG_CFA_* notes after it are not; so adding
       REG_CFA_UNDEFINED notes at least if the adding is after the existing
       notes instead of before them may be problematic
   3b) if it has neither REG_CFA_* nor REG_FRAME_RELATED_EXPR notes, then
       normally the pattern of the insn would be processed in dwarf2cfi.
       But with the REG_CFA_* notes that part will be ignored.

> --- a/gcc/dwarf2cfi.cc
> +++ b/gcc/dwarf2cfi.cc
> @@ -517,6 +517,17 @@ add_cfi_restore (unsigned reg)
>    add_cfi (cfi);
>  }
>  

Function comment missing.

> +static void
> +add_cfi_undefined (unsigned reg)
> +{
> +  dw_cfi_ref cfi = new_cfi ();
> +
> +  cfi->dw_cfi_opc = DW_CFA_undefined;
> +  cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
> +
> +  add_cfi (cfi);
> +}
> +
>  /* Perform ROW->REG_SAVE[COLUMN] = CFI.  CFI may be null, indicating
>     that the register column is no longer saved.  */

        Jakub

Reply via email to