Home | History | Annotate | Download | only in libffi.call
      1 /* Area:	closure_call
      2    Purpose:	Check return value schar.
      3    Limitations:	none.
      4    PR:		none.
      5    Originator:	<andreast (at) gcc.gnu.org> 20031108	 */
      6 
      7 
      8 
      9 /* { dg-do run } */
     10 #include "ffitest.h"
     11 
     12 static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
     13 			     void* userdata __UNUSED__)
     14 {
     15   *(ffi_arg*)resp = *(signed char *)args[0];
     16   printf("%d: %d\n",*(signed char *)args[0],
     17 	 (int)*(ffi_arg *)(resp));
     18 }
     19 typedef signed char (*cls_ret_schar)(signed char);
     20 
     21 int main (void)
     22 {
     23   ffi_cif cif;
     24 #ifndef USING_MMAP
     25   static ffi_closure cl;
     26 #endif
     27   ffi_closure *pcl;
     28   ffi_type * cl_arg_types[2];
     29   signed char res;
     30 
     31 #ifdef USING_MMAP
     32   pcl = allocate_mmap (sizeof(ffi_closure));
     33 #else
     34   pcl = &cl;
     35 #endif
     36 
     37   cl_arg_types[0] = &ffi_type_schar;
     38   cl_arg_types[1] = NULL;
     39 
     40   /* Initialize the cif */
     41   CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
     42 		     &ffi_type_schar, cl_arg_types) == FFI_OK);
     43 
     44   CHECK(ffi_prep_closure(pcl, &cif, cls_ret_schar_fn, NULL)  == FFI_OK);
     45 
     46   res = (*((cls_ret_schar)pcl))(127);
     47   /* { dg-output "127: 127" } */
     48   printf("res: %d\n", res);
     49   /* { dg-output "\nres: 127" } */
     50 
     51   exit(0);
     52 }
     53