1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area: ffi_call, closure_call 2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Purpose: Check passing of multiple unsigned char values. 3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Limitations: none. 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PR: PR13221. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Originator: <andreast@gcc.gnu.org> 20031129 */ 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */ 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitest.h" 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectunsigned char test_func_fn(unsigned char a1, unsigned char a2, 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char a3, unsigned char a4) 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char result; 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project result = a1 + a2 + a3 + a4; 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project return result; 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectstatic void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void *data __UNUSED__) 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char a1, a2, a3, a4; 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a1 = *(unsigned char *)avals[0]; 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a2 = *(unsigned char *)avals[1]; 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a3 = *(unsigned char *)avals[2]; 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a4 = *(unsigned char *)avals[3]; 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef unsigned char (*test_type)(unsigned char, unsigned char, 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char, unsigned char); 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals, 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void *data __UNUSED__) 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("%d %d %d %d\n", *(unsigned char *)avals[0], 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(unsigned char *)avals[1], *(unsigned char *)avals[2], 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(unsigned char *)avals[3]); 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void) 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project static ffi_closure cl; 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_closure *pcl; 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void * args_dbl[5]; 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type * cl_arg_types[5]; 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_arg res_call; 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project unsigned char a, b, c, d, res_closure; 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = allocate_mmap (sizeof(ffi_closure)); 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = &cl; 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a = 1; 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project b = 2; 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project c = 127; 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project d = 125; 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[0] = &a; 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[1] = &b; 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[2] = &c; 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[3] = &d; 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args_dbl[4] = NULL; 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[0] = &ffi_type_uchar; 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[1] = &ffi_type_uchar; 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[2] = &ffi_type_uchar; 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[3] = &ffi_type_uchar; 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[4] = NULL; 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* Initialize the cif */ 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project &ffi_type_uchar, cl_arg_types) == FFI_OK); 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "1 2 127 125: 255" } */ 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d\n", (unsigned char)res_call); 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 255" } */ 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_closure(pcl, &cif, test_func_gn, NULL) == FFI_OK); 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project res_closure = (*((test_type)pcl))(1, 2, 127, 125); 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\n1 2 127 125: 255" } */ 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("res: %d\n", res_closure); 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\nres: 255" } */ 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit(0); 99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 100