1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area:	ffi_call, closure_call
2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Purpose:	Check passing of multiple unsigned char values.
3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Limitations:	none.
4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   PR:		PR13221.
5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Originator:	<andreast@gcc.gnu.org> 20031129  */
6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */
8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitest.h"
9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectunsigned char test_func_fn(unsigned char a1, unsigned char a2,
11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			   unsigned char a3, unsigned char a4)
12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  unsigned char result;
14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  result = a1 + a2 + a3 + a4;
16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  return result;
20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectstatic void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			 void *data __UNUSED__)
25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  unsigned char a1, a2, a3, a4;
27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  a1 = *(unsigned char *)avals[0];
29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  a2 = *(unsigned char *)avals[1];
30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  a3 = *(unsigned char *)avals[2];
31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  a4 = *(unsigned char *)avals[3];
32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef unsigned char (*test_type)(unsigned char, unsigned char,
38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project				   unsigned char, unsigned char);
39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals,
41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	       void *data __UNUSED__)
42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  printf("%d %d %d %d\n", *(unsigned char *)avals[0],
44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 *(unsigned char *)avals[1], *(unsigned char *)avals[2],
45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	 *(unsigned char *)avals[3]);
46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void)
48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_cif cif;
50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP
51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  static ffi_closure cl;
52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_closure *pcl;
54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  void * args_dbl[5];
55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_type * cl_arg_types[5];
56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_arg res_call;
57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  unsigned char a, b, c, d, res_closure;
58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP
60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  pcl = allocate_mmap (sizeof(ffi_closure));
61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  pcl = &cl;
63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  a = 1;
66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  b = 2;
67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  c = 127;
68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  d = 125;
69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  args_dbl[0] = &a;
71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  args_dbl[1] = &b;
72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  args_dbl[2] = &c;
73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  args_dbl[3] = &d;
74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  args_dbl[4] = NULL;
75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  cl_arg_types[0] = &ffi_type_uchar;
77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  cl_arg_types[1] = &ffi_type_uchar;
78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  cl_arg_types[2] = &ffi_type_uchar;
79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  cl_arg_types[3] = &ffi_type_uchar;
80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  cl_arg_types[4] = NULL;
81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  /* Initialize the cif */
83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project		     &ffi_type_uchar, cl_arg_types) == FFI_OK);
85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  /* { dg-output "1 2 127 125: 255" } */
88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  printf("res: %d\n", (unsigned char)res_call);
89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  /* { dg-output "\nres: 255" } */
90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  CHECK(ffi_prep_closure(pcl, &cif, test_func_gn, NULL)  == FFI_OK);
92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  res_closure = (*((test_type)pcl))(1, 2, 127, 125);
94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  /* { dg-output "\n1 2 127 125: 255" } */
95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  printf("res: %d\n", res_closure);
96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  /* { dg-output "\nres: 255" } */
97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  exit(0);
99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
100