Rebased from gcc
[libffi.git] / patches / variadic
1 Index: libffi/include/ffi.h.in
2 ===================================================================
3 --- libffi.orig/include/ffi.h.in
4 +++ libffi/include/ffi.h.in
5 @@ -207,6 +207,15 @@ typedef struct {
6  #endif
7  } ffi_cif;
8  
9 +/* Used internally, but overridden by some architectures */
10 +ffi_status ffi_prep_cif_core(ffi_cif *cif,
11 +                            ffi_abi abi,
12 +                            unsigned int isvariadic,
13 +                            unsigned int nfixedargs,
14 +                            unsigned int ntotalargs,
15 +                            ffi_type *rtype,
16 +                            ffi_type **atypes);
17 +
18  /* ---- Definitions for the raw API -------------------------------------- */
19  
20  #ifndef FFI_SIZEOF_ARG
21 @@ -384,6 +393,13 @@ ffi_status ffi_prep_cif(ffi_cif *cif,
22                         ffi_type *rtype,
23                         ffi_type **atypes);
24  
25 +ffi_status ffi_prep_cif_var(ffi_cif *cif,
26 +                           ffi_abi abi,
27 +                           unsigned int nfixedargs,
28 +                           unsigned int ntotalargs,
29 +                           ffi_type *rtype,
30 +                           ffi_type **atypes);
31 +
32  void ffi_call(ffi_cif *cif,
33               void (*fn)(void),
34               void *rvalue,
35 Index: libffi/include/ffi_common.h
36 ===================================================================
37 --- libffi.orig/include/ffi_common.h
38 +++ libffi/include/ffi_common.h
39 @@ -75,6 +75,8 @@ void ffi_type_test(ffi_type *a, char *fi
40  
41  /* Perform machine dependent cif processing */
42  ffi_status ffi_prep_cif_machdep(ffi_cif *cif);
43 +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
44 +        unsigned int nfixedargs, unsigned int ntotalargs);
45  
46  /* Extended cif, used in callback from assembly routine */
47  typedef struct
48 Index: libffi/man/Makefile.am
49 ===================================================================
50 --- libffi.orig/man/Makefile.am
51 +++ libffi/man/Makefile.am
52 @@ -2,7 +2,7 @@
53  
54  AUTOMAKE_OPTIONS=foreign
55  
56 -EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3
57 +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
58  
59 -man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3
60 +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
61  
62 Index: libffi/man/ffi.3
63 ===================================================================
64 --- libffi.orig/man/ffi.3
65 +++ libffi/man/ffi.3
66 @@ -16,6 +16,15 @@ libffi, -lffi
67  .Fa "ffi_type **atypes"
68  .Fc
69  .Ft void
70 +.Fo ffi_prep_cif_var
71 +.Fa "ffi_cif *cif"
72 +.Fa "ffi_abi abi"
73 +.Fa "unsigned int nfixedargs"
74 +.Fa "unsigned int ntotalargs"
75 +.Fa "ffi_type *rtype"
76 +.Fa "ffi_type **atypes"
77 +.Fc
78 +.Ft void
79  .Fo ffi_call
80  .Fa "ffi_cif *cif"
81  .Fa "void (*fn)(void)"
82 @@ -28,4 +37,5 @@ generate a call to another function at r
83  the called function's interface at compile time.
84  .Sh SEE ALSO
85  .Xr ffi_prep_cif 3 ,
86 +.Xr ffi_prep_cif_var 3 ,
87  .Xr ffi_call 3
88 Index: libffi/man/ffi_prep_cif.3
89 ===================================================================
90 --- libffi.orig/man/ffi_prep_cif.3
91 +++ libffi/man/ffi_prep_cif.3
92 @@ -37,7 +37,9 @@ structs that describe the data type, siz
93  points to an
94  .Nm ffi_type
95  that describes the data type, size and alignment of the
96 -return value.
97 +return value. Note that to call a variadic function
98 +.Nm ffi_prep_cif_var
99 +must be used instead.
100  .Sh RETURN VALUES
101  Upon successful completion,
102  .Nm ffi_prep_cif
103 @@ -63,4 +65,6 @@ defined in
104  .
105  .Sh SEE ALSO
106  .Xr ffi 3 ,
107 -.Xr ffi_call 3 
108 +.Xr ffi_call 3 ,
109 +.Xr ffi_prep_cif_var 3
110 +
111 Index: libffi/man/ffi_prep_cif_var.3
112 ===================================================================
113 --- /dev/null
114 +++ libffi/man/ffi_prep_cif_var.3
115 @@ -0,0 +1,73 @@
116 +.Dd January 25, 2011
117 +.Dt ffi_prep_cif_var 3
118 +.Sh NAME
119 +.Nm ffi_prep_cif_var
120 +.Nd Prepare a
121 +.Nm ffi_cif
122 +structure for use with
123 +.Nm ffi_call
124 +for variadic functions.
125 +.Sh SYNOPSIS
126 +.In ffi.h
127 +.Ft ffi_status
128 +.Fo ffi_prep_cif_var
129 +.Fa "ffi_cif *cif"
130 +.Fa "ffi_abi abi"
131 +.Fa "unsigned int nfixedargs"
132 +.Fa "unsigned int ntotalargs"
133 +.Fa "ffi_type *rtype"
134 +.Fa "ffi_type **atypes"
135 +.Fc
136 +.Sh DESCRIPTION
137 +The
138 +.Nm ffi_prep_cif_var
139 +function prepares a
140 +.Nm ffi_cif
141 +structure for use with
142 +.Nm ffi_call
143 +for variadic functions.
144 +.Fa abi
145 +specifies a set of calling conventions to use.
146 +.Fa atypes
147 +is an array of
148 +.Fa ntotalargs
149 +pointers to
150 +.Nm ffi_type
151 +structs that describe the data type, size and alignment of each argument.
152 +.Fa rtype
153 +points to an
154 +.Nm ffi_type
155 +that describes the data type, size and alignment of the
156 +return value.
157 +.Fa nfixedargs
158 +must contain the number of fixed (non-variadic) arguments.
159 +Note that to call a non-variadic function
160 +.Nm ffi_prep_cif
161 +must be used.
162 +.Sh RETURN VALUES
163 +Upon successful completion,
164 +.Nm ffi_prep_cif_var
165 +returns
166 +.Nm FFI_OK .
167 +It will return
168 +.Nm FFI_BAD_TYPEDEF
169 +if
170 +.Fa cif
171 +is
172 +.Nm NULL
173 +or
174 +.Fa atypes
175 +or
176 +.Fa rtype
177 +is malformed. If
178 +.Fa abi
179 +does not refer to a valid ABI,
180 +.Nm FFI_BAD_ABI
181 +will be returned. Available ABIs are
182 +defined in
183 +.Nm <ffitarget.h>
184 +.
185 +.Sh SEE ALSO
186 +.Xr ffi 3 ,
187 +.Xr ffi_call 3 ,
188 +.Xr ffi_prep_cif 3
189 Index: libffi/src/arm/ffi.c
190 ===================================================================
191 --- libffi.orig/src/arm/ffi.c
192 +++ libffi/src/arm/ffi.c
193 @@ -196,6 +196,18 @@ ffi_status ffi_prep_cif_machdep(ffi_cif
194    return FFI_OK;
195  }
196  
197 +/* Perform machine dependent cif processing for variadic calls */
198 +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
199 +                                   unsigned int nfixedargs,
200 +                                   unsigned int ntotalargs)
201 +{
202 +  /* VFP variadic calls actually use the SYSV ABI */
203 +  if (cif->abi == FFI_VFP)
204 +       cif->abi = FFI_SYSV;
205 +
206 +  return ffi_prep_cif_machdep(cif);
207 +}
208 +
209  /* Prototypes for assembly functions, in sysv.S */
210  extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *);
211  extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *);
212 Index: libffi/src/arm/ffitarget.h
213 ===================================================================
214 --- libffi.orig/src/arm/ffitarget.h
215 +++ libffi/src/arm/ffitarget.h
216 @@ -55,6 +55,8 @@ typedef enum ffi_abi {
217  #define FFI_TYPE_STRUCT_VFP_FLOAT  (FFI_TYPE_LAST + 1)
218  #define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2)
219  
220 +#define FFI_TARGET_SPECIFIC_VARIADIC
221 +
222  /* ---- Definitions for closures ----------------------------------------- */
223  
224  #define FFI_CLOSURES 1
225 @@ -62,4 +64,3 @@ typedef enum ffi_abi {
226  #define FFI_NATIVE_RAW_API 0
227  
228  #endif
229 -
230 Index: libffi/src/cris/ffi.c
231 ===================================================================
232 --- libffi.orig/src/cris/ffi.c
233 +++ libffi/src/cris/ffi.c
234 @@ -153,21 +153,24 @@ ffi_prep_args (char *stack, extended_cif
235    return (struct_count);
236  }
237  
238 -ffi_status
239 -ffi_prep_cif (ffi_cif * cif,
240 -             ffi_abi abi, unsigned int nargs,
241 -             ffi_type * rtype, ffi_type ** atypes)
242 +ffi_status FFI_HIDDEN
243 +ffi_prep_cif_core (ffi_cif * cif,
244 +                  ffi_abi abi, unsigned int isvariadic,
245 +                  unsigned int nfixedargs, unsigned int ntotalargs,
246 +                  ffi_type * rtype, ffi_type ** atypes)
247  {
248    unsigned bytes = 0;
249    unsigned int i;
250    ffi_type **ptr;
251  
252    FFI_ASSERT (cif != NULL);
253 +  FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
254 +  FFI_ASSERT(nfixedargs <= ntotalargs);
255    FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
256  
257    cif->abi = abi;
258    cif->arg_types = atypes;
259 -  cif->nargs = nargs;
260 +  cif->nargs = ntotalargs;
261    cif->rtype = rtype;
262  
263    cif->flags = 0;
264 Index: libffi/src/prep_cif.c
265 ===================================================================
266 --- libffi.orig/src/prep_cif.c
267 +++ libffi/src/prep_cif.c
268 @@ -90,14 +90,27 @@ static ffi_status initialize_aggregate(f
269  /* Perform machine independent ffi_cif preparation, then call
270     machine dependent routine. */
271  
272 -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
273 -                       ffi_type *rtype, ffi_type **atypes)
274 +/* For non variadic functions isvariadic should be 0 and
275 +   nfixedargs==ntotalargs.
276 +
277 +   For variadic calls, isvariadic should be 1 and nfixedargs
278 +   and ntotalargs set as appropriate. nfixedargs must always be >=1 */
279 +
280 +
281 +ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
282 +                            unsigned int isvariadic,
283 +                             unsigned int nfixedargs,
284 +                             unsigned int ntotalargs,
285 +                            ffi_type *rtype, ffi_type **atypes)
286  {
287    unsigned bytes = 0;
288    unsigned int i;
289    ffi_type **ptr;
290  
291    FFI_ASSERT(cif != NULL);
292 +  FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
293 +  FFI_ASSERT(nfixedargs <= ntotalargs);
294 +
295  #ifndef X86_WIN32
296    if ((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI))
297      return FFI_BAD_ABI;
298 @@ -108,7 +121,7 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ff
299  
300    cif->abi = abi;
301    cif->arg_types = atypes;
302 -  cif->nargs = nargs;
303 +  cif->nargs = ntotalargs;
304    cif->rtype = rtype;
305  
306    cif->flags = 0;
307 @@ -164,10 +177,31 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ff
308    cif->bytes = bytes;
309  
310    /* Perform machine dependent cif processing */
311 +#ifdef FFI_TARGET_SPECIFIC_VARIADIC
312 +  if (isvariadic)
313 +       return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs);
314 +#endif
315 +
316    return ffi_prep_cif_machdep(cif);
317  }
318  #endif /* not __CRIS__ */
319  
320 +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
321 +                            ffi_type *rtype, ffi_type **atypes)
322 +{
323 +  return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes);
324 +}
325 +
326 +ffi_status ffi_prep_cif_var(ffi_cif *cif,
327 +                            ffi_abi abi,
328 +                            unsigned int nfixedargs,
329 +                            unsigned int ntotalargs,
330 +                            ffi_type *rtype,
331 +                            ffi_type **atypes)
332 +{
333 +  return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
334 +}
335 +
336  #if FFI_CLOSURES
337  
338  ffi_status
339 Index: libffi/testsuite/libffi.call/cls_double_va.c
340 ===================================================================
341 --- libffi.orig/testsuite/libffi.call/cls_double_va.c
342 +++ libffi/testsuite/libffi.call/cls_double_va.c
343 @@ -37,7 +37,8 @@ int main (void)
344         arg_types[1] = &ffi_type_double;
345         arg_types[2] = NULL;
346  
347 -       CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
348 +       /* This printf call is variadic */
349 +       CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
350                 arg_types) == FFI_OK);
351  
352         args[0] = &format;
353 @@ -49,6 +50,9 @@ int main (void)
354         printf("res: %d\n", (int) res);
355         // { dg-output "\nres: 4" }
356  
357 +       /* The call to cls_double_va_fn is static, so have to use a normal prep_cif */
358 +       CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, arg_types) == FFI_OK);
359 +
360         CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK);
361  
362         res     = ((int(*)(char*, double))(code))(format, doubleArg);
363 Index: libffi/testsuite/libffi.call/cls_longdouble_va.c
364 ===================================================================
365 --- libffi.orig/testsuite/libffi.call/cls_longdouble_va.c
366 +++ libffi/testsuite/libffi.call/cls_longdouble_va.c
367 @@ -37,7 +37,8 @@ int main (void)
368         arg_types[1] = &ffi_type_longdouble;
369         arg_types[2] = NULL;
370  
371 -       CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
372 +       /* This printf call is variadic */
373 +       CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
374                 arg_types) == FFI_OK);
375  
376         args[0] = &format;
377 @@ -49,6 +50,10 @@ int main (void)
378         printf("res: %d\n", (int) res);
379         // { dg-output "\nres: 4" }
380  
381 +       /* The call to cls_longdouble_va_fn is static, so have to use a normal prep_cif */
382 +       CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
383 +               arg_types) == FFI_OK);
384 +
385         CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK);
386  
387         res     = ((int(*)(char*, long double))(code))(format, ldArg);
388 Index: libffi/testsuite/libffi.call/float_va.c
389 ===================================================================
390 --- /dev/null
391 +++ libffi/testsuite/libffi.call/float_va.c
392 @@ -0,0 +1,107 @@
393 +/* Area:        fp and variadics
394 +   Purpose:     check fp inputs and returns work on variadics, even the fixed params
395 +   Limitations: None
396 +   PR:          none
397 +   Originator:  <david.gilbert@linaro.org> 2011-01-25
398 +
399 +   Intended to stress the difference in ABI on ARM vfp
400 +*/
401 +
402 +/* { dg-do run } */
403 +
404 +#include <stdarg.h>
405 +
406 +#include "ffitest.h"
407 +
408 +/* prints out all the parameters, and returns the sum of them all.
409 + * 'x' is the number of variadic parameters all of which are double in this test
410 + */
411 +double float_va_fn(unsigned int x, double y,...)
412 +{
413 +  double total=0.0;
414 +  va_list ap;
415 +  unsigned int i;
416 +
417 +  total+=(double)x;
418 +  total+=y;
419 +
420 +  printf("%u: %.1lf :", x, y);
421 +
422 +  va_start(ap, y);
423 +  for(i=0;i<x;i++)
424 +  {
425 +    double arg=va_arg(ap, double);
426 +    total+=arg;
427 +    printf(" %d:%.1lf ", i, arg);
428 +  }
429 +  va_end(ap);
430 +
431 +  printf(" total: %.1lf\n", total);
432 +
433 +  return total;
434 +}
435 +
436 +int main (void)
437 +{
438 +  ffi_cif    cif;
439 +
440 +  ffi_type    *arg_types[5];
441 +  void        *values[5];
442 +  double        doubles[5];
443 +  unsigned int firstarg;
444 +  double        resfp;
445 +
446 +  /* First test, pass float_va_fn(0,2.0) - note there are no actual
447 +   * variadic parameters, but it's declared variadic so the ABI may be
448 +   * different. */
449 +  /* Call it statically and then via ffi */
450 +  resfp=float_va_fn(0,2.0);
451 +  // { dg-output "0: 2.0 : total: 2.0" }
452 +  printf("compiled: %.1lf\n", resfp);
453 +  // { dg-output "\ncompiled: 2.0" }
454 +
455 +  arg_types[0] = &ffi_type_uint;
456 +  arg_types[1] = &ffi_type_double;
457 +  arg_types[2] = NULL;
458 +  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 2,
459 +        &ffi_type_double, arg_types) == FFI_OK);
460 +
461 +  firstarg = 0;
462 +  doubles[0] = 2.0;
463 +  values[0] = &firstarg;
464 +  values[1] = &doubles[0];
465 +  ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values);
466 +  // { dg-output "\n0: 2.0 : total: 2.0" }
467 +  printf("ffi: %.1lf\n", resfp);
468 +  // { dg-output "\nffi: 2.0" }
469 +
470 +  /* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */
471 +  /* Call it statically and then via ffi */
472 +  resfp=float_va_fn(2,2.0,3.0,4.0);
473 +  // { dg-output "\n2: 2.0 : 0:3.0  1:4.0  total: 11.0" }
474 +  printf("compiled: %.1lf\n", resfp);
475 +  // { dg-output "\ncompiled: 11.0" }
476 +
477 +  arg_types[0] = &ffi_type_uint;
478 +  arg_types[1] = &ffi_type_double;
479 +  arg_types[2] = &ffi_type_double;
480 +  arg_types[3] = &ffi_type_double;
481 +  arg_types[4] = NULL;
482 +  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 4,
483 +        &ffi_type_double, arg_types) == FFI_OK);
484 +
485 +  firstarg = 2;
486 +  doubles[0] = 2.0;
487 +  doubles[1] = 3.0;
488 +  doubles[2] = 4.0;
489 +  values[0] = &firstarg;
490 +  values[1] = &doubles[0];
491 +  values[2] = &doubles[1];
492 +  values[3] = &doubles[2];
493 +  ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values);
494 +  // { dg-output "\n2: 2.0 : 0:3.0  1:4.0  total: 11.0" }
495 +  printf("ffi: %.1lf\n", resfp);
496 +  // { dg-output "\nffi: 11.0" }
497 +
498 +  exit(0);
499 +}
500 Index: libffi/doc/libffi.texi
501 ===================================================================
502 --- libffi.orig/doc/libffi.texi
503 +++ libffi/doc/libffi.texi
504 @@ -19,7 +19,7 @@
505  This manual is for Libffi, a portable foreign-function interface
506  library.
507  
508 -Copyright @copyright{} 2008, 2010 Red Hat, Inc.
509 +Copyright @copyright{} 2008, 2010, 2011 Red Hat, Inc.
510  
511  @quotation
512  Permission is granted to copy, distribute and/or modify this document
513 @@ -133,8 +133,6 @@ This initializes @var{cif} according to
514  you want.  @ref{Multiple ABIs} for more information.
515  
516  @var{nargs} is the number of arguments that this function accepts.
517 -@samp{libffi} does not yet handle varargs functions; see @ref{Missing
518 -Features} for more information.
519  
520  @var{rtype} is a pointer to an @code{ffi_type} structure that
521  describes the return type of the function.  @xref{Types}.
522 @@ -150,6 +148,30 @@ objects is incorrect; or @code{FFI_BAD_A
523  is invalid.
524  @end defun
525  
526 +If the function being called is variadic (varargs) then
527 +@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}.
528 +
529 +@findex ffi_prep_cif_var
530 +@defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi var{abi}, unsigned int @var{nfixedargs}, unsigned int var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes})
531 +This initializes @var{cif} according to the given parameters for
532 +a call to a variadic function.  In general it's operation is the
533 +same as for @code{ffi_prep_cif} except that:
534 +
535 +@var{nfixedargs} is the number of fixed arguments, prior to any
536 +variadic arguments.  It must be greater than zero.
537 +
538 +@var{ntotalargs} the total number of arguments, including variadic
539 +and fixed arguments.
540 +
541 +Note that, different cif's must be prepped for calls to the same
542 +function when different numbers of arguments are passed.
543 +
544 +Also note that a call to @code{ffi_prep_cif_var} with
545 +@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to
546 +@code{ffi_prep_cif}.
547 +
548 +@end defun
549 +
550  
551  To call a function using an initialized @code{ffi_cif}, use the
552  @code{ffi_call} function:
553 @@ -572,9 +594,7 @@ support for these.
554  
555  @itemize @bullet
556  @item
557 -There is no support for calling varargs functions.  This may work on
558 -some platforms, depending on how the ABI is defined, but it is not
559 -reliable.
560 +Variadic closures.
561  
562  @item
563  There is no support for bit fields in structures.
564 @@ -591,6 +611,8 @@ The ``raw'' API is undocumented.
565  @c anything else?
566  @end itemize
567  
568 +Note that variadic support is very new and tested on a relatively
569 +small number of platforms.
570  
571  @node Index
572  @unnumbered Index
573 Index: libffi/ChangeLog
574 ===================================================================
575 --- libffi.orig/ChangeLog
576 +++ libffi/ChangeLog
577 @@ -59,6 +59,17 @@
578  
579         * configure: Regenerate.
580  
581 +2011-11-12  David Gilbert <david.gilbert@linaro.org>
582 +
583 +       * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h,
584 +       man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3,
585 +       man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h,
586 +       src/cris/ffi.c, src/prep_cif.c,
587 +       testsuite/libffi.call/cls_double_va.c,
588 +       testsuite/libffi.call/cls_longdouble_va.c,
589 +       testsuite/libffi.call/float_va.c: Many changes to support variadic
590 +       function calls.
591 +
592  2011-11-12  Kyle Moffett <Kyle.D.Moffett@boeing.com>
593  
594         * src/powerpc/ffi.c, src/powerpc/ffitarget.h,