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  }