i386: Don't insert ENDBR at function entrance when called directly

There is no need to insert ENDBR instruction at function entrance if
function is only called directly.

gcc/

	PR target/82659
	* config/i386/i386.c (rest_of_insert_endbranch): Don't insert
	ENDBR instruction at function entrance if function is only
	called directly.

gcc/testsuite/

	PR target/82659
	* gcc.target/i386/cet-label-2.c: New test.
	* gcc.target/i386/cet-sjlj-4.c: Likewise.
	* gcc.target/i386/cet-sjlj-5.c: Likewise.
	* gcc.target/i386/cet-switch-3.c: Likewise.
	* gcc.target/i386/pr82659-1.c: Likewise.
	* gcc.target/i386/pr82659-2.c: Likewise.
	* gcc.target/i386/pr82659-3.c: Likewise.
	* gcc.target/i386/pr82659-4.c: Likewise.
	* gcc.target/i386/pr82659-5.c: Likewise.
	* gcc.target/i386/pr82659-6.c: Likewise.

From-SVN: r254040
This commit is contained in:
H.J. Lu 2017-10-24 10:52:50 +00:00 committed by H.J. Lu
parent b75200689b
commit ec8f7ce607
13 changed files with 271 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2017-10-24 H.J. Lu <hongjiu.lu@intel.com>
PR target/82659
* config/i386/i386.c (rest_of_insert_endbranch): Don't insert
ENDBR instruction at function entrance if function is only
called directly.
2017-10-24 Jakub Jelinek <jakub@redhat.com>
PR target/82628

View file

@ -2587,7 +2587,8 @@ rest_of_insert_endbranch (void)
nocf_check attribute. This will allow to reduce the number of EB. */
if (!lookup_attribute ("nocf_check",
TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl))))
TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl)))
&& !cgraph_node::get (cfun->decl)->only_called_directly_p ())
{
cet_eb = gen_nop_endbr ();

View file

@ -1,3 +1,17 @@
2017-10-24 H.J. Lu <hongjiu.lu@intel.com>
PR target/82659
* gcc.target/i386/cet-label-2.c: New test.
* gcc.target/i386/cet-sjlj-4.c: Likewise.
* gcc.target/i386/cet-sjlj-5.c: Likewise.
* gcc.target/i386/cet-switch-3.c: Likewise.
* gcc.target/i386/pr82659-1.c: Likewise.
* gcc.target/i386/pr82659-2.c: Likewise.
* gcc.target/i386/pr82659-3.c: Likewise.
* gcc.target/i386/pr82659-4.c: Likewise.
* gcc.target/i386/pr82659-5.c: Likewise.
* gcc.target/i386/pr82659-6.c: Likewise.
2017-10-23 Sandra Loosemore <sandra@codesourcery.com>
* gcc.target/nios2/cdx-branch.c: Fix broken test.

View file

@ -0,0 +1,24 @@
/* Verify that CET works. */
/* { dg-do compile } */
/* { dg-options "-O -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times "endbr32" 3 { target ia32 } } } */
/* { dg-final { scan-assembler-times "endbr64" 3 { target { ! ia32 } } } } */
__attribute__ ((noinline, noclone))
static int
func (int arg)
{
static void *array[] = { &&foo, &&bar };
goto *array[arg];
foo:
return arg*111;
bar:
return arg*777;
}
int
foo (int arg)
{
return func (arg);
}

View file

@ -0,0 +1,45 @@
/* { dg-do compile } */
/* { dg-options "-O -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times "endbr32" 3 { target ia32 } } } */
/* { dg-final { scan-assembler-times "endbr64" 3 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "rdssp\[dq]" 2 } } */
/* { dg-final { scan-assembler-times "incssp\[dq]" 1 } } */
/* Based on gcc.dg/setjmp-3.c. */
void *buf[5];
extern void abort (void);
void
raise0 (void)
{
__builtin_longjmp (buf, 1);
}
__attribute__ ((noinline, noclone))
static int
execute (int cmd)
{
int last = 0;
if (__builtin_setjmp (buf) == 0)
while (1)
{
last = 1;
raise0 ();
}
if (last == 0)
return 0;
else
return cmd;
}
int main(void)
{
if (execute (1) == 0)
abort ();
return 0;
}

View file

@ -0,0 +1,48 @@
/* { dg-do compile } */
/* { dg-options "-O -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times "endbr32" 2 { target ia32 } } } */
/* { dg-final { scan-assembler-times "endbr64" 2 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "call _setjmp" 1 } } */
/* { dg-final { scan-assembler-times "call longjmp" 1 } } */
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
static int bar (int);
__attribute__ ((noinline, noclone))
static int
foo (int i)
{
int j = i * 11;
if (!setjmp (buf))
{
j += 33;
printf ("After setjmp: j = %d\n", j);
bar (j);
}
return j + i;
}
__attribute__ ((noinline, noclone))
static int
bar (int i)
{
int j = i;
j -= 111;
printf ("In longjmp: j = %d\n", j);
longjmp (buf, 1);
return j;
}
int
main ()
{
foo (10);
return 0;
}

View file

@ -0,0 +1,34 @@
/* Verify that CET works. */
/* { dg-do compile } */
/* { dg-options "-O -fcf-protection -mcet -mcet-switch" } */
/* { dg-final { scan-assembler-times "endbr32" 12 { target ia32 } } } */
/* { dg-final { scan-assembler-times "endbr64" 12 { target { ! ia32 } } } } */
/* { dg-final { scan-assembler-times "\[ \t]+jmp\[ \t]+\[*]" 1 } } */
void func2 (int);
__attribute__ ((noinline, noclone))
static int
func1 (int arg)
{
switch (arg)
{
case 1: func2 (arg*100);
case 2: func2 (arg*300);
case 5: func2 (arg*500);
case 8: func2 (arg*700);
case 7: func2 (arg*900);
case -1: func2 (arg*-100);
case -2: func2 (arg*-300);
case -5: func2 (arg*-500);
case -7: func2 (arg*-700);
case -9: func2 (arg*-900);
}
return 0;
}
int
foo (int arg)
{
return func1 (arg);
}

View file

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times {\mendbr} 1 } } */
extern int x;
static void
__attribute__ ((noinline, noclone))
test (int i)
{
x = i;
}
void
bar (int i)
{
test (i);
}

View file

@ -0,0 +1,17 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times {\mendbr} 2 } } */
extern int x;
void
test (int i)
{
x = i;
}
void
bar (int i)
{
test (i);
}

View file

@ -0,0 +1,20 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times {\mendbr} 2 } } */
extern int x;
static void
__attribute__ ((noinline, noclone))
test (int i)
{
x = i;
}
extern __typeof (test) foo __attribute__ ((alias ("test")));
void
bar (int i)
{
test (i);
}

View file

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times {\mendbr} 2 } } */
static void
test (void)
{
}
void *
bar (void)
{
return test;
}

View file

@ -0,0 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times {\mendbr} 1 } } */
static void
test (void)
{
}
void (*test_p) (void) = test;

View file

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fcf-protection -mcet" } */
/* { dg-final { scan-assembler-times {\mendbr} 2 } } */
extern int x;
__attribute__ ((visibility ("hidden")))
void
test (int i)
{
x = i;
}
void
bar (int i)
{
test (i);
}