Home | History | Annotate | Download | only in libffi.call
      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