From: Anthony Green Date: Mon, 3 Apr 2023 12:18:23 +0000 (-0400) Subject: Add tests with homogeneous aggregate types X-Git-Tag: upstream/3.4.7~65 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2d63cee0e2154bb9027cff71f780cfaa2f543567;p=platform%2Fupstream%2Flibffi.git Add tests with homogeneous aggregate types --- diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index ec3e7e7..4f9cf21 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -39,6 +39,7 @@ libffi.call/strlen2.c libffi.call/strlen3.c libffi.call/strlen4.c \ libffi.call/strlen.c libffi.call/va_3.c \ libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \ libffi.call/struct_by_value_4.c libffi.closures/closure.exp \ +libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4f.c \ libffi.call/s55.c libffi.call/bpo-38748.c \ libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \ libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c \ diff --git a/testsuite/libffi.call/struct_by_value_3f.c b/testsuite/libffi.call/struct_by_value_3f.c new file mode 100644 index 0000000..8b5b1db --- /dev/null +++ b/testsuite/libffi.call/struct_by_value_3f.c @@ -0,0 +1,65 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + float f01; + float f02; + float f03; +} test_structure_1; + +static test_structure_1 ABI_ATTR struct1(test_structure_1 ts) +{ + ts.f03++; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts1_type; + ffi_type *ts1_type_elements[5]; + + test_structure_1 ts1_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_1 *ts1_result = + (test_structure_1 *) malloc (sizeof(test_structure_1)); + + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + ts1_type_elements[0] = &ffi_type_float; + ts1_type_elements[1] = &ffi_type_float; + ts1_type_elements[2] = &ffi_type_float; + ts1_type_elements[3] = NULL; + + args[0] = &ts1_type; + values[0] = &ts1_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ts1_type, args) == FFI_OK); + + ts1_arg.f03 = 555.5; + + ffi_call(&cif, FFI_FN(struct1), ts1_result, values); + + CHECK(fabs(ts1_result->f03 - 556.5) < FLT_EPSILON); + + /* This will fail if ffi_call isn't passing the struct by value. */ + CHECK(fabs(ts1_arg.f03 - 555.5) < FLT_EPSILON); + + free (ts1_result); + exit(0); +} diff --git a/testsuite/libffi.call/struct_by_value_4f.c b/testsuite/libffi.call/struct_by_value_4f.c new file mode 100644 index 0000000..bf6775a --- /dev/null +++ b/testsuite/libffi.call/struct_by_value_4f.c @@ -0,0 +1,67 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + float f01; + float f02; + float f03; + float f04; +} test_structure_1; + +static test_structure_1 ABI_ATTR struct1(test_structure_1 ts) +{ + ts.f04++; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts1_type; + ffi_type *ts1_type_elements[5]; + + test_structure_1 ts1_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_1 *ts1_result = + (test_structure_1 *) malloc (sizeof(test_structure_1)); + + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + ts1_type_elements[0] = &ffi_type_float; + ts1_type_elements[1] = &ffi_type_float; + ts1_type_elements[2] = &ffi_type_float; + ts1_type_elements[3] = &ffi_type_float; + ts1_type_elements[4] = NULL; + + args[0] = &ts1_type; + values[0] = &ts1_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ts1_type, args) == FFI_OK); + + ts1_arg.f04 = 555.5; + + ffi_call(&cif, FFI_FN(struct1), ts1_result, values); + + CHECK(fabs(ts1_result->f04 - 556.5) < FLT_EPSILON); + + /* This will fail if ffi_call isn't passing the struct by value. */ + CHECK(fabs(ts1_arg.f04 - 555.5) < FLT_EPSILON); + + free (ts1_result); + exit(0); +}