]>
Commit | Line | Data |
---|---|---|
8a6b509e AT |
1 | /* Area: closure_call |
2 | Purpose: Check return value double. | |
3 | Limitations: none. | |
4 | PR: none. | |
5 | Originator: <andreast@gcc.gnu.org> 20030828 */ | |
6 | ||
4c5f37d5 | 7 | /* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */ |
8a6b509e AT |
8 | #include "ffitest.h" |
9 | ||
9fdeb13b AT |
10 | static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, |
11 | void* userdata __UNUSED__) | |
8a6b509e AT |
12 | { |
13 | *(double *)resp = *(double *)args[0]; | |
9e3bfa9b AT |
14 | |
15 | printf("%f: %f\n",*(double *)args[0], | |
8a6b509e AT |
16 | *(double *)resp); |
17 | } | |
18 | typedef double (*cls_ret_double)(double); | |
19 | ||
20 | int main (void) | |
21 | { | |
22 | ffi_cif cif; | |
5196736e | 23 | #ifndef USING_MMAP |
8a6b509e | 24 | static ffi_closure cl; |
5196736e AJ |
25 | #endif |
26 | ffi_closure *pcl; | |
8a6b509e | 27 | ffi_type * cl_arg_types[2]; |
f145ed6b | 28 | double res; |
9e3bfa9b | 29 | |
5196736e AJ |
30 | #ifdef USING_MMAP |
31 | pcl = allocate_mmap (sizeof(ffi_closure)); | |
32 | #else | |
33 | pcl = &cl; | |
34 | #endif | |
35 | ||
8a6b509e AT |
36 | cl_arg_types[0] = &ffi_type_double; |
37 | cl_arg_types[1] = NULL; | |
9e3bfa9b | 38 | |
8a6b509e AT |
39 | /* Initialize the cif */ |
40 | CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, | |
41 | &ffi_type_double, cl_arg_types) == FFI_OK); | |
9e3bfa9b | 42 | |
8a6b509e | 43 | CHECK(ffi_prep_closure(pcl, &cif, cls_ret_double_fn, NULL) == FFI_OK); |
9e3bfa9b | 44 | |
f145ed6b | 45 | res = (*((cls_ret_double)pcl))(21474.789); |
8a6b509e | 46 | /* { dg-output "21474.789000: 21474.789000" } */ |
647af4a9 AT |
47 | printf("res: %.6f\n", res); |
48 | /* { dg-output "\nres: 21474.789000" } */ | |
49 | ||
9e3bfa9b | 50 | exit(0); |
8a6b509e | 51 | } |