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

     1  /* { dg-do run } */
     2  #include "ffitest.h"
     3  
     4  typedef struct
     5  {
     6    unsigned char uc;
     7    double d;
     8    unsigned int ui;
     9  } test_structure_1;
    10  
    11  static test_structure_1 struct1(test_structure_1 ts)
    12  {
    13    ts.uc++;
    14    ts.d--;
    15    ts.ui++;
    16  
    17    return ts;
    18  }
    19  
    20  int main (void)
    21  {
    22    ffi_cif cif;
    23    ffi_type *args[MAX_ARGS];
    24    void *values[MAX_ARGS];
    25    ffi_type ts1_type;
    26    ffi_type *ts1_type_elements[4];
    27  
    28    memset(&cif, 1, sizeof(cif));
    29    ts1_type.size = 0;
    30    ts1_type.alignment = 0;
    31    ts1_type.type = FFI_TYPE_STRUCT;
    32    ts1_type.elements = ts1_type_elements;
    33    ts1_type_elements[0] = &ffi_type_uchar;
    34    ts1_type_elements[1] = &ffi_type_double;
    35    ts1_type_elements[2] = &ffi_type_uint;
    36    ts1_type_elements[3] = NULL;
    37  
    38    test_structure_1 ts1_arg;
    39    /* This is a hack to get a properly aligned result buffer */
    40    test_structure_1 *ts1_result =
    41      (test_structure_1 *) malloc (sizeof(test_structure_1));
    42  
    43    args[0] = &ts1_type;
    44    values[0] = &ts1_arg;
    45  
    46    /* Initialize the cif */
    47    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
    48  		     &ts1_type, args) == FFI_OK);
    49  
    50    ts1_arg.uc = '\x01';
    51    ts1_arg.d = 3.14159;
    52    ts1_arg.ui = 555;
    53  
    54    ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
    55  
    56    CHECK(ts1_result->ui == 556);
    57    CHECK(ts1_result->d == 3.14159 - 1);
    58  
    59    free (ts1_result);
    60    exit(0);
    61  }