16
|
1
|
|
2 typedef void (*RET_FUNC)(int, void *);
|
|
3
|
|
4 int main(int argc, char **argv)
|
|
5 {
|
|
6 int r;
|
|
7 r = f();
|
|
8 printf("%d\n", r);
|
|
9 }
|
|
10
|
|
11 //void z(RET_FUNC ret, void *fp)
|
|
12 __code z(RET_FUNC ret, void *fp)
|
|
13 {
|
|
14 printf("z: fp=0x%x\n", __builtin_frame_address(0));
|
|
15 ret(5, fp);
|
|
16 }
|
|
17 __code i(RET_FUNC ret, void *fp)
|
|
18 {
|
|
19 printf("i: fp=0x%x\n", __builtin_frame_address(0));
|
|
20 goto z(ret, fp);
|
|
21 }
|
|
22 __code h(RET_FUNC ret, void *fp)
|
|
23 {
|
|
24 printf("h: fp=0x%x\n", __builtin_frame_address(0));
|
|
25 goto i(ret, fp);
|
|
26 }
|
|
27 __code g(RET_FUNC ret, void *fp)
|
|
28 {
|
|
29 printf("g: fp=0x%x\n", __builtin_frame_address(0));
|
|
30 goto h(ret, fp);
|
|
31 }
|
|
32
|
|
33 int f()
|
|
34 {
|
|
35 __label__ exit0;
|
|
36 int retval;
|
|
37 //void (*ret)(int retval_, void *fp);
|
|
38
|
|
39 /*
|
|
40 ret = ({
|
|
41 void __return_func(int retval_, void *fp){
|
|
42 retval = retval_;
|
|
43 goto exit0;
|
|
44 }
|
|
45 __return_func;
|
|
46 });
|
|
47 */
|
|
48 printf("f0: fp = 0x%x\n", __builtin_frame_address(0));
|
|
49 void __return_func(int retval_, void *fp){
|
|
50 retval = retval_;
|
|
51 goto exit0;
|
|
52 }
|
|
53 //ret = __return_func;
|
|
54
|
|
55 printf("f1: fp = 0x%x\n", __builtin_frame_address(0));
|
|
56
|
|
57 //g(__return_func, __builtin_frame_address(0));
|
|
58 goto g(__return_func, __builtin_frame_address(0));
|
|
59
|
|
60 printf("bad\n");
|
|
61
|
|
62 exit0:
|
|
63 printf("f2: fp = 0x%x\n", __builtin_frame_address(0));
|
|
64 return retval;
|
|
65 }
|
|
66
|
|
67
|
|
68
|