On Sun, Oct 22, 2017 at 4:13 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> There is no need to insert ENDBR instruction if function is only called
> directly.
>
> OK for trunk if there is no regressions?

Patch needs to be OK'd by Igor first.

Uros.

> 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
>

Reply via email to