1457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique/* Area: closure_call 2457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique Purpose: Check multiple long long values passing. 3457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique Exceed the limit of gpr registers on PowerPC 4457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique Darwin. 5457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique Limitations: none. 6457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique PR: none. 7457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique Originator: <andreast@gcc.gnu.org> 20031026 */ 8457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 9457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique/* { dg-do run } */ 10457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique#include "ffitest.h" 11457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 12457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piquestatic void 13457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piqueclosure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, 14457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique void* userdata) 15457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique{ 16457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique *(ffi_arg*)resp = 17457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + 18457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + 19457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + 20457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + 21457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + 22457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(int *)args[10] + 23457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[11] + 24457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[12] + 25457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[13] + 26457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[14] + 27457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique *(int *)args[15] + (intptr_t)userdata; 28457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 29457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", 30457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[0], 31457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[1], 32457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[2], 33457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[3], 34457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[4], 35457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[5], 36457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[6], 37457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[7], 38457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[8], 39457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[9], 40457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(int *)args[10], 41457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[11], 42457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[12], 43457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[13], 44457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)*(unsigned long long *)args[14], 45457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique *(int *)args[15], 46457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); 47457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 48457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique} 49457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 50457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piquetypedef int (*closure_test_type0)(unsigned long long, unsigned long long, 51457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique unsigned long long, unsigned long long, 52457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique unsigned long long, unsigned long long, 53457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique unsigned long long, unsigned long long, 54457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique unsigned long long, unsigned long long, 55457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique int, unsigned long long, 56457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique unsigned long long, unsigned long long, 57457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique unsigned long long, int); 58457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 59457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Piqueint main (void) 60457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique{ 61457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique ffi_cif cif; 62457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique void *code; 63457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); 64457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique ffi_type * cl_arg_types[17]; 65457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique int i, res; 66457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 67457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique for (i = 0; i < 10; i++) { 68457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique cl_arg_types[i] = &ffi_type_uint64; 69457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique } 70457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique cl_arg_types[10] = &ffi_type_sint; 71457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique for (i = 11; i < 15; i++) { 72457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique cl_arg_types[i] = &ffi_type_uint64; 73457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique } 74457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique cl_arg_types[15] = &ffi_type_sint; 75457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique cl_arg_types[16] = NULL; 76457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 77457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique /* Initialize the cif */ 78457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, 79457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique &ffi_type_sint, cl_arg_types) == FFI_OK); 80457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 81457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5, 82457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (void *) 3 /* userdata */, code) == FFI_OK); 83457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 84457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique res = (*((closure_test_type0)code)) 85457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, 86457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 13LL, 19LL, 21LL, 1); 87457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ 88457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique printf("res: %d\n",res); 89457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique /* { dg-output "\nres: 680" } */ 90457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique 91457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique exit(0); 92457ba79995d512b9e8c07061fe10d4cd88273b2Lloyd Pique} 93