1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area:	ffi_closure, unwind info
2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Purpose:	Check if the unwind information is passed correctly.
3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Limitations:	none.
4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   PR:		none.
5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Originator:	Jeff Sturm <jsturm@one-point.com>  */
6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */
8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitestcxx.h"
9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid
11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectclosure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project		void** args __UNUSED__, void* userdata __UNUSED__)
13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  throw 9;
15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef void (*closure_test_type)();
18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp,
20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project		      void** args, void* userdata __UNUSED__)
21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project {
22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    *(ffi_arg*)resp =
23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)*(float *)args[0] +(int)(*(float *)args[1]) +
24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)(*(float *)args[2]) + (int)*(float *)args[3] +
25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) +
26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)*(float *)args[6] + (int)(*(int *)args[7]) +
27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)(*(double*)args[8]) + (int)*(int *)args[9] +
28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)*(int *)args[12] + (int)(*(int *)args[13]) +
30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      (int)(*(int *)args[14]) + *(int *)args[15] + (int)(long)userdata;
31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)*(float *)args[0], (int)(*(float *)args[1]),
34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)(*(float *)args[2]), (int)*(float *)args[3],
35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)(*(signed short *)args[4]), (int)(*(float *)args[5]),
36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)*(float *)args[6], (int)(*(int *)args[7]),
37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)(*(double *)args[8]), (int)*(int *)args[9],
38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)(*(int *)args[10]), (int)(*(float *)args[11]),
39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)*(int *)args[12], (int)(*(int *)args[13]),
40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)(*(int *)args[14]), *(int *)args[15],
41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	   (int)(long)userdata, (int)*(ffi_arg*)resp);
42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    throw (int)*(ffi_arg*)resp;
44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef int (*closure_test_type1)(float, float, float, float, signed short,
47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project				  float, float, int, double, int, int, float,
48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project				  int, int, int, int);
49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void)
51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_cif cif;
53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP
54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  static ffi_closure cl;
55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_closure *pcl;
57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_type * cl_arg_types[17];
58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP
59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  pcl = (ffi_closure *) allocate_mmap (sizeof(ffi_closure));
60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  pcl = &cl;
62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  {
65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    cl_arg_types[1] = NULL;
66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0,
68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project		       &ffi_type_void, cl_arg_types) == FFI_OK);
69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn, NULL) == FFI_OK);
70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    try
72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      {
73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	(*((closure_test_type)(pcl)))();
74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      } catch (int exception_code)
75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      {
76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	CHECK(exception_code == 9);
77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      }
78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    printf("part one OK\n");
80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    /* { dg-output "part one OK" } */
81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    }
82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    {
84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[0] = &ffi_type_float;
86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[1] = &ffi_type_float;
87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[2] = &ffi_type_float;
88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[3] = &ffi_type_float;
89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[4] = &ffi_type_sshort;
90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[5] = &ffi_type_float;
91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[6] = &ffi_type_float;
92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[7] = &ffi_type_uint;
93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[8] = &ffi_type_double;
94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[9] = &ffi_type_uint;
95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[10] = &ffi_type_uint;
96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[11] = &ffi_type_float;
97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[12] = &ffi_type_uint;
98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[13] = &ffi_type_uint;
99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[14] = &ffi_type_uint;
100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[15] = &ffi_type_uint;
101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      cl_arg_types[16] = NULL;
102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      /* Initialize the cif */
104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			 &ffi_type_sint, cl_arg_types) == FFI_OK);
106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn1,
108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project			     (void *) 3 /* userdata */)  == FFI_OK);
109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      try
110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	{
111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	  (*((closure_test_type1)pcl))
112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	    (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	     19, 21, 1);
114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	  /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	} catch (int exception_code)
116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	{
117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	  CHECK(exception_code == 255);
118a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project	}
119a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      printf("part two OK\n");
120a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project      /* { dg-output "\npart two OK" } */
121a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    }
122a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project    exit(0);
123a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
124