Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/cleanup-9.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */ | |
2 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ | |
3 /* Verify that cleanups work with exception handling through realtime | |
4 signal frames. */ | |
5 | |
6 #include <unwind.h> | |
7 #include <stdlib.h> | |
8 #include <signal.h> | |
9 #include <string.h> | |
10 | |
11 static _Unwind_Reason_Code | |
12 force_unwind_stop (int version, _Unwind_Action actions, | |
13 _Unwind_Exception_Class exc_class, | |
14 struct _Unwind_Exception *exc_obj, | |
15 struct _Unwind_Context *context, | |
16 void *stop_parameter) | |
17 { | |
18 if (actions & _UA_END_OF_STACK) | |
19 abort (); | |
20 return _URC_NO_REASON; | |
21 } | |
22 | |
23 static void force_unwind () | |
24 { | |
25 struct _Unwind_Exception *exc = malloc (sizeof (*exc)); | |
26 memset (&exc->exception_class, 0, sizeof (exc->exception_class)); | |
27 exc->exception_cleanup = 0; | |
28 | |
29 #ifndef __USING_SJLJ_EXCEPTIONS__ | |
30 _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); | |
31 #else | |
32 _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); | |
33 #endif | |
34 | |
35 abort (); | |
36 } | |
37 | |
38 int count; | |
39 char *null; | |
40 | |
41 static void counter (void *p __attribute__((unused))) | |
42 { | |
43 ++count; | |
44 } | |
45 | |
46 static void handler (void *p __attribute__((unused))) | |
47 { | |
48 if (count != 2) | |
49 abort (); | |
50 exit (0); | |
51 } | |
52 | |
53 static int __attribute__((noinline)) fn5 () | |
54 { | |
55 char dummy __attribute__((cleanup (counter))); | |
56 force_unwind (); | |
57 return 0; | |
58 } | |
59 | |
60 static void fn4 (int sig, siginfo_t *info, void *ctx) | |
61 { | |
62 char dummy __attribute__((cleanup (counter))); | |
63 fn5 (); | |
64 null = NULL; | |
65 } | |
66 | |
67 static void fn3 () | |
68 { | |
69 abort (); | |
70 } | |
71 | |
72 static int __attribute__((noinline)) fn2 () | |
73 { | |
74 *null = 0; | |
75 fn3 (); | |
76 return 0; | |
77 } | |
78 | |
79 static int __attribute__((noinline)) fn1 () | |
80 { | |
81 struct sigaction s; | |
82 sigemptyset (&s.sa_mask); | |
83 s.sa_sigaction = fn4; | |
84 s.sa_flags = SA_RESETHAND | SA_SIGINFO; | |
85 sigaction (SIGSEGV, &s, NULL); | |
86 sigaction (SIGBUS, &s, NULL); | |
87 fn2 (); | |
88 return 0; | |
89 } | |
90 | |
91 static int __attribute__((noinline)) fn0 () | |
92 { | |
93 char dummy __attribute__((cleanup (handler))); | |
94 fn1 (); | |
95 null = 0; | |
96 return 0; | |
97 } | |
98 | |
99 int main() | |
100 { | |
101 fn0 (); | |
102 abort (); | |
103 } |