1 /* Test passing of arguments to functions. Use various sorts of arguments,
2 including basic types, pointers to those types, structures, lots of
3 args, etc, in various combinations. */
5 /* AIX requires this to be the first thing in the file. */
7 # define alloca __builtin_alloca
8 # define HAVE_STACK_ALLOCA 1
9 #else /* not __GNUC__ */
12 # define HAVE_STACK_ALLOCA 1
16 # define HAVE_STACK_ALLOCA 1
21 # endif /* __STDC__ */
24 #endif /* not __GNUC__ */
29 unsigned char uc
= 'b';
30 unsigned char *ucp
= &uc
;
35 unsigned short us
= 6;
36 unsigned short *usp
= &us
;
42 unsigned int *uip
= &ui
;
48 unsigned long *ulp
= &ul
;
57 float _Complex fc
= 1.0F
+ 2.0iF
;
58 double _Complex dc
= 3.0 + 4.0i
;
59 long double _Complex ldc
= 5.0L + 6.0iL
;
60 #endif /* TEST_COMPLEX */
66 struct stag
*stp
= &st
;
72 union utag
*unp
= &un
;
74 char carray
[] = {'a', 'n', ' ', 'a', 'r', 'r', 'a', 'y', '\0'};
77 /* Test various permutations and interleaving of integral arguments */
80 void call0a (char c
, short s
, int i
, long l
)
88 void call0b (short s
, int i
, long l
, char c
)
90 s
= 6; i
= 7; l
= 8; c
= 'j';
93 void call0c (int i
, long l
, char c
, short s
)
95 i
= 3; l
= 4; c
= 'k'; s
= 5;
98 void call0d (long l
, char c
, short s
, int i
)
100 l
= 7; c
= 'z'; s
= 8; i
= 9;
103 void call0e (char c1
, long l
, char c2
, int i
, char c3
, short s
, char c4
, char c5
)
105 c1
= 'a'; l
= 5; c2
= 'b'; i
= 7; c3
= 'c'; s
= 7; c4
= 'f'; c5
= 'g';
109 /* Test various permutations and interleaving of unsigned integral arguments */
112 void call1a (unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
114 uc
= 5; us
= 6; ui
= 7; ul
= 8;
117 void call1b (unsigned short us
, unsigned int ui
, unsigned long ul
, unsigned char uc
)
119 uc
= 5; us
= 6; ui
= 7; ul
= 8;
122 void call1c (unsigned int ui
, unsigned long ul
, unsigned char uc
, unsigned short us
)
124 uc
= 5; us
= 6; ui
= 7; ul
= 8;
127 void call1d (unsigned long ul
, unsigned char uc
, unsigned short us
, unsigned int ui
)
129 uc
= 5; us
= 6; ui
= 7; ul
= 8;
132 void call1e (unsigned char uc1
, unsigned long ul
, unsigned char uc2
, unsigned int ui
, unsigned char uc3
, unsigned short us
, unsigned char uc4
, unsigned char uc5
)
134 uc1
= 5; ul
= 7; uc2
= 8; ui
= 9; uc3
= 10; us
= 11; uc4
= 12; uc5
= 55;
137 /* Test various permutations and interleaving of integral arguments with
138 floating point arguments. */
141 void call2a (char c
, float f1
, short s
, double d1
, int i
, float f2
, long l
, double d2
)
143 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
146 void call2b (float f1
, short s
, double d1
, int i
, float f2
, long l
, double d2
, char c
)
148 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
151 void call2c (short s
, double d1
, int i
, float f2
, long l
, double d2
, char c
, float f1
)
153 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
156 void call2d (double d1
, int i
, float f2
, long l
, double d2
, char c
, float f1
, short s
)
158 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
161 void call2e (int i
, float f2
, long l
, double d2
, char c
, float f1
, short s
, double d1
)
163 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
166 void call2f (float f2
, long l
, double d2
, char c
, float f1
, short s
, double d1
, int i
)
168 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
171 void call2g (long l
, double d2
, char c
, float f1
, short s
, double d1
, int i
, float f2
)
173 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
176 void call2h (double d2
, char c
, float f1
, short s
, double d1
, int i
, float f2
, long l
)
178 c
= 'a'; f1
= 0.0; s
= 5; d1
= 0.0; i
= 6; f2
= 0.1; l
= 7; d2
= 0.2;
181 void call2i (char c1
, float f1
, char c2
, char c3
, double d1
, char c4
, char c5
, char c6
, float f2
, short s
, char c7
, double d2
)
183 c1
= 'a'; f1
= 0.0; c2
= 5; d1
= 0.0; c3
= 6; f2
= 0.1; c4
= 7; d2
= 0.2;
184 c5
= 's'; c6
= 'f'; c7
= 'z'; s
= 77;
188 /* Test pointers to various integral and floating types. */
191 void call3a (char *cp
, short *sp
, int *ip
, long *lp
)
193 cp
= 0; sp
= 0; ip
= 0; lp
= 0;
196 void call3b (unsigned char *ucp
, unsigned short *usp
, unsigned int *uip
, unsigned long *ulp
)
198 ucp
= 0; usp
= 0; uip
= 0; ulp
= 0;
201 void call3c (float *fp
, double *dp
)
210 /* Test various _Complex type args. */
212 void callca (float _Complex f1
, float _Complex f2
, float _Complex f3
)
217 void callcb (double _Complex d1
, double _Complex d2
, double _Complex d3
)
222 void callcc (long double _Complex ld1
, long double _Complex ld2
, long double _Complex ld3
)
227 void callcd (float _Complex fc1
, double _Complex dc1
, long double _Complex ldc1
)
231 void callce (double _Complex dc1
, long double _Complex ldc1
, float _Complex fc1
)
235 void callcf (long double _Complex ldc1
, float _Complex fc1
, double _Complex dc1
)
240 /* Test passing _Complex type and integral. */
241 void callc1a (char c
, short s
, int i
, unsigned int ui
, long l
,
242 float _Complex fc1
, double _Complex dc1
,
243 long double _Complex ldc1
)
246 void callc1b (long double _Complex ldc1
, char c
, short s
, int i
,
247 float _Complex fc1
, unsigned int ui
, long l
, double _Complex dc1
)
251 void callc2a (char c
, short s
, int i
, unsigned int ui
, long l
, float f
,
252 double d
, float _Complex fc1
, double _Complex dc1
,
253 long double _Complex ldc1
)
256 void callc2b (float _Complex fc1
, char c
, short s
, int i
, unsigned int ui
,
257 long double _Complex ldc1
, long l
, float f
, double d
,
262 #endif /* TEST_COMPLEX */
264 /* Test passing structures and unions by reference. */
267 void call4a (struct stag
*stp
)
270 void call4b (union utag
*unp
)
276 /* Test passing structures and unions by value. */
279 void call5a (struct stag st
)
282 void call5b (union utag un
)
286 /* Test shuffling of args */
293 void call6j (unsigned long ul
)
299 void call6i (unsigned int ui
, unsigned long ul
)
305 void call6h (unsigned short us
, unsigned int ui
, unsigned long ul
)
311 void call6g (unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
317 void call6f (double d
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
320 call6g (uc
, us
, ui
, ul
);
323 void call6e (float f
, double d
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
326 call6f (d
, uc
, us
, ui
, ul
);
329 void call6d (long l
, float f
, double d
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
332 call6e (f
, d
, uc
, us
, ui
, ul
);
335 void call6c (int i
, long l
, float f
, double d
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
338 call6d (l
, f
, d
, uc
, us
, ui
, ul
);
341 void call6b (short s
, int i
, long l
, float f
, double d
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
344 call6c (i
, l
, f
, d
, uc
, us
, ui
, ul
);
347 void call6a (char c
, short s
, int i
, long l
, float f
, double d
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
350 call6b (s
, i
, l
, f
, d
, uc
, us
, ui
, ul
);
353 /* Test shuffling of args, round robin */
356 void call7k (char c
, int i
, short s
, long l
, float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
)
358 c
= 'a'; i
= 7; s
= 8; l
= 7; f
= 0.3; uc
= 44; d
= 0.44; us
= 77;
362 void call7j (unsigned int ui
, char c
, int i
, short s
, long l
, float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
)
364 call7k (c
, i
, s
, l
, f
, uc
, d
, us
, ul
, ui
);
367 void call7i (unsigned long ul
, unsigned int ui
, char c
, int i
, short s
, long l
, float f
, unsigned char uc
, double d
, unsigned short us
)
369 call7j (ui
, c
, i
, s
, l
, f
, uc
, d
, us
, ul
);
372 void call7h (unsigned short us
, unsigned long ul
, unsigned int ui
, char c
, int i
, short s
, long l
, float f
, unsigned char uc
, double d
)
374 call7i (ul
, ui
, c
, i
, s
, l
, f
, uc
, d
, us
);
377 void call7g (double d
, unsigned short us
, unsigned long ul
, unsigned int ui
, char c
, int i
, short s
, long l
, float f
, unsigned char uc
)
379 call7h (us
, ul
, ui
, c
, i
, s
, l
, f
, uc
, d
);
382 void call7f (unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
, char c
, int i
, short s
, long l
, float f
)
384 call7g (d
, us
, ul
, ui
, c
, i
, s
, l
, f
, uc
);
387 void call7e (float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
, char c
, int i
, short s
, long l
)
389 call7f (uc
, d
, us
, ul
, ui
, c
, i
, s
, l
, f
);
392 void call7d (long l
, float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
, char c
, int i
, short s
)
394 call7e (f
, uc
, d
, us
, ul
, ui
, c
, i
, s
, l
);
397 void call7c (short s
, long l
, float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
, char c
, int i
)
399 call7d (l
, f
, uc
, d
, us
, ul
, ui
, c
, i
, s
);
402 void call7b (int i
, short s
, long l
, float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
, char c
)
404 call7c (s
, l
, f
, uc
, d
, us
, ul
, ui
, c
, i
);
407 void call7a (char c
, int i
, short s
, long l
, float f
, unsigned char uc
, double d
, unsigned short us
, unsigned long ul
, unsigned int ui
)
409 call7b (i
, s
, l
, f
, uc
, d
, us
, ul
, ui
, c
);
413 /* Test printing of structures passed as arguments to recursive functions. */
429 /* Trick the compiler into thinking A is important. */
430 volatile SVAL dummy
= a
;
433 void recurse (SVAL a
, int depth
)
435 a
.s
= a
.i
= a
.l
= --depth
;
441 /* Ensure A is not discarded after the above calls. */
445 void test_struct_args ()
447 SVAL s
; s
.s
= 5; s
.i
= 5; s
.l
= 5;
452 /* On various machines (pa, 29k, and rs/6000, at least), a function which
453 calls alloca may do things differently with respect to frames. So give
456 void localvars_after_alloca (char c
, short s
, int i
, long l
)
458 #ifdef HAVE_STACK_ALLOCA
459 /* No need to use the alloca.c alloca-on-top-of-malloc; it doesn't
460 test what we are looking for, so if we don't have an alloca which
461 allocates on the stack, just don't bother to call alloca at all. */
463 char *z
= alloca (s
+ 50);
471 void call_after_alloca_subr (char c
, short s
, int i
, long l
, unsigned char uc
, unsigned short us
, unsigned int ui
, unsigned long ul
)
474 i
= 7; s
= 8; l
= 7; uc
= 44; us
= 77;
478 void call_after_alloca (char c
, short s
, int i
, long l
)
480 #ifdef HAVE_STACK_ALLOCA
481 /* No need to use the alloca.c alloca-on-top-of-malloc; it doesn't
482 test what we are looking for, so if we don't have an alloca which
483 allocates on the stack, just don't bother to call alloca at all. */
485 char *z
= alloca (s
+ 50);
487 call_after_alloca_subr (c
, s
, i
, l
, 'b', 11, 12, (unsigned long)13);
492 /* The point behind this test is the PA will call this indirectly
493 through dyncall. Unlike the indirect calls to call0a, this test
494 will require a trampoline between dyncall and this function on the
495 call path, then another trampoline on between this function and main
496 on the return path. */
497 double call_with_trampolines (double d1
)
500 } /* End of call_with_trampolines, this comment is needed by funcargs.exp */
502 /* Dummy functions which the testsuite can use to run to, etc. */
505 marker_indirect_call () {}
508 marker_call_with_trampolines () {}
512 void (*pointer_to_call0a
) (char, short, int, long) = (void (*)(char, short, int, long))call0a
;
513 double (*pointer_to_call_with_trampolines
) (double) = call_with_trampolines
;
515 /* Test calling with basic integer types */
520 call0e (c
, l
, c
, i
, c
, s
, c
, c
);
522 /* Test calling with unsigned integer types */
523 call1a (uc
, us
, ui
, ul
);
524 call1b (us
, ui
, ul
, uc
);
525 call1c (ui
, ul
, uc
, us
);
526 call1d (ul
, uc
, us
, ui
);
527 call1e (uc
, ul
, uc
, ui
, uc
, us
, uc
, uc
);
529 /* Test calling with integral types mixed with floating point types */
530 call2a (c
, f
, s
, d
, i
, f
, l
, d
);
531 call2b (f
, s
, d
, i
, f
, l
, d
, c
);
532 call2c (s
, d
, i
, f
, l
, d
, c
, f
);
533 call2d (d
, i
, f
, l
, d
, c
, f
, s
);
534 call2e (i
, f
, l
, d
, c
, f
, s
, d
);
535 call2f (f
, l
, d
, c
, f
, s
, d
, i
);
536 call2g (l
, d
, c
, f
, s
, d
, i
, f
);
537 call2h (d
, c
, f
, s
, d
, i
, f
, l
);
538 call2i (c
, f
, c
, c
, d
, c
, c
, c
, f
, s
, c
, d
);
541 /* Test calling with _Complex types. */
544 callcc (ldc
, ldc
, ldc
);
545 callcd (fc
, dc
, ldc
);
546 callce (dc
, ldc
, fc
);
547 callcf (ldc
, fc
, dc
);
550 callc1a (c
, s
, i
, ui
, l
, fc
, dc
, ldc
);
551 callc1b (ldc
, c
, s
, i
, fc
, ui
, l
, dc
);
553 callc2a (c
, s
, i
, ui
, l
, f
, d
, fc
, dc
, ldc
);
554 callc2b (fc
, c
, s
, i
, ui
, ldc
, l
, f
, d
, dc
);
555 #endif /* TEST_COMPLEX */
557 /* Test dereferencing pointers to various integral and floating types */
559 call3a (cp
, sp
, ip
, lp
);
560 call3b (ucp
, usp
, uip
, ulp
);
563 /* Test dereferencing pointers to structs and unions */
569 /* Test calling with structures and unions. */
575 /* Test shuffling of args */
577 call6a (c
, s
, i
, l
, f
, d
, uc
, us
, ui
, ul
);
578 call7a (c
, i
, s
, l
, f
, uc
, d
, us
, ul
, ui
);
580 /* Test passing structures recursively. */
584 localvars_after_alloca (c
, s
, i
, l
);
586 call_after_alloca (c
, s
, i
, l
);
588 /* This is for localvars_in_indirect_call. */
589 marker_indirect_call ();
590 /* The comment on the following two lines is used by funcargs.exp,
592 (*pointer_to_call0a
) (c
, s
, i
, l
); /* First step into call0a. */
593 (*pointer_to_call0a
) (c
, s
, i
, l
); /* Second step into call0a. */
594 marker_call_with_trampolines ();
595 (*pointer_to_call_with_trampolines
) (d
); /* Test multiple trampolines. */