~ubuntu-branches/ubuntu/lucid/gauche-c-wrapper/lucid

« back to all changes in this revision

Viewing changes to libffi/testsuite/libffi.call/closure_fn4.c

  • Committer: Bazaar Package Importer
  • Author(s): NIIBE Yutaka
  • Date: 2008-04-07 09:15:03 UTC
  • Revision ID: james.westby@ubuntu.com-20080407091503-wu0h414koe95kj4i
Tags: upstream-0.5.2
ImportĀ upstreamĀ versionĀ 0.5.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}