1*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */ 2*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h" 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan typedef struct 5*1fd5a2e1SPrashanth Swaminathan { 6*1fd5a2e1SPrashanth Swaminathan unsigned char uc; 7*1fd5a2e1SPrashanth Swaminathan double d; 8*1fd5a2e1SPrashanth Swaminathan unsigned int ui; 9*1fd5a2e1SPrashanth Swaminathan } test_structure_1; 10*1fd5a2e1SPrashanth Swaminathan struct1(test_structure_1 ts)11*1fd5a2e1SPrashanth Swaminathanstatic test_structure_1 struct1(test_structure_1 ts) 12*1fd5a2e1SPrashanth Swaminathan { 13*1fd5a2e1SPrashanth Swaminathan ts.uc++; 14*1fd5a2e1SPrashanth Swaminathan ts.d--; 15*1fd5a2e1SPrashanth Swaminathan ts.ui++; 16*1fd5a2e1SPrashanth Swaminathan 17*1fd5a2e1SPrashanth Swaminathan return ts; 18*1fd5a2e1SPrashanth Swaminathan } 19*1fd5a2e1SPrashanth Swaminathan main(void)20*1fd5a2e1SPrashanth Swaminathanint main (void) 21*1fd5a2e1SPrashanth Swaminathan { 22*1fd5a2e1SPrashanth Swaminathan ffi_cif cif; 23*1fd5a2e1SPrashanth Swaminathan ffi_type *args[MAX_ARGS]; 24*1fd5a2e1SPrashanth Swaminathan void *values[MAX_ARGS]; 25*1fd5a2e1SPrashanth Swaminathan ffi_type ts1_type; 26*1fd5a2e1SPrashanth Swaminathan ffi_type *ts1_type_elements[4]; 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan memset(&cif, 1, sizeof(cif)); 29*1fd5a2e1SPrashanth Swaminathan ts1_type.size = 0; 30*1fd5a2e1SPrashanth Swaminathan ts1_type.alignment = 0; 31*1fd5a2e1SPrashanth Swaminathan ts1_type.type = FFI_TYPE_STRUCT; 32*1fd5a2e1SPrashanth Swaminathan ts1_type.elements = ts1_type_elements; 33*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[0] = &ffi_type_uchar; 34*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[1] = &ffi_type_double; 35*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[2] = &ffi_type_uint; 36*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[3] = NULL; 37*1fd5a2e1SPrashanth Swaminathan 38*1fd5a2e1SPrashanth Swaminathan test_structure_1 ts1_arg; 39*1fd5a2e1SPrashanth Swaminathan /* This is a hack to get a properly aligned result buffer */ 40*1fd5a2e1SPrashanth Swaminathan test_structure_1 *ts1_result = 41*1fd5a2e1SPrashanth Swaminathan (test_structure_1 *) malloc (sizeof(test_structure_1)); 42*1fd5a2e1SPrashanth Swaminathan 43*1fd5a2e1SPrashanth Swaminathan args[0] = &ts1_type; 44*1fd5a2e1SPrashanth Swaminathan values[0] = &ts1_arg; 45*1fd5a2e1SPrashanth Swaminathan 46*1fd5a2e1SPrashanth Swaminathan /* Initialize the cif */ 47*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 48*1fd5a2e1SPrashanth Swaminathan &ts1_type, args) == FFI_OK); 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan ts1_arg.uc = '\x01'; 51*1fd5a2e1SPrashanth Swaminathan ts1_arg.d = 3.14159; 52*1fd5a2e1SPrashanth Swaminathan ts1_arg.ui = 555; 53*1fd5a2e1SPrashanth Swaminathan 54*1fd5a2e1SPrashanth Swaminathan ffi_call(&cif, FFI_FN(struct1), ts1_result, values); 55*1fd5a2e1SPrashanth Swaminathan 56*1fd5a2e1SPrashanth Swaminathan CHECK(ts1_result->ui == 556); 57*1fd5a2e1SPrashanth Swaminathan CHECK(ts1_result->d == 3.14159 - 1); 58*1fd5a2e1SPrashanth Swaminathan 59*1fd5a2e1SPrashanth Swaminathan free (ts1_result); 60*1fd5a2e1SPrashanth Swaminathan exit(0); 61*1fd5a2e1SPrashanth Swaminathan } 62