From 8a6b509ea857a07be12738d10403d3ab0f647ffe Mon Sep 17 00:00:00 2001
From: Andreas Tobler <andreast@gcc.gnu.org>
Date: Thu, 4 Sep 2003 16:49:22 +0200
Subject: *** empty log message ***

From-SVN: r71069
---
 libffi/testsuite/libffi.call/problem1.c | 93 +++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)
 create mode 100644 libffi/testsuite/libffi.call/problem1.c

(limited to 'libffi/testsuite/libffi.call/problem1.c')

diff --git a/libffi/testsuite/libffi.call/problem1.c b/libffi/testsuite/libffi.call/problem1.c
new file mode 100644
index 0000000..6088be5
--- /dev/null
+++ b/libffi/testsuite/libffi.call/problem1.c
@@ -0,0 +1,93 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct my_ffi_struct {
+  double a;
+  double b;
+  double c;
+} my_ffi_struct;
+
+my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2)
+{
+  struct my_ffi_struct result;
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  
+
+  printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c, 
+	 a2.a, a2.b, a2.c, result.a, result.b, result.c);
+  
+  return result;
+}
+
+void stub(ffi_cif* cif, void* resp, void** args, void* userdata)
+{   
+    struct my_ffi_struct a1;
+    struct my_ffi_struct a2;
+    
+    a1 = *(struct my_ffi_struct*)(args[0]);
+    a2 = *(struct my_ffi_struct*)(args[1]);
+
+    *(my_ffi_struct *)resp = callee(a1, a2);
+}
+
+
+int main(void)
+{
+    ffi_type* my_ffi_struct_fields[4];
+    ffi_type my_ffi_struct_type;
+    ffi_cif cif;
+    static ffi_closure cl;
+    ffi_closure *pcl = &cl;
+    void* args[4];
+    ffi_type* arg_types[3];
+    
+    struct my_ffi_struct g = { 1.0, 2.0, 3.0 };
+    struct my_ffi_struct f = { 1.0, 2.0, 3.0 };
+    struct my_ffi_struct res;
+
+    my_ffi_struct_type.size = 0;
+    my_ffi_struct_type.alignment = 0;
+    my_ffi_struct_type.type = FFI_TYPE_STRUCT;
+    my_ffi_struct_type.elements = my_ffi_struct_fields;
+
+    my_ffi_struct_fields[0] = &ffi_type_double;
+    my_ffi_struct_fields[1] = &ffi_type_double;
+    my_ffi_struct_fields[2] = &ffi_type_double;
+    my_ffi_struct_fields[3] = NULL;
+
+    arg_types[0] = &my_ffi_struct_type;
+    arg_types[1] = &my_ffi_struct_type;
+    arg_types[2] = NULL;
+
+    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type, 
+		       arg_types) == FFI_OK);
+
+    args[0] = &g;
+    args[1] = &f;
+    args[2] = NULL;
+    ffi_call(&cif, FFI_FN(callee), &res, args);
+    /* { dg-output "1 2 3 1 2 3: 2 4 6" } */
+
+    CHECK(res.a == 2.0);
+    CHECK(res.b == 4.0);
+    CHECK(res.c == 6.0);
+    
+    CHECK(ffi_prep_closure(pcl, &cif, stub, NULL) == FFI_OK);
+ 
+    res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(pcl))(g, f);
+    /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */
+    
+    CHECK(res.a == 2.0);
+    CHECK(res.b == 4.0);
+    CHECK(res.c == 6.0);
+
+    exit(0);;
+} 
-- 
cgit v1.1