github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/struct4.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 ui1;
    13    unsigned ui2;
    14    unsigned ui3;
    15  } test_structure_4;
    16  
    17  static test_structure_4 ABI_ATTR struct4(test_structure_4 ts)
    18  {
    19    ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3;
    20  
    21    return ts;
    22  }
    23  
    24  int main (void)
    25  {
    26    ffi_cif cif;
    27    ffi_type *args[MAX_ARGS];
    28    void *values[MAX_ARGS];
    29    ffi_type ts4_type;
    30    ffi_type *ts4_type_elements[4];  
    31  
    32    test_structure_4 ts4_arg;
    33  
    34    /* This is a hack to get a properly aligned result buffer */
    35    test_structure_4 *ts4_result =
    36      (test_structure_4 *) malloc (sizeof(test_structure_4));
    37  
    38    ts4_type.size = 0;
    39    ts4_type.alignment = 0;
    40    ts4_type.type = FFI_TYPE_STRUCT;
    41    ts4_type.elements = ts4_type_elements;
    42    ts4_type_elements[0] = &ffi_type_uint;
    43    ts4_type_elements[1] = &ffi_type_uint;
    44    ts4_type_elements[2] = &ffi_type_uint;
    45    ts4_type_elements[3] = NULL;
    46  
    47    args[0] = &ts4_type;
    48    values[0] = &ts4_arg;
    49    
    50    /* Initialize the cif */
    51    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK);
    52    
    53    ts4_arg.ui1 = 2;
    54    ts4_arg.ui2 = 3;
    55    ts4_arg.ui3 = 4;
    56    
    57    ffi_call (&cif, FFI_FN(struct4), ts4_result, values);
    58    
    59    CHECK(ts4_result->ui3 == 2U * 3U * 4U);
    60   
    61    
    62    free (ts4_result);
    63    exit(0);
    64  }