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

     1  /* Area:	ffi_call
     2     Purpose:	Check structures.
     3     Limitations:	none.
     4     PR:		none.
     5     Originator:	From the original ffitest.c  */
     6  
     7  /* { dg-do run } */
     8  #include "ffitest.h"
     9  
    10  typedef struct
    11  {
    12    int si;
    13  } test_structure_3;
    14  
    15  static test_structure_3 ABI_ATTR struct3(test_structure_3 ts)
    16  {
    17    ts.si = -(ts.si*2);
    18  
    19    return ts;
    20  }
    21  
    22  int main (void)
    23  {
    24    ffi_cif cif;
    25    ffi_type *args[MAX_ARGS];
    26    void *values[MAX_ARGS];
    27    int compare_value;
    28    ffi_type ts3_type;
    29    ffi_type *ts3_type_elements[2];
    30  
    31    test_structure_3 ts3_arg;
    32    test_structure_3 *ts3_result =
    33      (test_structure_3 *) malloc (sizeof(test_structure_3));
    34  
    35    ts3_type.size = 0;
    36    ts3_type.alignment = 0;
    37    ts3_type.type = FFI_TYPE_STRUCT;
    38    ts3_type.elements = ts3_type_elements;
    39    ts3_type_elements[0] = &ffi_type_sint;
    40    ts3_type_elements[1] = NULL;
    41  
    42    args[0] = &ts3_type;
    43    values[0] = &ts3_arg;
    44    
    45    /* Initialize the cif */
    46    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
    47  		     &ts3_type, args) == FFI_OK);
    48    
    49    ts3_arg.si = -123;
    50    compare_value = ts3_arg.si;
    51    
    52    ffi_call(&cif, FFI_FN(struct3), ts3_result, values);
    53    
    54    printf ("%d %d\n", ts3_result->si, -(compare_value*2));
    55    
    56    CHECK(ts3_result->si == -(compare_value*2));
    57   
    58    free (ts3_result);
    59    exit(0);
    60  }