i386: Skip ENDBR32 at the target function entry

Skip ENDBR32 at the target function entry when initializing trampoline.

Tested on Linux/x86-64 CET machine with and without -m32.

gcc/

	PR target/93656
	* config/i386/i386.c (ix86_trampoline_init): Skip ENDBR32 at
	the target function entry.

gcc/testsuite/

	PR target/93656
	* gcc.target/i386/pr93656.c: New test.
This commit is contained in:
H.J. Lu 2020-02-13 05:28:38 -08:00
parent ac5e8d2fa0
commit 1d69147af2
4 changed files with 21 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2020-02-13 H.J. Lu <hongjiu.lu@intel.com>
PR target/93656
* config/i386/i386.c (ix86_trampoline_init): Skip ENDBR32 at
the target function entry.
2020-02-13 Claudiu Zissulescu <claziss@synopsys.com>
* common/config/arc/arc-common.c (arc_option_optimization_table):

View File

@ -16839,9 +16839,14 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
the stack, we need to skip the first insn which pushes the
(call-saved) register static chain; this push is 1 byte. */
offset += 5;
int skip = MEM_P (chain) ? 1 : 0;
/* Skip ENDBR32 at the entry of the target function. */
if (need_endbr
&& !cgraph_node::get (fndecl)->only_called_directly_p ())
skip += 4;
disp = expand_binop (SImode, sub_optab, fnaddr,
plus_constant (Pmode, XEXP (m_tramp, 0),
offset - (MEM_P (chain) ? 1 : 0)),
offset - skip),
NULL_RTX, 1, OPTAB_DIRECT);
emit_move_insn (mem, disp);
}

View File

@ -1,3 +1,8 @@
2020-02-13 H.J. Lu <hongjiu.lu@intel.com>
PR target/93656
* gcc.target/i386/pr93656.c: New test.
2020-02-13 Claudiu Zissulescu <claziss@synopsys.com>
* gcc.target/arc/nps400-1.c: Update test.

View File

@ -0,0 +1,4 @@
/* { dg-do run { target { ia32 && cet } } } */
/* { dg-options "-O2 -fcf-protection" } */
#include "pr67770.c"