annotate gcc/testsuite/gcc.dg/stack-check-2.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* The goal here is to ensure that we never consider a call to a noreturn
kono
parents:
diff changeset
2 function as a potential tail call.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 Right now GCC discovers potential tail calls by looking at the
kono
parents:
diff changeset
5 predecessors of the exit block. A call to a non-return function
kono
parents:
diff changeset
6 has no successors and thus can never match that first filter.
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 But that could change one day and we want to catch it. The problem
kono
parents:
diff changeset
9 is the compiler could potentially optimize a tail call to a nonreturn
kono
parents:
diff changeset
10 function, even if the caller has a frame. That breaks the assumption
kono
parents:
diff changeset
11 that calls probe *sp when saving the return address that some targets
kono
parents:
diff changeset
12 depend on to elide stack probes. */
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 /* { dg-do compile } */
kono
parents:
diff changeset
15 /* { dg-options "-O2 -fstack-clash-protection -fdump-tree-tailc -fdump-tree-optimized" } */
kono
parents:
diff changeset
16 /* { dg-require-effective-target supports_stack_clash_protection } */
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 extern void foo (void) __attribute__ ((__noreturn__));
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 void
kono
parents:
diff changeset
22 test_direct_1 (void)
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 foo ();
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 void
kono
parents:
diff changeset
28 test_direct_2 (void)
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 return foo ();
kono
parents:
diff changeset
31 }
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 void (*indirect)(void)__attribute__ ((noreturn));
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 void
kono
parents:
diff changeset
37 test_indirect_1 ()
kono
parents:
diff changeset
38 {
kono
parents:
diff changeset
39 (*indirect)();
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 void
kono
parents:
diff changeset
43 test_indirect_2 (void)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 return (*indirect)();;
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 typedef void (*pvfn)() __attribute__ ((noreturn));
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 void (*indirect_casted)(void);
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 void
kono
parents:
diff changeset
54 test_indirect_casted_1 ()
kono
parents:
diff changeset
55 {
kono
parents:
diff changeset
56 (*(pvfn)indirect_casted)();
kono
parents:
diff changeset
57 }
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 void
kono
parents:
diff changeset
60 test_indirect_casted_2 (void)
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 return (*(pvfn)indirect_casted)();
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64 /* { dg-final { scan-tree-dump-not "tail call" "tailc" } } */
kono
parents:
diff changeset
65 /* { dg-final { scan-tree-dump-not "tail call" "optimized" } } */
kono
parents:
diff changeset
66