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  typedef struct
      10  {
      11    char c1;
      12    char c2;
      13  } test_structure_5;
      14  
      15  static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2)
      16  {
      17    ts1.c1 += ts2.c1;
      18    ts1.c2 -= ts2.c2;
      19    
      20    return ts1;
      21  }
      22  
      23  int main (void)
      24  {
      25    ffi_cif cif;
      26    ffi_type *args[MAX_ARGS];
      27    void *values[MAX_ARGS];
      28    ffi_type ts5_type;
      29    ffi_type *ts5_type_elements[3];
      30  
      31    test_structure_5 ts5_arg1, ts5_arg2;
      32  
      33    /* This is a hack to get a properly aligned result buffer */
      34    test_structure_5 *ts5_result =
      35      (test_structure_5 *) malloc (sizeof(test_structure_5));
      36  
      37    ts5_type.size = 0;
      38    ts5_type.alignment = 0;
      39    ts5_type.type = FFI_TYPE_STRUCT;
      40    ts5_type.elements = ts5_type_elements;
      41    ts5_type_elements[0] = &ffi_type_schar;
      42    ts5_type_elements[1] = &ffi_type_schar;
      43    ts5_type_elements[2] = NULL;
      44  
      45    args[0] = &ts5_type;
      46    args[1] = &ts5_type;
      47    values[0] = &ts5_arg1;
      48    values[1] = &ts5_arg2;
      49    
      50    /* Initialize the cif */
      51    CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK);
      52    
      53    ts5_arg1.c1 = 2;
      54    ts5_arg1.c2 = 6;
      55    ts5_arg2.c1 = 5;
      56    ts5_arg2.c2 = 3;
      57    
      58    ffi_call (&cif, FFI_FN(struct5), ts5_result, values);
      59    
      60    CHECK(ts5_result->c1 == 7); 
      61    CHECK(ts5_result->c2 == 3);
      62    
      63    
      64    free (ts5_result);
      65    exit(0);
      66  }