On Mon, Oct 23, 2017 at 2:44 PM, Tsimbalist, Igor V <igor.v.tsimbal...@intel.com> wrote: > The change will skip a whole function from endbr processing by > rest_of_insert_endbranch, > which inserts endbr not only at the beginning of the function but inside the > function's > body also. For example, tests with setjmp should fail. > > I would suggest to insert the check in rest_of_insert_endbranch function, > something like this > > if (!(lookup_attribute ("nocf_check", > TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl))) > || cgraph_node::get (fun->decl)->only_called_directly_p ()) > > Igor
Can you provide one test for each case to cover all of them? > >> -----Original Message----- >> From: Uros Bizjak [mailto:ubiz...@gmail.com] >> Sent: Monday, October 23, 2017 9:26 PM >> To: H.J. Lu <hjl.to...@gmail.com> >> Cc: gcc-patches@gcc.gnu.org; Tsimbalist, Igor V >> <igor.v.tsimbal...@intel.com> >> Subject: Re: [PATCH] i386: Don't generate ENDBR if function is only called >> directly >> >> 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 >> > -- H.J.