There is no need to insert ENDBR instruction if function is only called directly.
OK for trunk if there is no regressions? H.J. ---- gcc/ PR target/82659 * config/i386/i386.c (pass_insert_endbranch::gate): Return false if function is only called directly. gcc/testsuite/ PR target/82659 * gcc.target/i386/pr82659-1.c: New test. * 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. --- gcc/config/i386/i386.c | 6 ++++-- gcc/testsuite/gcc.target/i386/pr82659-1.c | 19 +++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr82659-2.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr82659-3.c | 21 +++++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr82659-4.c | 15 +++++++++++++++ gcc/testsuite/gcc.target/i386/pr82659-5.c | 10 ++++++++++ gcc/testsuite/gcc.target/i386/pr82659-6.c | 19 +++++++++++++++++++ 7 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr82659-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr82659-2.c create mode 100644 gcc/testsuite/gcc.target/i386/pr82659-3.c create mode 100644 gcc/testsuite/gcc.target/i386/pr82659-4.c create mode 100644 gcc/testsuite/gcc.target/i386/pr82659-5.c create mode 100644 gcc/testsuite/gcc.target/i386/pr82659-6.c diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index fb0b7e71469..b86504378ae 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2693,9 +2693,11 @@ public: {} /* opt_pass methods: */ - virtual bool gate (function *) + virtual bool gate (function *fun) { - return ((flag_cf_protection & CF_BRANCH) && TARGET_IBT); + return ((flag_cf_protection & CF_BRANCH) + && TARGET_IBT + && !cgraph_node::get (fun->decl)->only_called_directly_p ()); } virtual unsigned int execute (function *) diff --git a/gcc/testsuite/gcc.target/i386/pr82659-1.c b/gcc/testsuite/gcc.target/i386/pr82659-1.c new file mode 100644 index 00000000000..8f0a6906815 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82659-1.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcf-protection -mcet" } */ +/* { dg-final { scan-assembler-times "endbr32" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times "endbr64" 1 { target { ! ia32 } } } } */ + +extern int x; + +static void +__attribute__ ((noinline, noclone)) +test (int i) +{ + x = i; +} + +void +bar (int i) +{ + test (i); +} diff --git a/gcc/testsuite/gcc.target/i386/pr82659-2.c b/gcc/testsuite/gcc.target/i386/pr82659-2.c new file mode 100644 index 00000000000..228a20006b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82659-2.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcf-protection -mcet" } */ +/* { dg-final { scan-assembler-times "endbr32" 2 { target ia32 } } } */ +/* { dg-final { scan-assembler-times "endbr64" 2 { target { ! ia32 } } } } */ + +extern int x; + +void +test (int i) +{ + x = i; +} + +void +bar (int i) +{ + test (i); +} diff --git a/gcc/testsuite/gcc.target/i386/pr82659-3.c b/gcc/testsuite/gcc.target/i386/pr82659-3.c new file mode 100644 index 00000000000..6ae23e40abc --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82659-3.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcf-protection -mcet" } */ +/* { dg-final { scan-assembler-times "endbr32" 2 { target ia32 } } } */ +/* { dg-final { scan-assembler-times "endbr64" 2 { target { ! ia32 } } } } */ + +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); +} diff --git a/gcc/testsuite/gcc.target/i386/pr82659-4.c b/gcc/testsuite/gcc.target/i386/pr82659-4.c new file mode 100644 index 00000000000..ca87264e98b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82659-4.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcf-protection -mcet" } */ +/* { dg-final { scan-assembler-times "endbr32" 2 { target ia32 } } } */ +/* { dg-final { scan-assembler-times "endbr64" 2 { target { ! ia32 } } } } */ + +static void +test (void) +{ +} + +void * +bar (void) +{ + return test; +} diff --git a/gcc/testsuite/gcc.target/i386/pr82659-5.c b/gcc/testsuite/gcc.target/i386/pr82659-5.c new file mode 100644 index 00000000000..c34eade0f90 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82659-5.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcf-protection -mcet" } */ +/* { dg-final { scan-assembler-times "endbr32" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times "endbr64" 1 { target { ! ia32 } } } } */ +static void +test (void) +{ +} + +void (*test_p) (void) = test; diff --git a/gcc/testsuite/gcc.target/i386/pr82659-6.c b/gcc/testsuite/gcc.target/i386/pr82659-6.c new file mode 100644 index 00000000000..b4ffd65c74f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82659-6.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcf-protection -mcet" } */ +/* { dg-final { scan-assembler-times "endbr32" 2 { target ia32 } } } */ +/* { dg-final { scan-assembler-times "endbr64" 2 { target { ! ia32 } } } } */ + +extern int x; + + __attribute__ ((visibility ("hidden"))) +void +test (int i) +{ + x = i; +} + +void +bar (int i) +{ + test (i); +} -- 2.13.6