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  }