github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/many2.c (about)

     1  /* Area:        ffi_call
     2     Purpose:     Check uint8_t arguments.
     3     Limitations: none.
     4     PR:          PR45677.
     5     Originator:  Dan Witte <dwitte@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  }