~ubuntu-branches/ubuntu/trusty/python3.4/trusty-proposed

« back to all changes in this revision

Viewing changes to Modules/_ctypes/libffi/testsuite/libffi.call/closure_fn5.c

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-11-25 09:44:27 UTC
  • Revision ID: package-import@ubuntu.com-20131125094427-lzxj8ap5w01lmo7f
Tags: upstream-3.4~b1
ImportĀ upstreamĀ versionĀ 3.4~b1

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
                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
 
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] + (intptr_t)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)(intptr_t)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
  void *code;
 
63
  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
 
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_sint;
 
71
  for (i = 11; i < 15; i++) {
 
72
    cl_arg_types[i] = &ffi_type_uint64;
 
73
  }
 
74
  cl_arg_types[15] = &ffi_type_sint;
 
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_loc(pcl, &cif, closure_test_fn5,
 
82
                             (void *) 3 /* userdata */, code) == FFI_OK);
 
83
 
 
84
  res = (*((closure_test_type0)code))
 
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
  printf("res: %d\n",res);
 
89
  /* { dg-output "\nres: 680" } */
 
90
 
 
91
  exit(0);
 
92
}