]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.base/restore.c
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.base / restore.c
1 /* Test GDB's ability to restore saved registers from stack frames
2 when using the `return' command.
3 Jim Blandy <jimb@cygnus.com> --- December 1998 */
4
5 #include <stdio.h>
6
7 /* This is the Emacs Lisp expression I used to generate the functions
8 in this file. If people modify the functions manually, instead of
9 changing this expression and re-running it, then evaluating this
10 expression could wipe out their work, so you probably shouldn't
11 re-run it. But I leave it here for reference.
12
13 (defun callee (n) (format "callee%d" n))
14 (defun caller (n) (format "caller%d" n))
15 (defun local (n) (format "l%d" n))
16 (defun local-sum (n)
17 (let ((j 1))
18 (while (<= j n)
19 (insert (local j))
20 (if (< j n) (insert "+"))
21 (setq j (1+ j)))))
22 (defun local-chain (n previous first-end)
23 (let ((j 1))
24 (while (<= j n)
25 (insert " register int " (local j)
26 " = increment (" previous ");")
27 (if first-end
28 (progn
29 (insert " /" "* " first-end " *" "/")
30 (setq first-end nil)))
31 (insert "\n")
32 (setq previous (local j))
33 (setq j (1+ j))))
34 previous)
35
36 (save-excursion
37 (let ((limit 5))
38 (goto-char (point-max))
39 (search-backward "generated code starts here")
40 (forward-line 1)
41 (let ((start (point)))
42 (search-forward "generated code ends here")
43 (forward-line 0)
44 (delete-region start (point)))
45
46 ;; Generate callee functions.
47 (let ((i 0))
48 (while (<= i limit)
49 (insert (format "/%s Returns n * %d + %d %s/\n"
50 "*" i (/ (+ i (* i i)) 2) "*"))
51 (insert "int\n")
52 (insert (callee i) " (int n)\n")
53 (insert "{\n")
54 (local-chain i "n" (callee i))
55 (insert " return ")
56 (if (<= i 0) (insert "n")
57 (local-sum i))
58 (insert ";\n")
59 (insert "}\n\n")
60 (setq i (1+ i))))
61
62 ;; Generate caller functions.
63 (let ((i 1))
64 (while (<= i limit)
65 (insert "int\n")
66 (insert (caller i) " (void)\n")
67 (insert "{\n")
68 (let ((last (local-chain i "0xfeeb" (caller i))))
69 (insert " register int n;\n")
70 (let ((j 0))
71 (while (<= j limit)
72 (insert " n = " (callee j) " ("
73 (if (> j 0) "n + " "")
74 last ");\n")
75 (setq j (1+ j)))))
76 (insert " return n+")
77 (local-sum i)
78 (insert ";\n")
79 (insert "}\n\n")
80 (setq i (1+ i))))
81
82 ;; Generate driver function.
83 (insert "void\n")
84 (insert "driver (void)\n")
85 (insert "{\n")
86 (let ((i 1))
87 (while (<= i limit)
88 (insert " printf (\"" (caller i) " () => %d\\n\", "
89 (caller i) " ());\n")
90 (setq i (1+ i))))
91 (insert "}\n\n")))
92
93 */
94
95 int
96 increment (int n)
97 {
98 return n + 1;
99 }
100
101 /* generated code starts here */
102 /* Returns n * 0 + 0 */
103 int
104 callee0 (int n)
105 {
106 return n;
107 }
108
109 /* Returns n * 1 + 1 */
110 int
111 callee1 (int n)
112 {
113 register int l1 = increment (n); /* callee1 */
114 return l1;
115 }
116
117 /* Returns n * 2 + 3 */
118 int
119 callee2 (int n)
120 {
121 register int l1 = increment (n); /* callee2 */
122 register int l2 = increment (l1);
123 return l1+l2;
124 }
125
126 /* Returns n * 3 + 6 */
127 int
128 callee3 (int n)
129 {
130 register int l1 = increment (n); /* callee3 */
131 register int l2 = increment (l1);
132 register int l3 = increment (l2);
133 return l1+l2+l3;
134 }
135
136 /* Returns n * 4 + 10 */
137 int
138 callee4 (int n)
139 {
140 register int l1 = increment (n); /* callee4 */
141 register int l2 = increment (l1);
142 register int l3 = increment (l2);
143 register int l4 = increment (l3);
144 return l1+l2+l3+l4;
145 }
146
147 /* Returns n * 5 + 15 */
148 int
149 callee5 (int n)
150 {
151 register int l1 = increment (n); /* callee5 */
152 register int l2 = increment (l1);
153 register int l3 = increment (l2);
154 register int l4 = increment (l3);
155 register int l5 = increment (l4);
156 return l1+l2+l3+l4+l5;
157 }
158
159 int
160 caller1 (void)
161 {
162 register int l1 = increment (0xfeeb); /* caller1 */
163 register int n;
164 n = callee0 (l1);
165 n = callee1 (n + l1);
166 n = callee2 (n + l1);
167 n = callee3 (n + l1);
168 n = callee4 (n + l1);
169 n = callee5 (n + l1);
170 return n+l1;
171 }
172
173 int
174 caller2 (void)
175 {
176 register int l1 = increment (0xfeeb); /* caller2 */
177 register int l2 = increment (l1);
178 register int n;
179 n = callee0 (l2);
180 n = callee1 (n + l2);
181 n = callee2 (n + l2);
182 n = callee3 (n + l2);
183 n = callee4 (n + l2);
184 n = callee5 (n + l2);
185 return n+l1+l2;
186 }
187
188 int
189 caller3 (void)
190 {
191 register int l1 = increment (0xfeeb); /* caller3 */
192 register int l2 = increment (l1);
193 register int l3 = increment (l2);
194 register int n;
195 n = callee0 (l3);
196 n = callee1 (n + l3);
197 n = callee2 (n + l3);
198 n = callee3 (n + l3);
199 n = callee4 (n + l3);
200 n = callee5 (n + l3);
201 return n+l1+l2+l3;
202 }
203
204 int
205 caller4 (void)
206 {
207 register int l1 = increment (0xfeeb); /* caller4 */
208 register int l2 = increment (l1);
209 register int l3 = increment (l2);
210 register int l4 = increment (l3);
211 register int n;
212 n = callee0 (l4);
213 n = callee1 (n + l4);
214 n = callee2 (n + l4);
215 n = callee3 (n + l4);
216 n = callee4 (n + l4);
217 n = callee5 (n + l4);
218 return n+l1+l2+l3+l4;
219 }
220
221 int
222 caller5 (void)
223 {
224 register int l1 = increment (0xfeeb); /* caller5 */
225 register int l2 = increment (l1);
226 register int l3 = increment (l2);
227 register int l4 = increment (l3);
228 register int l5 = increment (l4);
229 register int n;
230 n = callee0 (l5);
231 n = callee1 (n + l5);
232 n = callee2 (n + l5);
233 n = callee3 (n + l5);
234 n = callee4 (n + l5);
235 n = callee5 (n + l5);
236 return n+l1+l2+l3+l4+l5;
237 }
238
239 void
240 driver (void)
241 {
242 printf ("caller1 () => %d\n", caller1 ());
243 printf ("caller2 () => %d\n", caller2 ());
244 printf ("caller3 () => %d\n", caller3 ());
245 printf ("caller4 () => %d\n", caller4 ());
246 printf ("caller5 () => %d\n", caller5 ());
247 }
248
249 /* generated code ends here */
250
251 main ()
252 {
253 register int local;
254 #ifdef usestubs
255 set_debug_traps();
256 breakpoint();
257 #endif
258 driver ();
259 printf("exiting\n");
260 }