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

--- Comment #1 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Szabolcs Nagy <n...@gcc.gnu.org>:

https://gcc.gnu.org/g:0d344b557604e966dc7f91739881f03e1f221efd

commit r13-753-g0d344b557604e966dc7f91739881f03e1f221efd
Author: Szabolcs Nagy <szabolcs.n...@arm.com>
Date:   Thu Feb 10 17:42:56 2022 +0000

    aarch64: Fix pac-ret with unusual dwarf in libgcc unwinder [PR104689]

    The RA_SIGN_STATE dwarf pseudo-register is normally only set using the
    DW_CFA_AARCH64_negate_ra_state (== DW_CFA_window_save) operation which
    toggles the return address signedness state (the default state is 0).
    (It may be set by remember/restore_state CFI too, those save/restore
    the state of all registers.)

    However RA_SIGN_STATE can be set directly via DW_CFA_val_expression too.
    GCC does not generate such CFI but some other compilers reportedly do.

    Note: the toggle operation must not be mixed with other dwarf register
    rule CFI within the same CIE and FDE.

    In libgcc we assume REG_UNSAVED means the RA_STATE is set using toggle
    operations, otherwise we assume its value is set by other CFI.

    libgcc/ChangeLog:

            PR target/104689
            * config/aarch64/aarch64-unwind.h (aarch64_frob_update_context):
            Handle the !REG_UNSAVED case.
            * unwind-dw2.c (execute_cfa_program): Fail toggle if !REG_UNSAVED.

    gcc/testsuite/ChangeLog:

            PR target/104689
            * gcc.target/aarch64/pr104689.c: New test.
  • [Bug target/104689] aarch64: li... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to