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:
parent
b75200689b
commit
ec8f7ce607
13 changed files with 271 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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 ();
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
24
gcc/testsuite/gcc.target/i386/cet-label-2.c
Normal file
24
gcc/testsuite/gcc.target/i386/cet-label-2.c
Normal 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);
|
||||
}
|
45
gcc/testsuite/gcc.target/i386/cet-sjlj-4.c
Normal file
45
gcc/testsuite/gcc.target/i386/cet-sjlj-4.c
Normal 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;
|
||||
}
|
48
gcc/testsuite/gcc.target/i386/cet-sjlj-5.c
Normal file
48
gcc/testsuite/gcc.target/i386/cet-sjlj-5.c
Normal 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;
|
||||
}
|
34
gcc/testsuite/gcc.target/i386/cet-switch-3.c
Normal file
34
gcc/testsuite/gcc.target/i386/cet-switch-3.c
Normal 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);
|
||||
}
|
18
gcc/testsuite/gcc.target/i386/pr82659-1.c
Normal file
18
gcc/testsuite/gcc.target/i386/pr82659-1.c
Normal 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);
|
||||
}
|
17
gcc/testsuite/gcc.target/i386/pr82659-2.c
Normal file
17
gcc/testsuite/gcc.target/i386/pr82659-2.c
Normal 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);
|
||||
}
|
20
gcc/testsuite/gcc.target/i386/pr82659-3.c
Normal file
20
gcc/testsuite/gcc.target/i386/pr82659-3.c
Normal 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);
|
||||
}
|
14
gcc/testsuite/gcc.target/i386/pr82659-4.c
Normal file
14
gcc/testsuite/gcc.target/i386/pr82659-4.c
Normal 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;
|
||||
}
|
10
gcc/testsuite/gcc.target/i386/pr82659-5.c
Normal file
10
gcc/testsuite/gcc.target/i386/pr82659-5.c
Normal 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;
|
18
gcc/testsuite/gcc.target/i386/pr82659-6.c
Normal file
18
gcc/testsuite/gcc.target/i386/pr82659-6.c
Normal 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);
|
||||
}
|
Loading…
Add table
Reference in a new issue