Home | History | Annotate | Download | only in libffi.call
      1 /* Area:        ffi_call
      2    Purpose:     Check uint8_t arguments.
      3    Limitations: none.
      4    PR:          PR45677.
      5    Originator:  Dan Witte <dwitte (at) gmail.com> 20100916  */
      6 
      7 /* { dg-do run } */
      8 
      9 #include "ffitest.h"
     10 
     11 #define NARGS 7
     12 
     13 typedef unsigned char u8;
     14 
     15 #ifdef __GNUC__
     16 __attribute__((noinline))
     17 #endif
     18 uint8_t
     19 foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
     20      uint8_t e, uint8_t f, uint8_t g)
     21 {
     22   return a + b + c + d + e + f + g;
     23 }
     24 
     25 uint8_t ABI_ATTR
     26 bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
     27      uint8_t e, uint8_t f, uint8_t g)
     28 {
     29   return foo (a, b, c, d, e, f, g);
     30 }
     31 
     32 int
     33 main (void)
     34 {
     35   ffi_type *ffitypes[NARGS];
     36   int i;
     37   ffi_cif cif;
     38   ffi_arg result = 0;
     39   uint8_t args[NARGS];
     40   void *argptrs[NARGS];
     41 
     42   for (i = 0; i < NARGS; ++i)
     43     ffitypes[i] = &ffi_type_uint8;
     44 
     45   CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS,
     46 		       &ffi_type_uint8, ffitypes) == FFI_OK);
     47 
     48   for (i = 0; i < NARGS; ++i)
     49     {
     50       args[i] = i;
     51       argptrs[i] = &args[i];
     52     }
     53   ffi_call (&cif, FFI_FN (bar), &result, argptrs);
     54 
     55   CHECK (result == 21);
     56   return 0;
     57 }
     58