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

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