github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/cls_dbls_struct.c (about)

     1  /* Area:		ffi_call, closure_call
     2     Purpose:		Check double arguments in structs.
     3     Limitations:	none.
     4     PR:			none.
     5     Originator:	Blake Chaffin 6/23/2007	*/
     6  
     7  /* { dg-do run } */
     8  
     9  #include "ffitest.h"
    10  
    11  typedef struct Dbls {
    12  	double x;
    13  	double y;
    14  } Dbls;
    15  
    16  void
    17  closure_test_fn(Dbls p)
    18  {
    19  	printf("%.1f %.1f\n", p.x, p.y);
    20  }
    21  
    22  void
    23  closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
    24  		void** args, void* userdata __UNUSED__)
    25  {
    26  	closure_test_fn(*(Dbls*)args[0]);
    27  }
    28  
    29  int main(int argc __UNUSED__, char** argv __UNUSED__)
    30  {
    31  	ffi_cif cif;
    32  
    33          void *code;
    34  	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
    35  	ffi_type*		cl_arg_types[1];
    36  
    37  	ffi_type	ts1_type;
    38  	ffi_type*	ts1_type_elements[4];
    39  
    40  	Dbls arg = { 1.0, 2.0 };
    41  
    42  	ts1_type.size = 0;
    43  	ts1_type.alignment = 0;
    44  	ts1_type.type = FFI_TYPE_STRUCT;
    45  	ts1_type.elements = ts1_type_elements;
    46  
    47  	ts1_type_elements[0] = &ffi_type_double;
    48  	ts1_type_elements[1] = &ffi_type_double;
    49  	ts1_type_elements[2] = NULL;
    50  
    51  	cl_arg_types[0] = &ts1_type;
    52  
    53  	/* Initialize the cif */
    54  	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
    55  				 &ffi_type_void, cl_arg_types) == FFI_OK);
    56  
    57  	CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
    58  
    59  	((void*(*)(Dbls))(code))(arg);
    60  	/* { dg-output "1.0 2.0\n" } */
    61  
    62  	closure_test_fn(arg);
    63  	/* { dg-output "1.0 2.0\n" } */
    64  
    65  	return 0;
    66  }