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