xref: /aosp_15_r20/external/libffi/testsuite/libffi.call/cls_complex_struct.inc (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -*-c-*- */
2*1fd5a2e1SPrashanth Swaminathan#include "ffitest.h"
3*1fd5a2e1SPrashanth Swaminathan#include <complex.h>
4*1fd5a2e1SPrashanth Swaminathan
5*1fd5a2e1SPrashanth Swaminathantypedef struct Cs {
6*1fd5a2e1SPrashanth Swaminathan  _Complex T_C_TYPE x;
7*1fd5a2e1SPrashanth Swaminathan  _Complex T_C_TYPE y;
8*1fd5a2e1SPrashanth Swaminathan} Cs;
9*1fd5a2e1SPrashanth Swaminathan
10*1fd5a2e1SPrashanth SwaminathanCs gc;
11*1fd5a2e1SPrashanth Swaminathan
12*1fd5a2e1SPrashanth Swaminathanvoid
13*1fd5a2e1SPrashanth Swaminathanclosure_test_fn(Cs p)
14*1fd5a2e1SPrashanth Swaminathan{
15*1fd5a2e1SPrashanth Swaminathan  printf("%.1f,%.1fi %.1f,%.1fi\n",
16*1fd5a2e1SPrashanth Swaminathan	 T_CONV creal (p.x), T_CONV cimag (p.x),
17*1fd5a2e1SPrashanth Swaminathan	 T_CONV creal (p.y), T_CONV cimag (p.y));
18*1fd5a2e1SPrashanth Swaminathan  gc = p;
19*1fd5a2e1SPrashanth Swaminathan}
20*1fd5a2e1SPrashanth Swaminathan
21*1fd5a2e1SPrashanth Swaminathanvoid
22*1fd5a2e1SPrashanth Swaminathanclosure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
23*1fd5a2e1SPrashanth Swaminathan		void** args, void* userdata __UNUSED__)
24*1fd5a2e1SPrashanth Swaminathan{
25*1fd5a2e1SPrashanth Swaminathan  closure_test_fn(*(Cs*)args[0]);
26*1fd5a2e1SPrashanth Swaminathan}
27*1fd5a2e1SPrashanth Swaminathan
28*1fd5a2e1SPrashanth Swaminathanint main(int argc __UNUSED__, char** argv __UNUSED__)
29*1fd5a2e1SPrashanth Swaminathan{
30*1fd5a2e1SPrashanth Swaminathan  ffi_cif cif;
31*1fd5a2e1SPrashanth Swaminathan
32*1fd5a2e1SPrashanth Swaminathan  void *code;
33*1fd5a2e1SPrashanth Swaminathan  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
34*1fd5a2e1SPrashanth Swaminathan  ffi_type *cl_arg_types[1];
35*1fd5a2e1SPrashanth Swaminathan
36*1fd5a2e1SPrashanth Swaminathan  ffi_type ts1_type;
37*1fd5a2e1SPrashanth Swaminathan  ffi_type* ts1_type_elements[4];
38*1fd5a2e1SPrashanth Swaminathan
39*1fd5a2e1SPrashanth Swaminathan  Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I};
40*1fd5a2e1SPrashanth Swaminathan
41*1fd5a2e1SPrashanth Swaminathan  ts1_type.size = 0;
42*1fd5a2e1SPrashanth Swaminathan  ts1_type.alignment = 0;
43*1fd5a2e1SPrashanth Swaminathan  ts1_type.type = FFI_TYPE_STRUCT;
44*1fd5a2e1SPrashanth Swaminathan  ts1_type.elements = ts1_type_elements;
45*1fd5a2e1SPrashanth Swaminathan
46*1fd5a2e1SPrashanth Swaminathan  ts1_type_elements[0] = &T_FFI_TYPE;
47*1fd5a2e1SPrashanth Swaminathan  ts1_type_elements[1] = &T_FFI_TYPE;
48*1fd5a2e1SPrashanth Swaminathan  ts1_type_elements[2] = NULL;
49*1fd5a2e1SPrashanth Swaminathan
50*1fd5a2e1SPrashanth Swaminathan  cl_arg_types[0] = &ts1_type;
51*1fd5a2e1SPrashanth Swaminathan
52*1fd5a2e1SPrashanth Swaminathan  /* Initialize the cif */
53*1fd5a2e1SPrashanth Swaminathan  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
54*1fd5a2e1SPrashanth Swaminathan		     &ffi_type_void, cl_arg_types) == FFI_OK);
55*1fd5a2e1SPrashanth Swaminathan
56*1fd5a2e1SPrashanth Swaminathan  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
57*1fd5a2e1SPrashanth Swaminathan
58*1fd5a2e1SPrashanth Swaminathan  gc.x = 0.0 + 0.0 * I;
59*1fd5a2e1SPrashanth Swaminathan  gc.y = 0.0 + 0.0 * I;
60*1fd5a2e1SPrashanth Swaminathan  ((void*(*)(Cs))(code))(arg);
61*1fd5a2e1SPrashanth Swaminathan  /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */
62*1fd5a2e1SPrashanth Swaminathan  CHECK (gc.x == arg.x && gc.y == arg.y);
63*1fd5a2e1SPrashanth Swaminathan
64*1fd5a2e1SPrashanth Swaminathan  gc.x = 0.0 + 0.0 * I;
65*1fd5a2e1SPrashanth Swaminathan  gc.y = 0.0 + 0.0 * I;
66*1fd5a2e1SPrashanth Swaminathan  closure_test_fn(arg);
67*1fd5a2e1SPrashanth Swaminathan  /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */
68*1fd5a2e1SPrashanth Swaminathan  CHECK (gc.x == arg.x && gc.y == arg.y);
69*1fd5a2e1SPrashanth Swaminathan
70*1fd5a2e1SPrashanth Swaminathan  return 0;
71*1fd5a2e1SPrashanth Swaminathan}
72