This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/84530] -mfunction-return=thunk does not work for simple_return_pop_internal insn


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

--- Comment #3 from hjl at gcc dot gnu.org <hjl at gcc dot gnu.org> ---
Author: hjl
Date: Mon Feb 26 15:29:30 2018
New Revision: 257992

URL: https://gcc.gnu.org/viewcvs?rev=257992&root=gcc&view=rev
Log:
i386: Update -mfunction-return= for return with pop

When -mfunction-return= is used, simple_return_pop_internal should pop
return address into ECX register, adjust stack by bytes to pop from stack
and jump to the return thunk via ECX register.

Tested on i686 and x86-64.

        PR target/84530
        * config/i386/i386-protos.h (ix86_output_indirect_jmp): Remove
        the bool argument.
        (ix86_output_indirect_function_return): New prototype.
        (ix86_split_simple_return_pop_internal): Likewise.
        * config/i386/i386.c (indirect_return_via_cx): New.
        (indirect_return_via_cx_bnd): Likewise.
        (indirect_thunk_name): Handle return va CX_REG.
        (output_indirect_thunk_function): Create alias for
        __x86_return_thunk_[re]cx and __x86_return_thunk_[re]cx_bnd.
        (ix86_output_indirect_jmp): Remove the bool argument.
        (ix86_output_indirect_function_return): New function.
        (ix86_split_simple_return_pop_internal): Likewise.
        * config/i386/i386.md (*indirect_jump): Don't pass false
        to ix86_output_indirect_jmp.
        (*tablejump_1): Likewise.
        (simple_return_pop_internal): Change it to define_insn_and_split.
        Call ix86_split_simple_return_pop_internal to split it for
        -mfunction-return=.
        (simple_return_indirect_internal): Call
        ix86_output_indirect_function_return instead of
        ix86_output_indirect_jmp.

gcc/testsuite/

        PR target/84530
        * gcc.target/i386/ret-thunk-22.c: New test.
        * gcc.target/i386/ret-thunk-23.c: Likewise.
        * gcc.target/i386/ret-thunk-24.c: Likewise.
        * gcc.target/i386/ret-thunk-25.c: Likewise.
        * gcc.target/i386/ret-thunk-26.c: Likewise.

Added:
    trunk/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
    trunk/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
    trunk/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
    trunk/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
    trunk/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/i386/i386-protos.h
    trunk/gcc/config/i386/i386.c
    trunk/gcc/config/i386/i386.md
    trunk/gcc/testsuite/ChangeLog

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]