https://gcc.gnu.org/bugzilla/show_bug.cgi?id=128270

--- Comment #11 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Uros Bizjak <[email protected]>:

https://gcc.gnu.org/g:66d6442dd1b3e35edf39deea00b3524524efb2fd

commit r14-12986-g66d6442dd1b3e35edf39deea00b3524524efb2fd
Author: Uros Bizjak <[email protected]>
Date:   Fri Oct 30 08:29:04 2026 +0100

    i386: Emit REG_CFA_RESTORE in DRAP frames even in the red zone [PR128270]

    In a DRAP-realigned frame, the caller's frame pointer is described by
    a DW_CFA_expression rule relative to the frame pointer itself (Rule 18
    in dwarf2out_frame_debug_expr).  Registers saved by moves are described
    the same way, see ix86_emit_save_reg_using_mov.  Once %rbp is restored
    by "leave" or "pop %rbp", these rules are stale and point at the wrong
    address.  Unwinders and gdb then read garbage: the backtrace is
    truncated when stopping between "leave" and "ret", and the recovered
    values of the mov-saved registers are wrong.

    ix86_add_cfa_restore_note skips the note when the saved slot is within
    the red zone, on the assumption that unwinders can find the same value
    in the register and on the stack.  That holds for CFA-relative
    DW_CFA_offset rules, but not for the frame-pointer-relative expression
    rules used in DRAP frames.  Don't take the shortcut when
    stack_realign_drap.

    Assisted-by: Claude Sonnet 5.5

            PR target/128270

    gcc/ChangeLog:

            * config/i386/i386.cc (ix86_add_cfa_restore_note): Do not skip
            the note when stack_realign_drap.

    gcc/testsuite/ChangeLog:

            * gcc.target/i386/pr128270-1.c: New test.
            * gcc.target/i386/pr128270-2.c: Ditto.
            * gcc.target/i386/pr128270-3.c: Ditto.
            * gcc.target/i386/pr128270-4.c: Ditto.

    (cherry picked from commit b7e3114e8174f4076e6a0b136d2b65c76a301941)

Reply via email to