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