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

     1  /* Area:	ffi_call
     2     Purpose:	Check structures.
     3     Limitations:	none.
     4     PR:		none.
     5     Originator:	From the original ffitest.c  */
     6  
     7  /* { dg-do run } */
     8  #include "ffitest.h"
     9  
    10  typedef struct
    11  {
    12    unsigned char uc;
    13    double d;
    14    unsigned int ui;
    15  } test_structure_1;
    16  
    17  static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
    18  {
    19    ts.uc++;
    20    ts.d--;
    21    ts.ui++;
    22  
    23    return ts;
    24  }
    25  
    26  int main (void)
    27  {
    28    ffi_cif cif;
    29    ffi_type *args[MAX_ARGS];
    30    void *values[MAX_ARGS];
    31    ffi_type ts1_type;
    32    ffi_type *ts1_type_elements[4];
    33  
    34    test_structure_1 ts1_arg;
    35  
    36    /* This is a hack to get a properly aligned result buffer */
    37    test_structure_1 *ts1_result =
    38      (test_structure_1 *) malloc (sizeof(test_structure_1));
    39  
    40    ts1_type.size = 0;
    41    ts1_type.alignment = 0;
    42    ts1_type.type = FFI_TYPE_STRUCT;
    43    ts1_type.elements = ts1_type_elements;
    44    ts1_type_elements[0] = &ffi_type_uchar;
    45    ts1_type_elements[1] = &ffi_type_double;
    46    ts1_type_elements[2] = &ffi_type_uint;
    47    ts1_type_elements[3] = NULL;
    48    
    49    args[0] = &ts1_type;
    50    values[0] = &ts1_arg;
    51    
    52    /* Initialize the cif */
    53    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
    54  		     &ts1_type, args) == FFI_OK);
    55    
    56    ts1_arg.uc = '\x01';
    57    ts1_arg.d = 3.14159;
    58    ts1_arg.ui = 555;
    59  
    60    ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
    61    
    62    CHECK(ts1_result->ui == 556);
    63    CHECK(ts1_result->d == 3.14159 - 1);
    64   
    65    free (ts1_result);
    66    exit(0);
    67  }