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