(root)/
gcc-13.2.0/
libffi/
testsuite/
libffi.call/
struct4.c
       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    unsigned ui1;
      13    unsigned ui2;
      14    unsigned ui3;
      15  } test_structure_4;
      16  
      17  static test_structure_4 ABI_ATTR struct4(test_structure_4 ts)
      18  {
      19    ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3;
      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 ts4_type;
      30    ffi_type *ts4_type_elements[4];  
      31  
      32    test_structure_4 ts4_arg;
      33  
      34    /* This is a hack to get a properly aligned result buffer */
      35    test_structure_4 *ts4_result =
      36      (test_structure_4 *) malloc (sizeof(test_structure_4));
      37  
      38    ts4_type.size = 0;
      39    ts4_type.alignment = 0;
      40    ts4_type.type = FFI_TYPE_STRUCT;
      41    ts4_type.elements = ts4_type_elements;
      42    ts4_type_elements[0] = &ffi_type_uint;
      43    ts4_type_elements[1] = &ffi_type_uint;
      44    ts4_type_elements[2] = &ffi_type_uint;
      45    ts4_type_elements[3] = NULL;
      46  
      47    args[0] = &ts4_type;
      48    values[0] = &ts4_arg;
      49    
      50    /* Initialize the cif */
      51    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK);
      52    
      53    ts4_arg.ui1 = 2;
      54    ts4_arg.ui2 = 3;
      55    ts4_arg.ui3 = 4;
      56    
      57    ffi_call (&cif, FFI_FN(struct4), ts4_result, values);
      58    
      59    CHECK(ts4_result->ui3 == 2U * 3U * 4U);
      60   
      61    
      62    free (ts4_result);
      63    exit(0);
      64  }