github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/struct9.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    float f;
    13    int i;
    14  } test_structure_9;
    15  
    16  static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts)
    17  {
    18    ts.f += 1;
    19    ts.i += 1;
    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 ts9_type;
    30    ffi_type *ts9_type_elements[3];
    31  
    32    test_structure_9 ts9_arg;
    33  
    34    /* This is a hack to get a properly aligned result buffer */
    35    test_structure_9 *ts9_result =
    36      (test_structure_9 *) malloc (sizeof(test_structure_9));
    37  
    38    ts9_type.size = 0;
    39    ts9_type.alignment = 0;
    40    ts9_type.type = FFI_TYPE_STRUCT;
    41    ts9_type.elements = ts9_type_elements;
    42    ts9_type_elements[0] = &ffi_type_float;
    43    ts9_type_elements[1] = &ffi_type_sint;
    44    ts9_type_elements[2] = NULL;
    45  
    46    args[0] = &ts9_type;
    47    values[0] = &ts9_arg;
    48    
    49    /* Initialize the cif */
    50    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK);
    51    
    52    ts9_arg.f = 5.55f;
    53    ts9_arg.i = 5;
    54    
    55    printf ("%g\n", ts9_arg.f);
    56    printf ("%d\n", ts9_arg.i);
    57    
    58    ffi_call(&cif, FFI_FN(struct9), ts9_result, values);
    59  
    60    printf ("%g\n", ts9_result->f);
    61    printf ("%d\n", ts9_result->i);
    62    
    63    CHECK(ts9_result->f == 5.55f + 1);
    64    CHECK(ts9_result->i == 5 + 1);
    65  
    66    free (ts9_result);
    67    exit(0);
    68  }