OSDN Git Service

2003-11-08 Andreas Tobler <a.tobler@schweiz.ch>
[pf3gnuchains/gcc-fork.git] / libffi / testsuite / libffi.call / closure_fn5.c
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 { xfail mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
10
11 #include "ffitest.h"
12
13 static void
14 closure_test_fn5(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)*(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   static ffi_closure cl;
63   ffi_closure *pcl = &cl;
64   ffi_type * cl_arg_types[17];
65   int i, res;
66
67   for (i = 0; i < 10; i++) {
68     cl_arg_types[i] = &ffi_type_uint64;
69   }
70   cl_arg_types[10] = &ffi_type_uint;
71   for (i = 11; i < 15; i++) {
72     cl_arg_types[i] = &ffi_type_uint64;
73   }
74   cl_arg_types[15] = &ffi_type_uint;
75   cl_arg_types[16] = NULL;
76   
77   /* Initialize the cif */
78   CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
79                      &ffi_type_sint, cl_arg_types) == FFI_OK);
80   
81   CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn5,
82                          (void *) 3 /* userdata */) == FFI_OK);
83   
84   res = (*((closure_test_type0)pcl))
85     (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL,
86      13LL, 19LL, 21LL, 1);
87   /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
88   CHECK(res == 680);
89   exit(0);
90 }