annotate gcc/testsuite/gcc.dg/split-5.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 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-require-effective-target split_stack } */
kono
parents:
diff changeset
3 /* { dg-require-effective-target pthread_h } */
kono
parents:
diff changeset
4 /* { dg-require-effective-target ucontext_h } */
kono
parents:
diff changeset
5 /* { dg-options "-pthread -fsplit-stack" } */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #include <stdlib.h>
kono
parents:
diff changeset
8 #include <pthread.h>
kono
parents:
diff changeset
9 #include <ucontext.h>
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 extern void __splitstack_getcontext (void *context[10]);
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 extern void __splitstack_setcontext (void *context[10]);
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 extern void *__splitstack_makecontext (size_t, void *context[10], size_t *);
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 extern void __splitstack_block_signals (int *, int *);
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 extern void __splitstack_block_signals_context (void *context[10], int *,
kono
parents:
diff changeset
20 int *);
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 extern void *__splitstack_find (void *, void *, size_t *, void **, void **,
kono
parents:
diff changeset
23 void **);
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 extern void *__splitstack_find_context (void *context[10], size_t *, void **,
kono
parents:
diff changeset
26 void **, void **);
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 static ucontext_t c1;
kono
parents:
diff changeset
29 static void *s1[10];
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 static ucontext_t c2;
kono
parents:
diff changeset
32 static void *s2[10];
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 static void swap (ucontext_t *, void *fs[10], ucontext_t *, void *ts[10])
kono
parents:
diff changeset
35 __attribute__ ((no_split_stack));
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 static void
kono
parents:
diff changeset
38 swap (ucontext_t *fu, void *fs[10], ucontext_t *tu, void *ts[10])
kono
parents:
diff changeset
39 {
kono
parents:
diff changeset
40 __splitstack_getcontext (fs);
kono
parents:
diff changeset
41 __splitstack_setcontext (ts);
kono
parents:
diff changeset
42 swapcontext (fu, tu);
kono
parents:
diff changeset
43 __splitstack_setcontext (fs);
kono
parents:
diff changeset
44 }
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 /* Use a noinline function to ensure that the buffer is not removed
kono
parents:
diff changeset
47 from the stack. */
kono
parents:
diff changeset
48 static void use_buffer (char *buf) __attribute__ ((noinline));
kono
parents:
diff changeset
49 static void
kono
parents:
diff changeset
50 use_buffer (char *buf)
kono
parents:
diff changeset
51 {
kono
parents:
diff changeset
52 buf[0] = '\0';
kono
parents:
diff changeset
53 }
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 static void
kono
parents:
diff changeset
56 down (int i, const char *msg, ucontext_t *me, void *mes[10],
kono
parents:
diff changeset
57 ucontext_t *other, void *others[10])
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 char buf[10000];
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 if (i > 0)
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 use_buffer (buf);
kono
parents:
diff changeset
64 swap (me, mes, other, others);
kono
parents:
diff changeset
65 down (i - 1, msg, me, mes, other, others);
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67 else
kono
parents:
diff changeset
68 {
kono
parents:
diff changeset
69 int c = 0;
kono
parents:
diff changeset
70 void *stack;
kono
parents:
diff changeset
71 size_t stack_size;
kono
parents:
diff changeset
72 void *next_segment = NULL;
kono
parents:
diff changeset
73 void *next_sp = NULL;
kono
parents:
diff changeset
74 void *initial_sp = NULL;
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 stack = __splitstack_find_context (mes, &stack_size, &next_segment,
kono
parents:
diff changeset
77 &next_sp, &initial_sp);
kono
parents:
diff changeset
78 if (stack != NULL)
kono
parents:
diff changeset
79 {
kono
parents:
diff changeset
80 ++c;
kono
parents:
diff changeset
81 while (__splitstack_find (next_segment, next_sp, &stack_size,
kono
parents:
diff changeset
82 &next_segment, &next_sp, &initial_sp)
kono
parents:
diff changeset
83 != NULL)
kono
parents:
diff changeset
84 ++c;
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86 }
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 static void
kono
parents:
diff changeset
90 go1 (void)
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 down (1000, "go1", &c1, s1, &c2, s2);
kono
parents:
diff changeset
93 pthread_exit (NULL);
kono
parents:
diff changeset
94 }
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 static void
kono
parents:
diff changeset
97 go2 (void)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 down (1000, "go2", &c2, s2, &c1, s1);
kono
parents:
diff changeset
100 pthread_exit (NULL);
kono
parents:
diff changeset
101 }
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 struct thread_context
kono
parents:
diff changeset
104 {
kono
parents:
diff changeset
105 ucontext_t *u;
kono
parents:
diff changeset
106 void **s;
kono
parents:
diff changeset
107 };
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 static void *start_thread (void *) __attribute__ ((no_split_stack));
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 static void *
kono
parents:
diff changeset
112 start_thread (void *context)
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 struct thread_context *tc = (struct thread_context *) context;
kono
parents:
diff changeset
115 int block;
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 block = 0;
kono
parents:
diff changeset
118 __splitstack_block_signals (&block, NULL);
kono
parents:
diff changeset
119 __splitstack_setcontext (tc->s);
kono
parents:
diff changeset
120 setcontext (tc->u);
kono
parents:
diff changeset
121 abort ();
kono
parents:
diff changeset
122 }
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 int
kono
parents:
diff changeset
125 main (int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)))
kono
parents:
diff changeset
126 {
kono
parents:
diff changeset
127 pthread_t tid;
kono
parents:
diff changeset
128 int err;
kono
parents:
diff changeset
129 size_t size;
kono
parents:
diff changeset
130 struct thread_context tc;
kono
parents:
diff changeset
131 int block;
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 if (getcontext (&c1) < 0)
kono
parents:
diff changeset
134 abort ();
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 c2 = c1;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 c1.uc_stack.ss_sp = __splitstack_makecontext (8192, &s1[0], &size);
kono
parents:
diff changeset
139 if (c1.uc_stack.ss_sp == NULL)
kono
parents:
diff changeset
140 abort ();
kono
parents:
diff changeset
141 c1.uc_stack.ss_flags = 0;
kono
parents:
diff changeset
142 c1.uc_stack.ss_size = size;
kono
parents:
diff changeset
143 c1.uc_link = NULL;
kono
parents:
diff changeset
144 block = 0;
kono
parents:
diff changeset
145 __splitstack_block_signals_context (&s1[0], &block, NULL);
kono
parents:
diff changeset
146 makecontext (&c1, go1, 0);
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 c2.uc_stack.ss_sp = __splitstack_makecontext (8192, &s2[0], &size);
kono
parents:
diff changeset
149 if (c2.uc_stack.ss_sp == NULL)
kono
parents:
diff changeset
150 abort ();
kono
parents:
diff changeset
151 c2.uc_stack.ss_flags = 0;
kono
parents:
diff changeset
152 c2.uc_stack.ss_size = size;
kono
parents:
diff changeset
153 c2.uc_link = NULL;
kono
parents:
diff changeset
154 __splitstack_block_signals_context (&s2[0], &block, NULL);
kono
parents:
diff changeset
155 makecontext (&c2, go2, 0);
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 block = 0;
kono
parents:
diff changeset
158 __splitstack_block_signals (&block, NULL);
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 tc.u = &c1;
kono
parents:
diff changeset
161 tc.s = &s1[0];
kono
parents:
diff changeset
162 err = pthread_create (&tid, NULL, start_thread, &tc);
kono
parents:
diff changeset
163 if (err != 0)
kono
parents:
diff changeset
164 abort ();
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 err = pthread_join (tid, NULL);
kono
parents:
diff changeset
167 if (err != 0)
kono
parents:
diff changeset
168 abort ();
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 return 0;
kono
parents:
diff changeset
171 }