1*1fd5a2e1SPrashanth Swaminathan /* Area: ffi_call 2*1fd5a2e1SPrashanth Swaminathan Purpose: Check return value double. 3*1fd5a2e1SPrashanth Swaminathan Limitations: none. 4*1fd5a2e1SPrashanth Swaminathan PR: none. 5*1fd5a2e1SPrashanth Swaminathan Originator: From the original ffitest.c */ 6*1fd5a2e1SPrashanth Swaminathan 7*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */ 8*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h" 9*1fd5a2e1SPrashanth Swaminathan #include "float.h" 10*1fd5a2e1SPrashanth Swaminathan 11*1fd5a2e1SPrashanth Swaminathan #include <math.h> 12*1fd5a2e1SPrashanth Swaminathan 13*1fd5a2e1SPrashanth Swaminathan typedef union 14*1fd5a2e1SPrashanth Swaminathan { 15*1fd5a2e1SPrashanth Swaminathan double d; 16*1fd5a2e1SPrashanth Swaminathan unsigned char c[sizeof (double)]; 17*1fd5a2e1SPrashanth Swaminathan } value_type; 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan #define CANARY 0xba 20*1fd5a2e1SPrashanth Swaminathan dblit(float f)21*1fd5a2e1SPrashanth Swaminathanstatic double dblit(float f) 22*1fd5a2e1SPrashanth Swaminathan { 23*1fd5a2e1SPrashanth Swaminathan return f/3.0; 24*1fd5a2e1SPrashanth Swaminathan } 25*1fd5a2e1SPrashanth Swaminathan main(void)26*1fd5a2e1SPrashanth Swaminathanint main (void) 27*1fd5a2e1SPrashanth Swaminathan { 28*1fd5a2e1SPrashanth Swaminathan ffi_cif cif; 29*1fd5a2e1SPrashanth Swaminathan ffi_type *args[MAX_ARGS]; 30*1fd5a2e1SPrashanth Swaminathan void *values[MAX_ARGS]; 31*1fd5a2e1SPrashanth Swaminathan float f; 32*1fd5a2e1SPrashanth Swaminathan value_type result[2]; 33*1fd5a2e1SPrashanth Swaminathan unsigned int i; 34*1fd5a2e1SPrashanth Swaminathan 35*1fd5a2e1SPrashanth Swaminathan args[0] = &ffi_type_float; 36*1fd5a2e1SPrashanth Swaminathan values[0] = &f; 37*1fd5a2e1SPrashanth Swaminathan 38*1fd5a2e1SPrashanth Swaminathan /* Initialize the cif */ 39*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 40*1fd5a2e1SPrashanth Swaminathan &ffi_type_double, args) == FFI_OK); 41*1fd5a2e1SPrashanth Swaminathan 42*1fd5a2e1SPrashanth Swaminathan f = 3.14159; 43*1fd5a2e1SPrashanth Swaminathan 44*1fd5a2e1SPrashanth Swaminathan /* Put a canary in the return array. This is a regression test for 45*1fd5a2e1SPrashanth Swaminathan a buffer overrun. */ 46*1fd5a2e1SPrashanth Swaminathan memset(result[1].c, CANARY, sizeof (double)); 47*1fd5a2e1SPrashanth Swaminathan 48*1fd5a2e1SPrashanth Swaminathan ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan /* These are not always the same!! Check for a reasonable delta */ 51*1fd5a2e1SPrashanth Swaminathan 52*1fd5a2e1SPrashanth Swaminathan CHECK(fabs(result[0].d - dblit(f)) < DBL_EPSILON); 53*1fd5a2e1SPrashanth Swaminathan 54*1fd5a2e1SPrashanth Swaminathan /* Check the canary. */ 55*1fd5a2e1SPrashanth Swaminathan for (i = 0; i < sizeof (double); ++i) 56*1fd5a2e1SPrashanth Swaminathan CHECK(result[1].c[i] == CANARY); 57*1fd5a2e1SPrashanth Swaminathan 58*1fd5a2e1SPrashanth Swaminathan exit(0); 59*1fd5a2e1SPrashanth Swaminathan 60*1fd5a2e1SPrashanth Swaminathan } 61