i386: Insert ENDBR before the profiling counter call
ENDBR must be the first instruction of a function. This patch queues ENDBR if we need to put the profiling counter call before the prologue and generate ENDBR before the profiling counter call. gcc/ PR target/82699 * config/i386/i386.c (rest_of_insert_endbranch): Set endbr_queued_at_entrance to true and don't insert ENDBR if x86_function_profiler will be called. (x86_function_profiler): Insert ENDBR if endbr_queued_at_entrance is true. * config/i386/i386.h (machine_function): Add endbr_queued_at_entrance. gcc/testsuite/ PR target/82699 * gcc.target/i386/pr82699-1.c: New file. * gcc.target/i386/pr82699-2.c: Likewise. * gcc.target/i386/pr82699-3.c: Likewise. * gcc.target/i386/pr82699-4.c: Likewise. * gcc.target/i386/pr82699-5.c: Likewise. * gcc.target/i386/pr82699-6.c: Likewise. From-SVN: r264540
This commit is contained in:
parent
c109362313
commit
708c728d4f
@ -1,3 +1,14 @@
|
||||
2018-09-24 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/82699
|
||||
* config/i386/i386.c (rest_of_insert_endbranch): Set
|
||||
endbr_queued_at_entrance to true and don't insert ENDBR if
|
||||
x86_function_profiler will be called.
|
||||
(x86_function_profiler): Insert ENDBR if endbr_queued_at_entrance
|
||||
is true.
|
||||
* config/i386/i386.h (machine_function): Add
|
||||
endbr_queued_at_entrance.
|
||||
|
||||
2018-09-24 Ilya Leoshkevich <iii@linux.ibm.com>
|
||||
|
||||
* genattrtab.c (mk_attr_alt): Use alternative_mask.
|
||||
|
@ -2593,11 +2593,17 @@ rest_of_insert_endbranch (void)
|
||||
TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl)))
|
||||
&& !cgraph_node::get (cfun->decl)->only_called_directly_p ())
|
||||
{
|
||||
cet_eb = gen_nop_endbr ();
|
||||
/* Queue ENDBR insertion to x86_function_profiler. */
|
||||
if (crtl->profile && flag_fentry)
|
||||
cfun->machine->endbr_queued_at_entrance = true;
|
||||
else
|
||||
{
|
||||
cet_eb = gen_nop_endbr ();
|
||||
|
||||
bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
|
||||
insn = BB_HEAD (bb);
|
||||
emit_insn_before (cet_eb, insn);
|
||||
bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
|
||||
insn = BB_HEAD (bb);
|
||||
emit_insn_before (cet_eb, insn);
|
||||
}
|
||||
}
|
||||
|
||||
bb = 0;
|
||||
@ -41203,6 +41209,10 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
|
||||
{
|
||||
const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE
|
||||
: MCOUNT_NAME);
|
||||
|
||||
if (cfun->machine->endbr_queued_at_entrance)
|
||||
fprintf (file, "\t%s\n", TARGET_64BIT ? "endbr64" : "endbr32");
|
||||
|
||||
if (TARGET_64BIT)
|
||||
{
|
||||
#ifndef NO_PROFILE_COUNTERS
|
||||
|
@ -2747,6 +2747,9 @@ struct GTY(()) machine_function {
|
||||
/* Nonzero if the function places outgoing arguments on stack. */
|
||||
BOOL_BITFIELD outgoing_args_on_stack : 1;
|
||||
|
||||
/* If true, ENDBR is queued at function entrance. */
|
||||
BOOL_BITFIELD endbr_queued_at_entrance : 1;
|
||||
|
||||
/* The largest alignment, in bytes, of stack slot actually used. */
|
||||
unsigned int max_used_stack_alignment;
|
||||
|
||||
|
@ -1,3 +1,13 @@
|
||||
2018-09-24 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/82699
|
||||
* gcc.target/i386/pr82699-1.c: New file.
|
||||
* gcc.target/i386/pr82699-2.c: Likewise.
|
||||
* gcc.target/i386/pr82699-3.c: Likewise.
|
||||
* gcc.target/i386/pr82699-4.c: Likewise.
|
||||
* gcc.target/i386/pr82699-5.c: Likewise.
|
||||
* gcc.target/i386/pr82699-6.c: Likewise.
|
||||
|
||||
2018-09-24 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
||||
PR fortran/87401
|
||||
|
11
gcc/testsuite/gcc.target/i386/pr82699-1.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr82699-1.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
/* { dg-options "-O2 -fno-pic -fcf-protection -pg -fasynchronous-unwind-tables" } */
|
||||
/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
return bar (i);
|
||||
}
|
11
gcc/testsuite/gcc.target/i386/pr82699-2.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr82699-2.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
/* { dg-options "-O2 -fno-pic -fcf-protection -pg -mfentry -fasynchronous-unwind-tables" } */
|
||||
/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
return bar (i);
|
||||
}
|
11
gcc/testsuite/gcc.target/i386/pr82699-3.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr82699-3.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
/* { dg-options "-O2 -fpic -fcf-protection -pg -fasynchronous-unwind-tables" } */
|
||||
/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
return bar (i);
|
||||
}
|
11
gcc/testsuite/gcc.target/i386/pr82699-4.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr82699-4.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
|
||||
/* { dg-options "-O2 -fpic -fcf-protection -pg -mfentry -fasynchronous-unwind-tables" } */
|
||||
/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
return bar (i);
|
||||
}
|
11
gcc/testsuite/gcc.target/i386/pr82699-5.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr82699-5.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
/* { dg-options "-O2 -fcf-protection -mfentry -fasynchronous-unwind-tables" } */
|
||||
/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
return bar (i);
|
||||
}
|
11
gcc/testsuite/gcc.target/i386/pr82699-6.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr82699-6.c
Normal file
@ -0,0 +1,11 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
/* { dg-options "-O2 -fcf-protection -pg -mfentry -mrecord-mcount -mnop-mcount -fasynchronous-unwind-tables" } */
|
||||
/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
|
||||
|
||||
extern int bar (int);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
return bar (i);
|
||||
}
|
Loading…
Reference in New Issue
Block a user