[PATCH 7/57][Arm][GAS] Add support for MVE instructions: vstr/vldr
[binutils-gdb.git] / gdb / testsuite / gdb.base / infcall-nested-structs.c
blobb6f793e7a33d1cd99fb4ed46a56b5a7fb4ececda
1 /* This testcase is part of GDB, the GNU debugger.
3 Copyright 2018-2019 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 /* This file is used for testing GDBs ability to pass structures to, and
19 return structures from, functions. All of the structures in this test
20 are special in that they are small structures containing from 1 up to 5
21 scalar fields, the fields can be inside nested structures, and there can
22 be empty structures around too.
24 When compiled for C++ this file also tests structures containing static
25 members (which live in global memory). In addition, empty structures in C++
26 have a size of 1 (compared to 0 in GNU C), which can effect structure
27 padding.
29 This test is specifically written for RiscV and Aarch64, which both have
30 special ABI rules for structures like these, however, there should be no harm
31 in running these tests on other targets, though in many cases the
32 structures will treated no differently to the structures already covered
33 in the structs.exp test script. */
35 #include <string.h>
37 /* Useful abreviations. */
38 typedef char tc;
39 typedef short ts;
40 typedef int ti;
41 typedef long tl;
42 typedef long long tll;
43 typedef float tf;
44 typedef double td;
45 typedef long double tld;
47 #ifdef TEST_COMPLEX
48 typedef float _Complex tfc;
49 typedef double _Complex tdc;
50 typedef long double _Complex tldc;
51 #endif /* TEST_COMPLEX */
53 #define MAKE_CHECK_FUNCS(TYPE) \
54 int \
55 check_arg_ ## TYPE (struct TYPE arg) \
56 { \
57 return cmp_ ## TYPE (arg, ref_val_ ## TYPE); \
58 } \
60 struct TYPE \
61 rtn_str_ ## TYPE (void) \
62 { \
63 return (ref_val_ ## TYPE); \
66 #define REF_VAL(NAME) struct NAME ref_val_ ## NAME
67 #define ES(NAME) struct { } NAME
69 /* Test is either for a single type or two differing types. */
70 #if defined tA && ! defined tB
71 #define tB tA
72 #endif
73 #if ! defined tB
74 #error "Incorrect configuration of tA and tB defines"
75 #endif
77 /* Structures with a single field nested to various depths, along with
78 some empty structures. */
79 struct struct_01_01 { ES(es1); struct { struct { tA a; } s1; } s2; };
80 struct struct_01_02 { tA a; struct { struct { ES(es1); } s1; } s2; };
81 struct struct_01_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4;};
82 struct struct_01_04 { ES(es1); ES(es2); tA a; ES(es3); };
84 /* Structures with two fields nested to various depths, along with
85 some empty structures. */
86 struct struct_02_01 { ES(es1); struct { struct { tA a; tB b; } s1; } s2; };
87 struct struct_02_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; };
88 struct struct_02_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct { struct { tB b; } s5; } s6;};
89 struct struct_02_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; };
91 /* Structures with four fields nested to various depths, along with
92 some empty structures. */
93 struct struct_04_01 { ES(es1); struct { struct { tA a; tB b; tA c; tB d; } s1; } s2; };
94 struct struct_04_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; struct { struct { ES(es1); } s2; } s3; tA c; struct { struct { ES(es2); } s4; } s5; tB d;};
95 struct struct_04_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct { struct { tB b; } s5; } s6; struct { struct { tA c; } s7; } s8; struct { struct { tB d; } s9; } s10;};
96 struct struct_04_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; ES(es4); tA c; ES(es5); tB d; };
98 /* Structures with five fields nested to various depths, along with
99 some empty structures. */
100 struct struct_05_01 { ES(es1); struct { struct { tA a; tB b; tA c; tB d; tA e; } s1; } s2; };
101 struct struct_05_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; struct { struct { ES(es1); } s2; } s3; tA c; struct { struct { ES(es2); } s4; } s5; tB d; struct { struct { ES(es2); } s6; } s7; tB e;};
102 struct struct_05_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct { struct { tB b; } s5; } s6; struct { struct { tA c; } s7; } s8; struct { struct { tB d; } s9; } s10; struct { struct { tA e; } s11; } s12;};
103 struct struct_05_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; ES(es4); tA c; ES(es5); tB d; ES(es6); tA e; };
105 /* Only C++ allows structures to have static members. */
106 #ifdef __cplusplus
108 /* Structures with two fields nested to various depths, one of which is static.
109 Some include empty structures. */
110 struct struct_static_02_01 { struct sa { struct sb { tA a; static tB b; } s1; } s2; };
111 struct struct_static_02_02 { static tA a; struct { struct { ES(es1); } s1; } s2; tB b; };
112 struct struct_static_02_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct { struct { tA a; } s3; } s4; struct sa { struct sb { static tB b; } s5; } s6;};
113 struct struct_static_02_04 { static tA a; tB b; };
115 /* Structures with four fields nested to various depths, some of which are
116 static. Some include empty structures. */
117 struct struct_static_04_01 { struct sa { struct sb { static tA a; tB b; tA c; tB d; } s1; } s2; };
118 struct struct_static_04_02 { tA a; struct { struct { ES(es1); } s1; } s2; tB b; struct { struct { ES(es1); } s2; } s3; static tA c; struct { struct { ES(es2); } s4; } s5; static tB d;};
119 struct struct_static_04_03 { struct sa { struct sb { static tA a; } s3; } s4; struct sc { struct sd { static tB b; } s5; } s6; struct se { struct sf { static tA c; } s7; } s8; struct sg { struct sh { static tB d; } s9; } s10;};
120 struct struct_static_04_04 { ES(es1); ES(es2); tA a; ES(es3); tB b; ES(es4); tA c; ES(es5); static tB d; };
122 /* Structures with six fields nested to various depths, some of which are
123 static. Some include empty structures. */
124 struct struct_static_06_01 { struct sa { struct sb { tA a; static tB b; tA c; tB d; tA e; } s1; } s2; tB f; };
125 struct struct_static_06_02 { tA a; static tB b; static tA c; tB d; tB e; tA f;};
126 struct struct_static_06_03 { struct { struct { ES(es1); } s1; } s2; ES(es1); struct sa { struct sb { static tA a; } s3; } s4; struct sc { struct sd { tB b; } s5; } s6; struct se { struct sf { static tA c; } s7; } s8; struct sg { struct sh { static tB d; } s9; } s10; struct { struct { tA e; tB f; } s11; } s12;};
127 struct struct_static_06_04 { ES(es1); ES(es2); static tA a; ES(es3); static tB b; ES(es4); static tA c; ES(es5); static tB d; ES(es6); static tA e; ES(es7); tB f; };
129 #endif
131 int cmp_struct_01_01 (struct struct_01_01 a, struct struct_01_01 b)
132 { return a.s2.s1.a == b.s2.s1.a; }
134 int cmp_struct_01_02 (struct struct_01_02 a, struct struct_01_02 b)
135 { return a.a == b.a; }
137 int cmp_struct_01_03 (struct struct_01_03 a, struct struct_01_03 b)
138 { return a.s4.s3.a == b.s4.s3.a; }
140 int cmp_struct_01_04 (struct struct_01_04 a, struct struct_01_04 b)
141 { return a.a == b.a; }
143 int cmp_struct_02_01 (struct struct_02_01 a, struct struct_02_01 b)
144 { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == a.s2.s1.b; }
146 int cmp_struct_02_02 (struct struct_02_02 a, struct struct_02_02 b)
147 { return a.a == b.a && a.b == b.b; }
149 int cmp_struct_02_03 (struct struct_02_03 a, struct struct_02_03 b)
150 { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b; }
152 int cmp_struct_02_04 (struct struct_02_04 a, struct struct_02_04 b)
153 { return a.a == b.a && a.b == b.b; }
155 int cmp_struct_04_01 (struct struct_04_01 a, struct struct_04_01 b)
156 { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == a.s2.s1.b
157 && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == a.s2.s1.d; }
159 int cmp_struct_04_02 (struct struct_04_02 a, struct struct_04_02 b)
160 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; }
162 int cmp_struct_04_03 (struct struct_04_03 a, struct struct_04_03 b)
163 { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b
164 && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d; }
166 int cmp_struct_04_04 (struct struct_04_04 a, struct struct_04_04 b)
167 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; }
169 int cmp_struct_05_01 (struct struct_05_01 a, struct struct_05_01 b)
170 { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == a.s2.s1.b
171 && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == a.s2.s1.d
172 && a.s2.s1.e == b.s2.s1.e; }
174 int cmp_struct_05_02 (struct struct_05_02 a, struct struct_05_02 b)
175 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e; }
177 int cmp_struct_05_03 (struct struct_05_03 a, struct struct_05_03 b)
178 { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b
179 && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d
180 && a.s12.s11.e == b.s12.s11.e; }
182 int cmp_struct_05_04 (struct struct_05_04 a, struct struct_05_04 b)
183 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e; }
185 #ifdef __cplusplus
188 cmp_struct_static_02_01 (struct struct_static_02_01 a,
189 struct struct_static_02_01 b)
190 { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == a.s2.s1.b; }
193 cmp_struct_static_02_02 (struct struct_static_02_02 a,
194 struct struct_static_02_02 b)
195 { return a.a == b.a && a.b == b.b; }
198 cmp_struct_static_02_03 (struct struct_static_02_03 a,
199 struct struct_static_02_03 b)
200 { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b; }
203 cmp_struct_static_02_04 (struct struct_static_02_04 a,
204 struct struct_static_02_04 b)
205 { return a.a == b.a && a.b == b.b; }
208 cmp_struct_static_04_01 (struct struct_static_04_01 a,
209 struct struct_static_04_01 b)
210 { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == a.s2.s1.b
211 && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == a.s2.s1.d; }
214 cmp_struct_static_04_02 (struct struct_static_04_02 a,
215 struct struct_static_04_02 b)
216 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; }
219 cmp_struct_static_04_03 (struct struct_static_04_03 a,
220 struct struct_static_04_03 b)
221 { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b
222 && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d; }
225 cmp_struct_static_04_04 (struct struct_static_04_04 a,
226 struct struct_static_04_04 b)
227 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d; }
230 cmp_struct_static_06_01 (struct struct_static_06_01 a,
231 struct struct_static_06_01 b)
232 { return a.s2.s1.a == b.s2.s1.a && a.s2.s1.b == a.s2.s1.b
233 && a.s2.s1.c == b.s2.s1.c && a.s2.s1.d == a.s2.s1.d
234 && a.s2.s1.e == b.s2.s1.e && a.f == b.f; }
237 cmp_struct_static_06_02 (struct struct_static_06_02 a,
238 struct struct_static_06_02 b)
239 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e
240 && a.f == b.f; }
243 cmp_struct_static_06_03 (struct struct_static_06_03 a,
244 struct struct_static_06_03 b)
245 { return a.s4.s3.a == b.s4.s3.a && a.s6.s5.b == b.s6.s5.b
246 && a.s8.s7.c == b.s8.s7.c && a.s10.s9.d == b.s10.s9.d
247 && a.s12.s11.e == b.s12.s11.e && a.s12.s11.f == b.s12.s11.f; }
250 cmp_struct_static_06_04 (struct struct_static_06_04 a,
251 struct struct_static_06_04 b)
252 { return a.a == b.a && a.b == b.b && a.c == b.c && a.d == b.d && a.e == b.e
253 && a.f == b.f; }
255 #endif
257 REF_VAL(struct_01_01) = { {}, { { 'a' } } };
258 REF_VAL(struct_01_02) = { 'a', { { {} } } };
259 REF_VAL(struct_01_03) = { { { {} } }, {}, { { 'a' } } };
260 REF_VAL(struct_01_04) = { {}, {}, 'a', {} };
262 REF_VAL(struct_02_01) = { {}, { { 'a', 'b' } } };
263 REF_VAL(struct_02_02) = { 'a', { { {} } }, 'b' };
264 REF_VAL(struct_02_03) = { { { {} } }, {}, { { 'a' } }, { { 'b' } } };
265 REF_VAL(struct_02_04) = { {}, {}, 'a', {}, 'b' };
267 REF_VAL(struct_04_01) = { {}, { { 'a', 'b', 'c', 'd' } } };
268 REF_VAL(struct_04_02) = { 'a', { { {} } }, 'b', { { {} } }, 'c', { { {} } }, 'd' };
269 REF_VAL(struct_04_03) = { { { {} } }, {}, { { 'a' } }, { { 'b' } }, { { 'c' } }, { { 'd' } } };
270 REF_VAL(struct_04_04) = { {}, {}, 'a', {}, 'b', {}, 'c', {}, 'd' };
272 REF_VAL(struct_05_01) = { {}, { { 'a', 'b', 'c', 'd', 'e' } } };
273 REF_VAL(struct_05_02) = { 'a', { { {} } }, 'b', { { {} } }, 'c', { { {} } }, 'd', { { {} } }, 'e' };
274 REF_VAL(struct_05_03) = { { { {} } }, {}, { { 'a' } }, { { 'b' } }, { { 'c' } }, { { 'd' } }, { { 'e' } } };
275 REF_VAL(struct_05_04) = { {}, {}, 'a', {}, 'b', {}, 'c', {}, 'd', {}, 'e' };
277 #ifdef __cplusplus
279 /* Initialise static members. */
280 tB struct_static_02_01::sa::sb::b = '1';
281 tA struct_static_02_02::a = '2';
282 tB struct_static_02_03::sa::sb::b = '3';
283 tA struct_static_02_04::a = '4';
284 tA struct_static_04_01::sa::sb::a = '5';
285 tA struct_static_04_02::c = '6';
286 tB struct_static_04_02::d = '7';
287 tA struct_static_04_03::sa::sb::a = '8';
288 tB struct_static_04_03::sc::sd::b = '9';
289 tA struct_static_04_03::se::sf::c = '0';
290 tB struct_static_04_03::sg::sh::d = 'A';
291 tB struct_static_04_04::d = 'B';
292 tB struct_static_06_01::sa::sb::b = 'C';
293 tB struct_static_06_02::b = 'D';
294 tA struct_static_06_02::c = 'E';
295 tA struct_static_06_03::sa::sb::a = 'F';
296 tA struct_static_06_03::se::sf::c = 'G';
297 tB struct_static_06_03::sg::sh::d = 'H';
298 tA struct_static_06_04::a = 'I';
299 tB struct_static_06_04::b = 'J';
300 tA struct_static_06_04::c = 'K';
301 tB struct_static_06_04::d = 'L';
302 tA struct_static_06_04::e = 'M';
304 REF_VAL(struct_static_02_01) = { { { 'a' } } };
305 REF_VAL(struct_static_02_02) = { { { {} } }, 'b' };
306 REF_VAL(struct_static_02_03) = { { { {} } }, {}, { { 'a' } }, { { } } };
307 REF_VAL(struct_static_02_04) = { 'b' };
308 REF_VAL(struct_static_04_01) = { { { 'b', 'c', 'd' } } };
309 REF_VAL(struct_static_04_02) = { 'a', { { {} } }, 'b', { { {} } }, { { {} } } };
310 REF_VAL(struct_static_04_03) = {};
311 REF_VAL(struct_static_04_04) = { {}, {}, 'a', {}, 'b', {}, 'c', {} };
312 REF_VAL(struct_static_06_01) = { { { 'a', 'c', 'd', 'e' } }, 'f' };
313 REF_VAL(struct_static_06_02) = { 'a', 'd', 'e', 'f' };
314 REF_VAL(struct_static_06_03) = { { { {} } }, {}, {}, { { 'b' } }, {}, /*{ { 'e', 'f' } }*/ };
315 REF_VAL(struct_static_06_04) = { {}, {}, {}, {}, {}, {}, {}, 'f' };
317 #endif
319 /* Create all of the functions GDB will call to check functionality. */
320 MAKE_CHECK_FUNCS(struct_01_01)
321 MAKE_CHECK_FUNCS(struct_01_02)
322 MAKE_CHECK_FUNCS(struct_01_03)
323 MAKE_CHECK_FUNCS(struct_01_04)
324 MAKE_CHECK_FUNCS(struct_02_01)
325 MAKE_CHECK_FUNCS(struct_02_02)
326 MAKE_CHECK_FUNCS(struct_02_03)
327 MAKE_CHECK_FUNCS(struct_02_04)
328 MAKE_CHECK_FUNCS(struct_04_01)
329 MAKE_CHECK_FUNCS(struct_04_02)
330 MAKE_CHECK_FUNCS(struct_04_03)
331 MAKE_CHECK_FUNCS(struct_04_04)
332 MAKE_CHECK_FUNCS(struct_05_01)
333 MAKE_CHECK_FUNCS(struct_05_02)
334 MAKE_CHECK_FUNCS(struct_05_03)
335 MAKE_CHECK_FUNCS(struct_05_04)
336 #ifdef __cplusplus
337 MAKE_CHECK_FUNCS(struct_static_02_01)
338 MAKE_CHECK_FUNCS(struct_static_02_02)
339 MAKE_CHECK_FUNCS(struct_static_02_03)
340 MAKE_CHECK_FUNCS(struct_static_02_04)
341 MAKE_CHECK_FUNCS(struct_static_04_01)
342 MAKE_CHECK_FUNCS(struct_static_04_02)
343 MAKE_CHECK_FUNCS(struct_static_04_03)
344 MAKE_CHECK_FUNCS(struct_static_04_04)
345 MAKE_CHECK_FUNCS(struct_static_06_01)
346 MAKE_CHECK_FUNCS(struct_static_06_02)
347 MAKE_CHECK_FUNCS(struct_static_06_03)
348 MAKE_CHECK_FUNCS(struct_static_06_04)
349 #endif
351 #define CALL_LINE(NAME) val += check_arg_ ## NAME (rtn_str_ ## NAME ())
354 call_all ()
356 int val;
358 CALL_LINE(struct_01_01);
359 CALL_LINE(struct_01_02);
360 CALL_LINE(struct_01_03);
361 CALL_LINE(struct_01_04);
362 CALL_LINE(struct_02_01);
363 CALL_LINE(struct_02_02);
364 CALL_LINE(struct_02_03);
365 CALL_LINE(struct_02_04);
366 CALL_LINE(struct_04_01);
367 CALL_LINE(struct_04_02);
368 CALL_LINE(struct_04_03);
369 CALL_LINE(struct_04_04);
370 CALL_LINE(struct_05_01);
371 CALL_LINE(struct_05_02);
372 CALL_LINE(struct_05_03);
373 CALL_LINE(struct_05_04);
374 #ifdef __cplusplus
375 CALL_LINE(struct_static_02_01);
376 CALL_LINE(struct_static_02_02);
377 CALL_LINE(struct_static_02_03);
378 CALL_LINE(struct_static_02_04);
379 CALL_LINE(struct_static_04_01);
380 CALL_LINE(struct_static_04_02);
381 CALL_LINE(struct_static_04_03);
382 CALL_LINE(struct_static_04_04);
383 CALL_LINE(struct_static_06_01);
384 CALL_LINE(struct_static_06_02);
385 CALL_LINE(struct_static_06_03);
386 CALL_LINE(struct_static_06_04);
387 #endif
389 return (val != 4);
392 void
393 breakpt (void)
395 /* Nothing. */
399 main ()
401 int res;
403 res = call_all ();
404 breakpt (); /* Break Here. */
405 return res;