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

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jeff Law <l...@gcc.gnu.org>:

https://gcc.gnu.org/g:eea25179d8d1406685b8b0995ba841605f895283

commit r14-6417-geea25179d8d1406685b8b0995ba841605f895283
Author: Mikael Pettersson <mikpeli...@gmail.com>
Date:   Mon Dec 11 08:40:41 2023 -0700

    [PATCH] wrong code on m68k with -mlong-jump-table-offsets and -malign-int
(PR target/112413)

    On m68k the compiler assumes that the PC-relative jump-via-jump-table
    instruction and the jump table are adjacent with no padding in between.

    When -mlong-jump-table-offsets is combined with -malign-int, a 2-byte
    nop may be inserted before the jump table, causing the jump to add the
    fetched offset to the wrong PC base and thus jump to the wrong address.

    Fixed by referencing the jump table via its label. On the test case
    in the PR the object code change is (the moveal at 16 is the nop):

        a:  6536            bcss 42 <f+0x42>
        c:  e588            lsll #2,%d0
        e:  203b 0808       movel %pc@(18 <f+0x18>,%d0:l),%d0
    -  12:  4efb 0802       jmp %pc@(16 <f+0x16>,%d0:l)
    +  12:  4efb 0804       jmp %pc@(18 <f+0x18>,%d0:l)
       16:  284c            moveal %a4,%a4
       18:  0000 0020       orib #32,%d0
       1c:  0000 002c       orib #44,%d0

    Bootstrapped and tested on m68k-linux-gnu, no regressions.

    Note: I don't have commit rights to I would need assistance applying this.

            PR target/112413
    gcc/

            * config/m68k/linux.h (ASM_RETURN_CASE_JUMP): For
            TARGET_LONG_JUMP_TABLE_OFFSETS, reference the jump table
            via its label.
            * config/m68k/m68kelf.h (ASM_RETURN_CASE_JUMP): Likewise.
            * config/m68k/netbsd-elf.h (ASM_RETURN_CASE_JUMP): Likewise.

Reply via email to