1 #include <stdlib.h>
2 #include <stdio.h>
3 
4 extern "C" {
5     extern void foo_clean(void* x);
6     extern void bar_clean(void* x);
7     extern void register_foo_local(int* x);
8     extern void register_bar_local(int* x);
9     extern void done_foo();
10     extern void done_bar();
11     extern void foo();
12 }
13 
14 static int* foo_x = NULL;
register_foo_local(int * x)15 void register_foo_local(int* x)
16 {
17     foo_x = x;
18 }
19 
20 static int* bar_x = NULL;
register_bar_local(int * x)21 void register_bar_local(int* x)
22 {
23     bar_x = x;
24 }
25 
26 static bool foo_clean_called = false;
foo_clean(void * x)27 void foo_clean(void* x)
28 {
29     if  ( foo_x == NULL )
30         abort();
31     if ( foo_x != (int*)x)
32         abort();
33     foo_clean_called = true;
34 }
35 
36 static bool bar_clean_called = false;
bar_clean(void * x)37 void bar_clean(void* x)
38 {
39     if  ( bar_x == NULL )
40         abort();
41     if ( bar_x != (int*)x)
42         abort();
43     bar_clean_called = true;
44 }
45 
done_foo()46 void done_foo()
47 {
48 }
49 
done_bar()50 void done_bar()
51 {
52     throw "done";
53 }
54 
55 
56 //
57 // foo() is in gcc_personality_test.c and calls bar() which
58 // calls done_bar() which throws an exception.
59 // main() will catch the exception and verify that the cleanup
60 // routines for foo() and bar() were called by the personality
61 // function.
62 //
main()63 int main()
64 {
65     try {
66         foo();
67     }
68     catch(...) {
69         if ( !foo_clean_called )
70             abort();
71         if ( !bar_clean_called )
72             abort();
73 		return 0;
74     }
75 	abort();
76 }
77