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 int si; 13 } test_structure_3; 14 struct3(test_structure_3 ts)15static test_structure_3 ABI_ATTR struct3(test_structure_3 ts) 16 { 17 ts.si = -(ts.si*2); 18 19 return ts; 20 } 21 main(void)22int main (void) 23 { 24 ffi_cif cif; 25 ffi_type *args[MAX_ARGS]; 26 void *values[MAX_ARGS]; 27 int compare_value; 28 ffi_type ts3_type; 29 ffi_type *ts3_type_elements[2]; 30 31 test_structure_3 ts3_arg; 32 test_structure_3 *ts3_result = 33 (test_structure_3 *) malloc (sizeof(test_structure_3)); 34 35 ts3_type.size = 0; 36 ts3_type.alignment = 0; 37 ts3_type.type = FFI_TYPE_STRUCT; 38 ts3_type.elements = ts3_type_elements; 39 ts3_type_elements[0] = &ffi_type_sint; 40 ts3_type_elements[1] = NULL; 41 42 args[0] = &ts3_type; 43 values[0] = &ts3_arg; 44 45 /* Initialize the cif */ 46 CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, 47 &ts3_type, args) == FFI_OK); 48 49 ts3_arg.si = -123; 50 compare_value = ts3_arg.si; 51 52 ffi_call(&cif, FFI_FN(struct3), ts3_result, values); 53 54 printf ("%d %d\n", ts3_result->si, -(compare_value*2)); 55 56 CHECK(ts3_result->si == -(compare_value*2)); 57 58 free (ts3_result); 59 exit(0); 60 } 61