• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@gcc.gnu.org> 20031026	 */
8 
9 /* { dg-do run } */
10 #include "ffitest.h"
11 
12 static void
closure_test_fn5(ffi_cif * cif __UNUSED__,void * resp,void ** args,void * userdata)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 
main(void)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