1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area: ffi_call, closure_call 2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Purpose: Check structure passing with different structure size. 3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Depending on the ABI. Check overlapping. 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Limitations: none. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PR: none. 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Originator: <andreast@gcc.gnu.org> 20030828 */ 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */ 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitest.h" 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef struct cls_struct_7byte { 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned short a; 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned short b; 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char c; 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned short d; 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} cls_struct_7byte; 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectcls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_7byte a2) 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_7byte result; 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.a = a1.a + a2.a; 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.b = a1.b + a2.b; 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.c = a1.c + a2.c; 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.d = a1.d + a2.d; 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a2.a, a2.b, a2.c, a2.d, 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.a, result.b, result.c, result.d); 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project return result; 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectstatic void 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectcls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void* userdata __UNUSED__) 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_7byte a1, a2; 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a1 = *(struct cls_struct_7byte*)(args[0]); 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a2 = *(struct cls_struct_7byte*)(args[1]); 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void) 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project static ffi_closure cl; 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_closure *pcl; 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void* args_dbl[5]; 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* cls_struct_fields[5]; 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type cls_struct_type; 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* dbl_arg_types[5]; 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = allocate_mmap (sizeof(ffi_closure)); 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = &cl; 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.size = 0; 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.alignment = 0; 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.type = FFI_TYPE_STRUCT; 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.elements = cls_struct_fields; 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_7byte res_dbl; 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[0] = &ffi_type_ushort; 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[1] = &ffi_type_ushort; 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[2] = &ffi_type_uchar; 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[3] = &ffi_type_ushort; 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[4] = NULL; 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[0] = &cls_struct_type; 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[1] = &cls_struct_type; 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[2] = NULL; 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types) == FFI_OK); 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[0] = &g_dbl; 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[1] = &f_dbl; 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[2] = NULL; 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */ 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 139 248 10 509" } */ 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_closure(pcl, &cif, cls_struct_7byte_gn, NULL) == FFI_OK); 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(pcl))(g_dbl, f_dbl); 100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */ 101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); 102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 139 248 10 509" } */ 103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit(0); 105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 106