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> 20050708 */ 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_5byte { 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char a; 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char b; 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char c; 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char d; 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char e; 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} cls_struct_5byte; 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectcls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_5byte a2) 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_5byte result; 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.a = a1.a + a2.a; 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.b = a1.b + a2.b; 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.c = a1.c + a2.c; 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.d = a1.d + a2.d; 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.e = a1.e + a2.e; 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n", 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a1.a, a1.b, a1.c, a1.d, a1.e, 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a2.a, a2.b, a2.c, a2.d, a2.e, 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.a, result.b, result.c, result.d, result.e); 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project return result; 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectstatic void 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectcls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void* userdata __UNUSED__) 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_5byte a1, a2; 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a1 = *(struct cls_struct_5byte*)(args[0]); 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a2 = *(struct cls_struct_5byte*)(args[1]); 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void) 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project static ffi_closure cl; 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_closure *pcl; 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void* args_dbl[5]; 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* cls_struct_fields[6]; 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type cls_struct_type; 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* dbl_arg_types[5]; 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = allocate_mmap (sizeof(ffi_closure)); 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = &cl; 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.size = 0; 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.alignment = 0; 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.type = FFI_TYPE_STRUCT; 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.elements = cls_struct_fields; 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[0] = &ffi_type_uchar; 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[1] = &ffi_type_uchar; 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[2] = &ffi_type_uchar; 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[3] = &ffi_type_uchar; 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[4] = &ffi_type_uchar; 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[5] = NULL; 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[0] = &cls_struct_type; 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[1] = &cls_struct_type; 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[2] = NULL; 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types) == FFI_OK); 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[0] = &g_dbl; 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[1] = &f_dbl; 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[2] = NULL; 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, 99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.d, res_dbl.e); 100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 139 248 10 6 8" } */ 101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.a = 0; 103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.b = 0; 104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.c = 0; 105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.d = 0; 106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.e = 0; 107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_closure(pcl, &cif, cls_struct_5byte_gn, NULL) == FFI_OK); 109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(pcl))(g_dbl, f_dbl); 111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ 112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, 113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl.d, res_dbl.e); 114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 139 248 10 6 8" } */ 115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit(0); 117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 118