1/* Check that GDB can correctly update a value, living in a register,
2   in the target.  This pretty much relies on the compiler taking heed
3   of requests for values to be stored in registers.  */
4
5/* NOTE: carlton/2002-12-05: These functions were all static, but for
6   whatever reason that caused GCC 3.1 to optimize away some of the
7   function calls within main even when no optimization flags were
8   passed.  */
9
10typedef signed char charest;
11
12charest
13add_charest (register charest u, register charest v)
14{
15  return u + v;
16}
17
18short
19add_short (register short u, register short v)
20{
21  return u + v;
22}
23
24int
25add_int (register int u, register int v)
26{
27  return u + v;
28}
29
30long
31add_long (register long u, register long v)
32{
33  return u + v;
34}
35
36typedef long long longest;
37
38longest
39add_longest (register longest u, register longest v)
40{
41  return u + v;
42}
43
44float
45add_float (register float u, register float v)
46{
47  return u + v;
48}
49
50double
51add_double (register double u, register double v)
52{
53  return u + v;
54}
55
56typedef long double doublest;
57
58doublest
59add_doublest (register doublest u, register doublest v)
60{
61  return u + v;
62}
63
64/* */
65
66charest
67wack_charest (register charest u, register charest v)
68{
69  register charest l = u, r = v;
70  l = add_charest (l, r);
71  return l + r;
72}
73
74short
75wack_short (register short u, register short v)
76{
77  register short l = u, r = v;
78  l = add_short (l, r);
79  return l + r;
80}
81
82int
83wack_int (register int u, register int v)
84{
85  register int l = u, r = v;
86  l = add_int (l, r);
87  return l + r;
88}
89
90long
91wack_long (register long u, register long v)
92{
93  register long l = u, r = v;
94  l = add_long (l, r);
95  return l + r;
96}
97
98long
99wack_longest (register longest u, register longest v)
100{
101  register longest l = u, r = v;
102  l = add_longest (l, r);
103  return l + r;
104}
105
106float
107wack_float (register float u, register float v)
108{
109  register float l = u, r = v;
110  l = add_float (l, r);
111  return l + r;
112}
113
114double
115wack_double (register double u, register double v)
116{
117  register double l = u, r = v;
118  l = add_double (l, r);
119  return l + r;
120}
121
122doublest
123wack_doublest (register doublest u, register doublest v)
124{
125  register doublest l = u, r = v;
126  l = add_doublest (l, r);
127  return l + r;
128}
129
130/* */
131
132struct s_1 { short s[1]; } z_1, s_1;
133struct s_2 { short s[2]; } z_2, s_2;
134struct s_3 { short s[3]; } z_3, s_3;
135struct s_4 { short s[4]; } z_4, s_4;
136
137struct s_1
138add_struct_1 (struct s_1 s)
139{
140  int i;
141  for (i = 0; i < sizeof (s) / sizeof (s.s[0]); i++)
142    {
143      s.s[i] = s.s[i] + s.s[i];
144    }
145  return s;
146}
147
148struct s_2
149add_struct_2 (struct s_2 s)
150{
151  int i;
152  for (i = 0; i < sizeof (s) / sizeof (s.s[0]); i++)
153    {
154      s.s[i] = s.s[i] + s.s[i];
155    }
156  return s;
157}
158
159struct s_3
160add_struct_3 (struct s_3 s)
161{
162  int i;
163  for (i = 0; i < sizeof (s) / sizeof (s.s[0]); i++)
164    {
165      s.s[i] = s.s[i] + s.s[i];
166    }
167  return s;
168}
169
170struct s_4
171add_struct_4 (struct s_4 s)
172{
173  int i;
174  for (i = 0; i < sizeof (s) / sizeof (s.s[0]); i++)
175    {
176      s.s[i] = s.s[i] + s.s[i];
177    }
178  return s;
179}
180
181struct s_1
182wack_struct_1 (void)
183{
184  int i; register struct s_1 u = z_1;
185  for (i = 0; i < sizeof (s_1) / sizeof (s_1.s[0]); i++) { s_1.s[i] = i + 1; }
186  u = add_struct_1 (u);
187  return u;
188}
189
190struct s_2
191wack_struct_2 (void)
192{
193  int i; register struct s_2 u = z_2;
194  for (i = 0; i < sizeof (s_2) / sizeof (s_2.s[0]); i++) { s_2.s[i] = i + 1; }
195  u = add_struct_2 (u);
196  return u;
197}
198
199struct s_3
200wack_struct_3 (void)
201{
202  int i; register struct s_3 u = z_3;
203  for (i = 0; i < sizeof (s_3) / sizeof (s_3.s[0]); i++) { s_3.s[i] = i + 1; }
204  u = add_struct_3 (u);
205  return u;
206}
207
208struct s_4
209wack_struct_4 (void)
210{
211  int i; register struct s_4 u = z_4;
212  for (i = 0; i < sizeof (s_4) / sizeof (s_4.s[0]); i++) { s_4.s[i] = i + 1; }
213  u = add_struct_4 (u);
214  return u;
215}
216
217/* */
218
219struct f_1 {unsigned i:1;unsigned j:1;unsigned k:1; } f_1 = {1,1,1}, F_1;
220struct f_2 {unsigned i:2;unsigned j:2;unsigned k:2; } f_2 = {1,1,1}, F_2;
221struct f_3 {unsigned i:3;unsigned j:3;unsigned k:3; } f_3 = {1,1,1}, F_3;
222struct f_4 {unsigned i:4;unsigned j:4;unsigned k:4; } f_4 = {1,1,1}, F_4;
223
224struct f_1
225wack_field_1 (void)
226{
227  register struct f_1 u = f_1;
228  return u;
229}
230
231struct f_2
232wack_field_2 (void)
233{
234  register struct f_2 u = f_2;
235  return u;
236}
237
238struct f_3
239wack_field_3 (void)
240{
241  register struct f_3 u = f_3;
242  return u;
243}
244
245struct f_4
246wack_field_4 (void)
247{
248  register struct f_4 u = f_4;
249  return u;
250}
251
252/* */
253
254int
255main ()
256{
257  /* These calls are for current frame test.  */
258  wack_charest (-1, -2);
259  wack_short (-1, -2);
260  wack_int (-1, -2);
261  wack_long (-1, -2);
262  wack_longest (-1, -2);
263  wack_float (-1, -2);
264  wack_double (-1, -2);
265  wack_doublest (-1, -2);
266
267  /* These calls are for up frame.  */
268  wack_charest (-1, -2);
269  wack_short (-1, -2);
270  wack_int (-1, -2);
271  wack_long (-1, -2);
272  wack_longest (-1, -2);
273  wack_float (-1, -2);
274  wack_double (-1, -2);
275  wack_doublest (-1, -2);
276
277  /* These calls are for current frame test.  */
278  wack_struct_1 ();
279  wack_struct_2 ();
280  wack_struct_3 ();
281  wack_struct_4 ();
282
283  /* These calls are for up frame.  */
284  wack_struct_1 ();
285  wack_struct_2 ();
286  wack_struct_3 ();
287  wack_struct_4 ();
288
289  wack_field_1 ();
290  wack_field_2 ();
291  wack_field_3 ();
292  wack_field_4 ();
293
294  return 0;
295}
296