Test passing structs by value
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
diff --git a/testsuite/libffi.call/struct_by_value_big.c b/testsuite/libffi.call/struct_by_value_big.c
new file mode 100644
index 0000000..06422ca
--- /dev/null
+++ b/testsuite/libffi.call/struct_by_value_big.c
@@ -0,0 +1,93 @@
+/* Area: ffi_call
+ Purpose: Check structures.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+ unsigned int ui01;
+ unsigned int ui02;
+ unsigned int ui03;
+ unsigned int ui04;
+ unsigned int ui05;
+ unsigned int ui06;
+ unsigned int ui07;
+ unsigned int ui08;
+ unsigned int ui09;
+ unsigned int ui10;
+ unsigned int ui11;
+ unsigned int ui12;
+ unsigned int ui13;
+ unsigned int ui14;
+ unsigned int ui15;
+ unsigned int ui16;
+ unsigned int ui17;
+} test_structure_1;
+
+static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+{
+ ts.ui17++;
+
+ 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[18];
+
+ 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_uint;
+ ts1_type_elements[1] = &ffi_type_uint;
+ ts1_type_elements[2] = &ffi_type_uint;
+ ts1_type_elements[3] = &ffi_type_uint;
+ ts1_type_elements[4] = &ffi_type_uint;
+ ts1_type_elements[5] = &ffi_type_uint;
+ ts1_type_elements[6] = &ffi_type_uint;
+ ts1_type_elements[7] = &ffi_type_uint;
+ ts1_type_elements[8] = &ffi_type_uint;
+ ts1_type_elements[9] = &ffi_type_uint;
+ ts1_type_elements[10] = &ffi_type_uint;
+ ts1_type_elements[11] = &ffi_type_uint;
+ ts1_type_elements[12] = &ffi_type_uint;
+ ts1_type_elements[13] = &ffi_type_uint;
+ ts1_type_elements[14] = &ffi_type_uint;
+ ts1_type_elements[15] = &ffi_type_uint;
+ ts1_type_elements[16] = &ffi_type_uint;
+ ts1_type_elements[17] = 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.ui17 = 555;
+
+ ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+
+ CHECK(ts1_result->ui17 == 556);
+
+ /* This will fail if ffi_call isn't passing the struct by value. */
+ CHECK(ts1_arg.ui17 == 555);
+
+ free (ts1_result);
+ exit(0);
+}
diff --git a/testsuite/libffi.call/struct_by_value_small.c b/testsuite/libffi.call/struct_by_value_small.c
new file mode 100644
index 0000000..19613f8
--- /dev/null
+++ b/testsuite/libffi.call/struct_by_value_small.c
@@ -0,0 +1,61 @@
+/* Area: ffi_call
+ Purpose: Check structures.
+ Limitations: none.
+ PR: none.
+ Originator: From the original ffitest.c */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+ unsigned int ui17;
+} test_structure_1;
+
+static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+{
+ ts.ui17++;
+
+ 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[2];
+
+ 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_uint;
+ ts1_type_elements[1] = 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.ui17 = 555;
+
+ ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+
+ CHECK(ts1_result->ui17 == 556);
+
+ /* This will fail if ffi_call isn't passing the struct by value. */
+ CHECK(ts1_arg.ui17 == 555);
+
+ free (ts1_result);
+ exit(0);
+}