mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-24 03:14:08 +08:00
hardcfr: make builtin_return tests more portable [PR112334]
Rework __builtin_return tests to explicitly call __builtin_apply and use its return value rather than anything else. Also require untyped_assembly. Avoid the noise out of exceptions escaping the builtin-applied function, but add a test to cover their effects as well. for gcc/testsuite/ChangeLog PR target/112334 * c-c++-common/torture/harden-cfr-bret.c: Rework for stricter untyped_return requirements. Require untyped_assembly. * c-c++-common/torture/harden-cfr-bret-except.c: New. * c-c++-common/torture/harden-cfr-bret-always.c: Require untyped_assembly. * c-c++-common/torture/harden-cfr-bret-never.c: Likewise. * c-c++-common/torture/harden-cfr-bret-noopt.c: Likewise. * c-c++-common/torture/harden-cfr-bret-noret.c: Likewise. * c-c++-common/torture/harden-cfr-bret-no-xthrow.c: Likewise. * c-c++-common/torture/harden-cfr-bret-nothrow.c: Likewise. * c-c++-common/torture/harden-cfr-bret-retcl.c: Likewise.
This commit is contained in:
parent
c4a49ebd1e
commit
b8edb812ff
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=always -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=always -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even enabling all checks before noreturn calls (leaving
|
||||
returning calls enabled), we get checks before __builtin_return without
|
||||
|
17
gcc/testsuite/c-c++-common/torture/harden-cfr-bret-except.c
Normal file
17
gcc/testsuite/c-c++-common/torture/harden-cfr-bret-except.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fexceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, with exceptions enabled, even in C, the calls initiated by
|
||||
builtin_apply are enclosed in cleanup handlers that add extra checks.
|
||||
Unfortunately, declaring foobar as nothrow is not enough to avoid the
|
||||
handler around the builtin_apply call, so the other bret tests all use
|
||||
-fno-exceptions. */
|
||||
|
||||
#include "harden-cfr-bret.c"
|
||||
|
||||
/* With exceptions, we get an extra check per function, to check before
|
||||
propagating exceptions, so it's 3 in f and 2 in g. */
|
||||
/* { dg-final { scan-tree-dump-times "__hardcfr_check" 5 "hardcfr" } } */
|
||||
/* The extra check in g also removes the possibility of inlining the check. */
|
||||
/* { dg-final { scan-tree-dump-times "__builtin_trap" 0 "hardcfr" } } */
|
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=never -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=never -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even enabling checks before never noreturn calls (leaving
|
||||
returning calls enabled), we get checks before __builtin_return without
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=no-xthrow -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=no-xthrow -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even enabling checks before no-xthrow-throwing noreturn calls
|
||||
(leaving returning calls enabled), we get checks before __builtin_return
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=never -fno-hardcfr-check-returning-calls -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=never -fno-hardcfr-check-returning-calls -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even disabling checks before both noreturn and returning
|
||||
calls, we still get checks before __builtin_return. */
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fno-hardcfr-check-returning-calls -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fno-hardcfr-check-returning-calls -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even disabling checks before returning calls (leaving noreturn
|
||||
calls enabled), we still get checks before __builtin_return. */
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=nothrow -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=nothrow -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even enabling checks before nothrow noreturn calls (leaving
|
||||
returning calls enabled), we get checks before __builtin_return without
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=never -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fhardcfr-check-noreturn-calls=never -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
/* Check that, even disabling checks before noreturn calls (leaving returning
|
||||
calls enabled), we still get checks before __builtin_return. */
|
||||
|
@ -1,14 +1,27 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-options "-fharden-control-flow-redundancy -fno-exceptions -fdump-tree-hardcfr -ffat-lto-objects" } */
|
||||
/* { dg-require-effective-target untyped_assembly } */
|
||||
|
||||
int f(int i) {
|
||||
extern int foobar (void);
|
||||
|
||||
#if __cplusplus
|
||||
typedef void (*fnt)(...);
|
||||
#else
|
||||
typedef void (*fnt)();
|
||||
#endif
|
||||
|
||||
int i;
|
||||
|
||||
int f(void) {
|
||||
if (i)
|
||||
__builtin_return (&i);
|
||||
__builtin_return (__builtin_apply ((fnt)foobar,
|
||||
__builtin_apply_args (), 0));
|
||||
return i;
|
||||
}
|
||||
|
||||
int g(int i) {
|
||||
__builtin_return (&i);
|
||||
int g(void) {
|
||||
__builtin_return (__builtin_apply ((fnt)foobar,
|
||||
__builtin_apply_args (), 0));
|
||||
}
|
||||
|
||||
/* Out-of-line checking, before both builtin_return and return in f. */
|
||||
|
Loading…
Reference in New Issue
Block a user