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. Darwin/AIX do double-word 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project alignment of the struct if the first element is a double. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Check that it does not here. 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Limitations: none. 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PR: none. 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Originator: <andreast@gcc.gnu.org> 20030914 */ 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */ 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitest.h" 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef struct cls_struct_9byte { 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project int a; 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project double b; 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} cls_struct_9byte; 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectcls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_9byte b2) 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_9byte result; 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.a = b1.a + b2.a; 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.b = b1.b + b2.b; 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b, 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result.a, result.b); 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project return result; 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectstatic void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void** args, void* userdata __UNUSED__) 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_9byte b1, b2; 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project b1 = *(struct cls_struct_9byte*)(args[0]); 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project b2 = *(struct cls_struct_9byte*)(args[1]); 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void) 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project static ffi_closure cl; 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_closure *pcl; 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void* args_dbl[3]; 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* cls_struct_fields[3]; 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type cls_struct_type; 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* dbl_arg_types[3]; 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = allocate_mmap (sizeof(ffi_closure)); 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = &cl; 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.size = 0; 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.alignment = 0; 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.type = FFI_TYPE_STRUCT; 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_type.elements = cls_struct_fields; 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_9byte h_dbl = { 7, 8.0}; 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_9byte j_dbl = { 1, 9.0}; 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project struct cls_struct_9byte res_dbl; 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[0] = &ffi_type_sint; 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[1] = &ffi_type_double; 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cls_struct_fields[2] = NULL; 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[0] = &cls_struct_type; 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[1] = &cls_struct_type; 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types[2] = NULL; 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project dbl_arg_types) == FFI_OK); 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[0] = &h_dbl; 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[1] = &j_dbl; 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[2] = NULL; 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "7 8 1 9: 8 17" } */ 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d %g\n", res_dbl.a, res_dbl.b); 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 8 17" } */ 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_closure(pcl, &cif, cls_struct_9byte_gn, NULL) == FFI_OK); 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(pcl))(h_dbl, j_dbl); 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\n7 8 1 9: 8 17" } */ 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d %g\n", res_dbl.a, res_dbl.b); 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 8 17" } */ 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit(0); 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 99