OSDN Git Service

e46b4574ace31d69e5a388056cf58479f58465b7
[android-x86/external-libffi.git] / testsuite / libffi.call / closure_fn4.c
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@gcc.gnu.org> 20031026  */
8
9 /* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
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_uint;
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 }