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 float f; 12 double d; 13 } test_structure_6; 14 struct6(test_structure_6 ts)15static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts) 16 { 17 ts.f += 1; 18 ts.d += 1; 19 20 return ts; 21 } 22 main(void)23int main (void) 24 { 25 ffi_cif cif; 26 ffi_type *args[MAX_ARGS]; 27 void *values[MAX_ARGS]; 28 ffi_type ts6_type; 29 ffi_type *ts6_type_elements[3]; 30 31 test_structure_6 ts6_arg; 32 33 /* This is a hack to get a properly aligned result buffer */ 34 test_structure_6 *ts6_result = 35 (test_structure_6 *) malloc (sizeof(test_structure_6)); 36 37 ts6_type.size = 0; 38 ts6_type.alignment = 0; 39 ts6_type.type = FFI_TYPE_STRUCT; 40 ts6_type.elements = ts6_type_elements; 41 ts6_type_elements[0] = &ffi_type_float; 42 ts6_type_elements[1] = &ffi_type_double; 43 ts6_type_elements[2] = NULL; 44 45 args[0] = &ts6_type; 46 values[0] = &ts6_arg; 47 48 /* Initialize the cif */ 49 CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK); 50 51 ts6_arg.f = 5.55f; 52 ts6_arg.d = 6.66; 53 54 printf ("%g\n", ts6_arg.f); 55 printf ("%g\n", ts6_arg.d); 56 57 ffi_call(&cif, FFI_FN(struct6), ts6_result, values); 58 59 CHECK(ts6_result->f == 5.55f + 1); 60 CHECK(ts6_result->d == 6.66 + 1); 61 62 free (ts6_result); 63 exit(0); 64 } 65