1 /* The purpose of this test is to catch edge cases when arguments are passed
2    in regs and on the stack.  We test 16 cases, trying to catch multiple
3    targets (some use 3 regs for argument passing, some use 12, etc.).
4    We test both the arguments and the `lastarg' (the argument to va_start).  */
5 
6 #include <stdarg.h>
7 
8 extern __SIZE_TYPE__ strlen ();
9 
10 int
to_hex(unsigned int a)11 to_hex (unsigned int a)
12 {
13   static char hex[] = "0123456789abcdef";
14 
15   if (a > 15)
16     abort ();
17   return hex[a];
18 }
19 
20 void
f0(char * format,...)21 f0 (char* format, ...)
22 {
23   va_list ap;
24 
25   va_start (ap, format);
26   if (strlen (format) != 16 - 0)
27     abort ();
28   while (*format)
29     if (*format++ != to_hex (va_arg (ap, int)))
30       abort ();
31   va_end(ap);
32 }
33 
34 void
f1(int a1,char * format,...)35 f1 (int a1, char* format, ...)
36 {
37   va_list ap;
38 
39   va_start(ap, format);
40   if (strlen (format) != 16 - 1)
41     abort ();
42   while (*format)
43     if (*format++ != to_hex (va_arg (ap, int)))
44       abort ();
45   va_end(ap);
46 }
47 
48 void
f2(int a1,int a2,char * format,...)49 f2 (int a1, int a2, char* format, ...)
50 {
51   va_list ap;
52 
53   va_start(ap, format);
54   if (strlen (format) != 16 - 2)
55     abort ();
56   while (*format)
57     if (*format++ != to_hex (va_arg (ap, int)))
58       abort ();
59   va_end(ap);
60 }
61 
62 void
f3(int a1,int a2,int a3,char * format,...)63 f3 (int a1, int a2, int a3, char* format, ...)
64 {
65   va_list ap;
66 
67   va_start(ap, format);
68   if (strlen (format) != 16 - 3)
69     abort ();
70   while (*format)
71     if (*format++ != to_hex (va_arg (ap, int)))
72       abort ();
73   va_end(ap);
74 }
75 
76 void
f4(int a1,int a2,int a3,int a4,char * format,...)77 f4 (int a1, int a2, int a3, int a4, char* format, ...)
78 {
79   va_list ap;
80 
81   va_start(ap, format);
82   if (strlen (format) != 16 - 4)
83     abort ();
84   while (*format)
85     if (*format++ != to_hex (va_arg (ap, int)))
86       abort ();
87   va_end(ap);
88 }
89 
90 void
f5(int a1,int a2,int a3,int a4,int a5,char * format,...)91 f5 (int a1, int a2, int a3, int a4, int a5,
92     char* format, ...)
93 {
94   va_list ap;
95 
96   va_start(ap, format);
97   if (strlen (format) != 16 - 5)
98     abort ();
99   while (*format)
100     if (*format++ != to_hex (va_arg (ap, int)))
101       abort ();
102   va_end(ap);
103 }
104 
105 void
f6(int a1,int a2,int a3,int a4,int a5,int a6,char * format,...)106 f6 (int a1, int a2, int a3, int a4, int a5,
107     int a6,
108     char* format, ...)
109 {
110   va_list ap;
111 
112   va_start(ap, format);
113   if (strlen (format) != 16 - 6)
114     abort ();
115   while (*format)
116     if (*format++ != to_hex (va_arg (ap, int)))
117       abort ();
118   va_end(ap);
119 }
120 
121 void
f7(int a1,int a2,int a3,int a4,int a5,int a6,int a7,char * format,...)122 f7 (int a1, int a2, int a3, int a4, int a5,
123     int a6, int a7,
124     char* format, ...)
125 {
126   va_list ap;
127 
128   va_start(ap, format);
129   if (strlen (format) != 16 - 7)
130     abort ();
131   while (*format)
132     if (*format++ != to_hex (va_arg (ap, int)))
133       abort ();
134   va_end(ap);
135 }
136 
137 void
f8(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,char * format,...)138 f8 (int a1, int a2, int a3, int a4, int a5,
139     int a6, int a7, int a8,
140     char* format, ...)
141 {
142   va_list ap;
143 
144   va_start(ap, format);
145   if (strlen (format) != 16 - 8)
146     abort ();
147   while (*format)
148     if (*format++ != to_hex (va_arg (ap, int)))
149       abort ();
150   va_end(ap);
151 }
152 
153 void
f9(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,char * format,...)154 f9 (int a1, int a2, int a3, int a4, int a5,
155      int a6, int a7, int a8, int a9,
156      char* format, ...)
157 {
158   va_list ap;
159 
160   va_start(ap, format);
161   if (strlen (format) != 16 - 9)
162     abort ();
163   while (*format)
164     if (*format++ != to_hex (va_arg (ap, int)))
165       abort ();
166   va_end(ap);
167 }
168 
169 void
f10(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,char * format,...)170 f10 (int a1, int a2, int a3, int a4, int a5,
171      int a6, int a7, int a8, int a9, int a10,
172      char* format, ...)
173 {
174   va_list ap;
175 
176   va_start(ap, format);
177   if (strlen (format) != 16 - 10)
178     abort ();
179   while (*format)
180     if (*format++ != to_hex (va_arg (ap, int)))
181       abort ();
182   va_end(ap);
183 }
184 
185 void
f11(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11,char * format,...)186 f11 (int a1, int a2, int a3, int a4, int a5,
187      int a6, int a7, int a8, int a9, int a10,
188      int a11,
189      char* format, ...)
190 {
191   va_list ap;
192 
193   va_start(ap, format);
194   if (strlen (format) != 16 - 11)
195     abort ();
196   while (*format)
197     if (*format++ != to_hex (va_arg (ap, int)))
198       abort ();
199   va_end(ap);
200 }
201 
202 void
f12(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11,int a12,char * format,...)203 f12 (int a1, int a2, int a3, int a4, int a5,
204      int a6, int a7, int a8, int a9, int a10,
205      int a11, int a12,
206      char* format, ...)
207 {
208   va_list ap;
209 
210   va_start(ap, format);
211   if (strlen (format) != 16 - 12)
212     abort ();
213   while (*format)
214     if (*format++ != to_hex (va_arg (ap, int)))
215       abort ();
216   va_end(ap);
217 }
218 
219 void
f13(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11,int a12,int a13,char * format,...)220 f13 (int a1, int a2, int a3, int a4, int a5,
221      int a6, int a7, int a8, int a9, int a10,
222      int a11, int a12, int a13,
223      char* format, ...)
224 {
225   va_list ap;
226 
227   va_start(ap, format);
228   if (strlen (format) != 16 - 13)
229     abort ();
230   while (*format)
231     if (*format++ != to_hex (va_arg (ap, int)))
232       abort ();
233   va_end(ap);
234 }
235 
236 void
f14(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11,int a12,int a13,int a14,char * format,...)237 f14 (int a1, int a2, int a3, int a4, int a5,
238      int a6, int a7, int a8, int a9, int a10,
239      int a11, int a12, int a13, int a14,
240      char* format, ...)
241 {
242   va_list ap;
243 
244   va_start(ap, format);
245   if (strlen (format) != 16 - 14)
246     abort ();
247   while (*format)
248     if (*format++ != to_hex (va_arg (ap, int)))
249       abort ();
250   va_end(ap);
251 }
252 
253 void
f15(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11,int a12,int a13,int a14,int a15,char * format,...)254 f15 (int a1, int a2, int a3, int a4, int a5,
255      int a6, int a7, int a8, int a9, int a10,
256      int a11, int a12, int a13, int a14, int a15,
257      char* format, ...)
258 {
259   va_list ap;
260 
261   va_start(ap, format);
262   if (strlen (format) != 16 - 15)
263     abort ();
264   while (*format)
265     if (*format++ != to_hex (va_arg (ap, int)))
266       abort ();
267   va_end(ap);
268 }
269 
main()270 main ()
271 {
272   char *f = "0123456789abcdef";
273 
274   f0 (f+0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
275   f1 (0, f+1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
276   f2 (0, 1, f+2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
277   f3 (0, 1, 2, f+3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
278   f4 (0, 1, 2, 3, f+4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
279   f5 (0, 1, 2, 3, 4, f+5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
280   f6 (0, 1, 2, 3, 4, 5, f+6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
281   f7 (0, 1, 2, 3, 4, 5, 6, f+7, 7, 8, 9, 10, 11, 12, 13, 14, 15);
282   f8 (0, 1, 2, 3, 4, 5, 6, 7, f+8, 8, 9, 10, 11, 12, 13, 14, 15);
283   f9 (0, 1, 2, 3, 4, 5, 6, 7, 8, f+9, 9, 10, 11, 12, 13, 14, 15);
284   f10 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, f+10, 10, 11, 12, 13, 14, 15);
285   f11 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, f+11, 11, 12, 13, 14, 15);
286   f12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, f+12, 12, 13, 14, 15);
287   f13 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, f+13, 13, 14, 15);
288   f14 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, f+14, 14, 15);
289   f15 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, f+15, 15);
290 
291   exit (0);
292 }
293