diff options
author | liuhongt <hongtao.liu@intel.com> | 2023-05-12 15:15:08 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2023-07-21 11:06:15 +0800 |
commit | 1c6231c05bdccab3a21abcbb75e2094ea3e98782 (patch) | |
tree | 0b6e17856085c3649c75f111f8120044bf5e7f4f | |
parent | 629ad1cfdaf542c454536d56ba9de19bd0a4b046 (diff) | |
download | gcc-1c6231c05bdccab3a21abcbb75e2094ea3e98782.zip gcc-1c6231c05bdccab3a21abcbb75e2094ea3e98782.tar.gz gcc-1c6231c05bdccab3a21abcbb75e2094ea3e98782.tar.bz2 |
Provide -fcf-protection=branch,return.
Use EnumSet instead of EnumBitSet since CF_FULL is not power of 2.
It is a bit tricky for sets classification, cf_branch and cf_return
should be in different sets, but they both "conflicts" cf_full,
cf_none. And current EnumSet don't handle this well.
So in the current implementation, only cf_full,cf_none are exclusive
to each other, but they can be combined with any cf_branch, cf_return,
cf_check. It's not perfect, but still an improvement than original
one.
gcc/ChangeLog:
PR target/89701
* common.opt: (fcf-protection=): Add EnumSet attribute to
support combination of params.
gcc/testsuite/ChangeLog:
* c-c++-common/fcf-protection-10.c: New test.
* c-c++-common/fcf-protection-11.c: New test.
* c-c++-common/fcf-protection-12.c: New test.
* c-c++-common/fcf-protection-8.c: New test.
* c-c++-common/fcf-protection-9.c: New test.
* gcc.target/i386/pr89701-1.c: New test.
* gcc.target/i386/pr89701-2.c: New test.
* gcc.target/i386/pr89701-3.c: New test.
-rw-r--r-- | gcc/common.opt | 12 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/fcf-protection-10.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/fcf-protection-11.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/fcf-protection-12.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/fcf-protection-8.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/fcf-protection-9.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr89701-1.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr89701-2.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr89701-3.c | 4 |
9 files changed, 28 insertions, 6 deletions
diff --git a/gcc/common.opt b/gcc/common.opt index 25f650e..0888c15 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1908,7 +1908,7 @@ fcf-protection Common RejectNegative Alias(fcf-protection=,full) fcf-protection= -Common Joined RejectNegative Enum(cf_protection_level) Var(flag_cf_protection) Init(CF_NONE) +Common Joined RejectNegative Enum(cf_protection_level) EnumSet Var(flag_cf_protection) Init(CF_NONE) -fcf-protection=[full|branch|return|none|check] Instrument functions with checks to verify jump/call/return control-flow transfer instructions have valid targets. @@ -1916,19 +1916,19 @@ Enum Name(cf_protection_level) Type(enum cf_protection_level) UnknownError(unknown Control-Flow Protection Level %qs) EnumValue -Enum(cf_protection_level) String(full) Value(CF_FULL) +Enum(cf_protection_level) String(full) Value(CF_FULL) Set(1) EnumValue -Enum(cf_protection_level) String(branch) Value(CF_BRANCH) +Enum(cf_protection_level) String(branch) Value(CF_BRANCH) Set(2) EnumValue -Enum(cf_protection_level) String(return) Value(CF_RETURN) +Enum(cf_protection_level) String(return) Value(CF_RETURN) Set(3) EnumValue -Enum(cf_protection_level) String(check) Value(CF_CHECK) +Enum(cf_protection_level) String(check) Value(CF_CHECK) Set(4) EnumValue -Enum(cf_protection_level) String(none) Value(CF_NONE) +Enum(cf_protection_level) String(none) Value(CF_NONE) Set(1) finstrument-functions Common Var(flag_instrument_function_entry_exit,1) diff --git a/gcc/testsuite/c-c++-common/fcf-protection-10.c b/gcc/testsuite/c-c++-common/fcf-protection-10.c new file mode 100644 index 0000000..b271d13 --- /dev/null +++ b/gcc/testsuite/c-c++-common/fcf-protection-10.c @@ -0,0 +1,2 @@ +/* { dg-do compile { target { "i?86-*-* x86_64-*-*" } } } */ +/* { dg-options "-fcf-protection=branch,check" } */ diff --git a/gcc/testsuite/c-c++-common/fcf-protection-11.c b/gcc/testsuite/c-c++-common/fcf-protection-11.c new file mode 100644 index 0000000..2e56635 --- /dev/null +++ b/gcc/testsuite/c-c++-common/fcf-protection-11.c @@ -0,0 +1,2 @@ +/* { dg-do compile { target { "i?86-*-* x86_64-*-*" } } } */ +/* { dg-options "-fcf-protection=branch,return" } */ diff --git a/gcc/testsuite/c-c++-common/fcf-protection-12.c b/gcc/testsuite/c-c++-common/fcf-protection-12.c new file mode 100644 index 0000000..b39c2f8 --- /dev/null +++ b/gcc/testsuite/c-c++-common/fcf-protection-12.c @@ -0,0 +1,2 @@ +/* { dg-do compile { target { "i?86-*-* x86_64-*-*" } } } */ +/* { dg-options "-fcf-protection=return,branch" } */ diff --git a/gcc/testsuite/c-c++-common/fcf-protection-8.c b/gcc/testsuite/c-c++-common/fcf-protection-8.c new file mode 100644 index 0000000..3b97095 --- /dev/null +++ b/gcc/testsuite/c-c++-common/fcf-protection-8.c @@ -0,0 +1,2 @@ +/* { dg-do compile { target { "i?86-*-* x86_64-*-*" } } } */ +/* { dg-options "-fcf-protection=branch,none" } */ diff --git a/gcc/testsuite/c-c++-common/fcf-protection-9.c b/gcc/testsuite/c-c++-common/fcf-protection-9.c new file mode 100644 index 0000000..6a37e74 --- /dev/null +++ b/gcc/testsuite/c-c++-common/fcf-protection-9.c @@ -0,0 +1,2 @@ +/* { dg-do compile { target { "i?86-*-* x86_64-*-*" } } } */ +/* { dg-options "-fcf-protection=branch,full" } */ diff --git a/gcc/testsuite/gcc.target/i386/pr89701-1.c b/gcc/testsuite/gcc.target/i386/pr89701-1.c new file mode 100644 index 0000000..1879c9a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr89701-1.c @@ -0,0 +1,4 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-fcf-protection=branch,return" } */ +/* { dg-final { scan-assembler-times ".note.gnu.property" 1 } } */ +/* { dg-final { scan-assembler-times ".long 0x3" 1 } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr89701-2.c b/gcc/testsuite/gcc.target/i386/pr89701-2.c new file mode 100644 index 0000000..d510057 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr89701-2.c @@ -0,0 +1,4 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-fcf-protection=return,branch" } */ +/* { dg-final { scan-assembler-times ".note.gnu.property" 1 } } */ +/* { dg-final { scan-assembler-times ".long 0x3" 1 } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr89701-3.c b/gcc/testsuite/gcc.target/i386/pr89701-3.c new file mode 100644 index 0000000..88afb54 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr89701-3.c @@ -0,0 +1,4 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-fcf-protection=return,none" } */ +/* { dg-final { scan-assembler-times ".note.gnu.property" 1 } } */ +/* { dg-final { scan-assembler-times ".long 0x2" 1 } } */ |