OSDN Git Service

2005-02-23 Andreas Tobler <a.tobler@schweiz.ch>
[pf3gnuchains/gcc-fork.git] / libffi / 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,void* resp,void** args, 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)*(unsigned long long *)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)*(unsigned long long *)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                                   unsigned long long, 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
69 #ifdef USING_MMAP
70   pcl = allocate_mmap (sizeof(ffi_closure));
71 #else
72   pcl = &cl;
73 #endif
74
75   for (i = 0; i < 15; i++) {
76     cl_arg_types[i] = &ffi_type_uint64;
77   }
78   cl_arg_types[15] = &ffi_type_uint;
79   cl_arg_types[16] = NULL;
80
81   /* Initialize the cif */
82   CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
83                      &ffi_type_sint, cl_arg_types) == FFI_OK);
84
85   CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
86                          (void *) 3 /* userdata */) == FFI_OK);
87
88   res = (*((closure_test_type0)pcl))
89     (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL,
90      13LL, 19LL, 21LL, 1);
91   /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
92   printf("res: %d\n",res);
93   /* { dg-output "\nres: 680" } */
94
95   exit(0);
96 }