1 /* Area: closure_call 2 Purpose: Check multiple long long values passing. 3 Exceed the limit of gpr registers on PowerPC 4 Darwin. 5 Limitations: none. 6 PR: none. 7 Originator: <andreast (at) gcc.gnu.org> 20031026 */ 8 9 /* { dg-do run } */ 10 #include "ffitest.h" 11 12 static void 13 closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, 14 void* userdata) 15 { 16 *(ffi_arg*)resp = 17 (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + 18 (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + 19 (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + 20 (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + 21 (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + 22 (int)*(int *)args[10] + 23 (int)*(unsigned long long *)args[11] + 24 (int)*(unsigned long long *)args[12] + 25 (int)*(unsigned long long *)args[13] + 26 (int)*(unsigned long long *)args[14] + 27 *(int *)args[15] + (int)(long)userdata; 28 29 printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", 30 (int)*(unsigned long long *)args[0], 31 (int)*(unsigned long long *)args[1], 32 (int)*(unsigned long long *)args[2], 33 (int)*(unsigned long long *)args[3], 34 (int)*(unsigned long long *)args[4], 35 (int)*(unsigned long long *)args[5], 36 (int)*(unsigned long long *)args[6], 37 (int)*(unsigned long long *)args[7], 38 (int)*(unsigned long long *)args[8], 39 (int)*(unsigned long long *)args[9], 40 (int)*(int *)args[10], 41 (int)*(unsigned long long *)args[11], 42 (int)*(unsigned long long *)args[12], 43 (int)*(unsigned long long *)args[13], 44 (int)*(unsigned long long *)args[14], 45 *(int *)args[15], 46 (int)(long)userdata, (int)*(ffi_arg *)resp); 47 48 } 49 50 typedef int (*closure_test_type0)(unsigned long long, unsigned long long, 51 unsigned long long, unsigned long long, 52 unsigned long long, unsigned long long, 53 unsigned long long, unsigned long long, 54 unsigned long long, unsigned long long, 55 int, unsigned long long, 56 unsigned long long, unsigned long long, 57 unsigned long long, int); 58 59 int main (void) 60 { 61 ffi_cif cif; 62 #ifndef USING_MMAP 63 static ffi_closure cl; 64 #endif 65 ffi_closure *pcl; 66 ffi_type * cl_arg_types[17]; 67 int i, res; 68 #ifdef USING_MMAP 69 pcl = allocate_mmap (sizeof(ffi_closure)); 70 #else 71 pcl = &cl; 72 #endif 73 74 for (i = 0; i < 10; i++) { 75 cl_arg_types[i] = &ffi_type_uint64; 76 } 77 cl_arg_types[10] = &ffi_type_sint; 78 for (i = 11; i < 15; i++) { 79 cl_arg_types[i] = &ffi_type_uint64; 80 } 81 cl_arg_types[15] = &ffi_type_sint; 82 cl_arg_types[16] = NULL; 83 84 /* Initialize the cif */ 85 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, 86 &ffi_type_sint, cl_arg_types) == FFI_OK); 87 88 CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn5, 89 (void *) 3 /* userdata */) == FFI_OK); 90 91 res = (*((closure_test_type0)pcl)) 92 (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, 93 13LL, 19LL, 21LL, 1); 94 /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ 95 printf("res: %d\n",res); 96 /* { dg-output "\nres: 680" } */ 97 98 exit(0); 99 } 100