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