ffi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +51 -0
- data/README +0 -0
- data/Rakefile +90 -0
- data/ext/AbstractMemory.c +254 -0
- data/ext/AbstractMemory.h +36 -0
- data/ext/Buffer.c +94 -0
- data/ext/Callback.c +240 -0
- data/ext/Callback.h +47 -0
- data/ext/Invoker.c +269 -0
- data/ext/MemoryPointer.c +164 -0
- data/ext/MemoryPointer.h +25 -0
- data/ext/Platform.c +41 -0
- data/ext/Platform.h +23 -0
- data/ext/Types.c +65 -0
- data/ext/Types.h +51 -0
- data/ext/extconf.rb +13 -0
- data/ext/ffi.c +54 -0
- data/ext/ffi.mk +24 -0
- data/ext/libffi.darwin.mk +44 -0
- data/ext/libffi.mk +10 -0
- data/ext/libffi/ChangeLog +3243 -0
- data/ext/libffi/ChangeLog.libffi +347 -0
- data/ext/libffi/ChangeLog.libgcj +40 -0
- data/ext/libffi/ChangeLog.v1 +764 -0
- data/ext/libffi/LICENSE +21 -0
- data/ext/libffi/Makefile.am +177 -0
- data/ext/libffi/Makefile.in +1640 -0
- data/ext/libffi/README +328 -0
- data/ext/libffi/TODO +1 -0
- data/ext/libffi/acinclude.m4 +92 -0
- data/ext/libffi/aclocal.m4 +7516 -0
- data/ext/libffi/compile +142 -0
- data/ext/libffi/config.guess +1516 -0
- data/ext/libffi/config.sub +1626 -0
- data/ext/libffi/configure +24414 -0
- data/ext/libffi/configure.ac +365 -0
- data/ext/libffi/configure.host +11 -0
- data/ext/libffi/depcomp +584 -0
- data/ext/libffi/doc/libffi.info +533 -0
- data/ext/libffi/doc/libffi.texi +541 -0
- data/ext/libffi/doc/stamp-vti +4 -0
- data/ext/libffi/doc/version.texi +4 -0
- data/ext/libffi/fficonfig.h.in +160 -0
- data/ext/libffi/include/Makefile.am +9 -0
- data/ext/libffi/include/Makefile.in +422 -0
- data/ext/libffi/include/ffi.h.in +393 -0
- data/ext/libffi/include/ffi_common.h +98 -0
- data/ext/libffi/install-sh +323 -0
- data/ext/libffi/libffi.pc.in +10 -0
- data/ext/libffi/libtool-version +29 -0
- data/ext/libffi/ltcf-c.sh +861 -0
- data/ext/libffi/ltcf-cxx.sh +1069 -0
- data/ext/libffi/ltcf-gcj.sh +700 -0
- data/ext/libffi/ltconfig +2862 -0
- data/ext/libffi/ltmain.sh +6930 -0
- data/ext/libffi/man/Makefile.am +8 -0
- data/ext/libffi/man/Makefile.in +395 -0
- data/ext/libffi/man/ffi.3 +31 -0
- data/ext/libffi/man/ffi_call.3 +103 -0
- data/ext/libffi/man/ffi_prep_cif.3 +66 -0
- data/ext/libffi/mdate-sh +201 -0
- data/ext/libffi/missing +353 -0
- data/ext/libffi/mkinstalldirs +158 -0
- data/ext/libffi/src/alpha/ffi.c +284 -0
- data/ext/libffi/src/alpha/ffitarget.h +48 -0
- data/ext/libffi/src/alpha/osf.S +366 -0
- data/ext/libffi/src/arm/ffi.c +309 -0
- data/ext/libffi/src/arm/ffitarget.h +49 -0
- data/ext/libffi/src/arm/sysv.S +299 -0
- data/ext/libffi/src/closures.c +596 -0
- data/ext/libffi/src/cris/ffi.c +383 -0
- data/ext/libffi/src/cris/ffitarget.h +51 -0
- data/ext/libffi/src/cris/sysv.S +215 -0
- data/ext/libffi/src/debug.c +59 -0
- data/ext/libffi/src/dlmalloc.c +5099 -0
- data/ext/libffi/src/frv/eabi.S +128 -0
- data/ext/libffi/src/frv/ffi.c +292 -0
- data/ext/libffi/src/frv/ffitarget.h +61 -0
- data/ext/libffi/src/ia64/ffi.c +580 -0
- data/ext/libffi/src/ia64/ffitarget.h +50 -0
- data/ext/libffi/src/ia64/ia64_flags.h +40 -0
- data/ext/libffi/src/ia64/unix.S +560 -0
- data/ext/libffi/src/java_raw_api.c +359 -0
- data/ext/libffi/src/m32r/ffi.c +232 -0
- data/ext/libffi/src/m32r/ffitarget.h +48 -0
- data/ext/libffi/src/m32r/sysv.S +121 -0
- data/ext/libffi/src/m68k/ffi.c +278 -0
- data/ext/libffi/src/m68k/ffitarget.h +49 -0
- data/ext/libffi/src/m68k/sysv.S +234 -0
- data/ext/libffi/src/mips/ffi.c +926 -0
- data/ext/libffi/src/mips/ffitarget.h +202 -0
- data/ext/libffi/src/mips/n32.S +534 -0
- data/ext/libffi/src/mips/o32.S +381 -0
- data/ext/libffi/src/pa/ffi.c +709 -0
- data/ext/libffi/src/pa/ffitarget.h +77 -0
- data/ext/libffi/src/pa/hpux32.S +368 -0
- data/ext/libffi/src/pa/linux.S +357 -0
- data/ext/libffi/src/powerpc/aix.S +225 -0
- data/ext/libffi/src/powerpc/aix_closure.S +247 -0
- data/ext/libffi/src/powerpc/asm.h +125 -0
- data/ext/libffi/src/powerpc/darwin.S +245 -0
- data/ext/libffi/src/powerpc/darwin_closure.S +317 -0
- data/ext/libffi/src/powerpc/ffi.c +1429 -0
- data/ext/libffi/src/powerpc/ffi_darwin.c +800 -0
- data/ext/libffi/src/powerpc/ffitarget.h +118 -0
- data/ext/libffi/src/powerpc/linux64.S +187 -0
- data/ext/libffi/src/powerpc/linux64_closure.S +236 -0
- data/ext/libffi/src/powerpc/ppc_closure.S +327 -0
- data/ext/libffi/src/powerpc/sysv.S +230 -0
- data/ext/libffi/src/prep_cif.c +174 -0
- data/ext/libffi/src/raw_api.c +254 -0
- data/ext/libffi/src/s390/ffi.c +780 -0
- data/ext/libffi/src/s390/ffitarget.h +60 -0
- data/ext/libffi/src/s390/sysv.S +434 -0
- data/ext/libffi/src/sh/ffi.c +716 -0
- data/ext/libffi/src/sh/ffitarget.h +49 -0
- data/ext/libffi/src/sh/sysv.S +850 -0
- data/ext/libffi/src/sh64/ffi.c +453 -0
- data/ext/libffi/src/sh64/ffitarget.h +53 -0
- data/ext/libffi/src/sh64/sysv.S +530 -0
- data/ext/libffi/src/sparc/ffi.c +610 -0
- data/ext/libffi/src/sparc/ffitarget.h +66 -0
- data/ext/libffi/src/sparc/v8.S +272 -0
- data/ext/libffi/src/sparc/v9.S +307 -0
- data/ext/libffi/src/types.c +77 -0
- data/ext/libffi/src/x86/darwin.S +443 -0
- data/ext/libffi/src/x86/darwin64.S +416 -0
- data/ext/libffi/src/x86/ffi.c +475 -0
- data/ext/libffi/src/x86/ffi64.c +572 -0
- data/ext/libffi/src/x86/ffitarget.h +90 -0
- data/ext/libffi/src/x86/freebsd.S +458 -0
- data/ext/libffi/src/x86/sysv.S +437 -0
- data/ext/libffi/src/x86/unix64.S +418 -0
- data/ext/libffi/src/x86/win32.S +391 -0
- data/ext/libffi/testsuite/Makefile.am +71 -0
- data/ext/libffi/testsuite/Makefile.in +447 -0
- data/ext/libffi/testsuite/config/default.exp +1 -0
- data/ext/libffi/testsuite/lib/libffi-dg.exp +289 -0
- data/ext/libffi/testsuite/lib/target-libpath.exp +263 -0
- data/ext/libffi/testsuite/lib/wrapper.exp +45 -0
- data/ext/libffi/testsuite/libffi.call/call.exp +36 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
- data/ext/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
- data/ext/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
- data/ext/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
- data/ext/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
- data/ext/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
- data/ext/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
- data/ext/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
- data/ext/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
- data/ext/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
- data/ext/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
- data/ext/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
- data/ext/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
- data/ext/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
- data/ext/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
- data/ext/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
- data/ext/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
- data/ext/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
- data/ext/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
- data/ext/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
- data/ext/libffi/testsuite/libffi.call/cls_double.c +51 -0
- data/ext/libffi/testsuite/libffi.call/cls_float.c +51 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
- data/ext/libffi/testsuite/libffi.call/cls_schar.c +52 -0
- data/ext/libffi/testsuite/libffi.call/cls_sint.c +50 -0
- data/ext/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
- data/ext/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
- data/ext/libffi/testsuite/libffi.call/cls_uint.c +51 -0
- data/ext/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
- data/ext/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
- data/ext/libffi/testsuite/libffi.call/ffitest.h +86 -0
- data/ext/libffi/testsuite/libffi.call/float.c +59 -0
- data/ext/libffi/testsuite/libffi.call/float1.c +58 -0
- data/ext/libffi/testsuite/libffi.call/float2.c +57 -0
- data/ext/libffi/testsuite/libffi.call/float3.c +72 -0
- data/ext/libffi/testsuite/libffi.call/float4.c +62 -0
- data/ext/libffi/testsuite/libffi.call/many.c +69 -0
- data/ext/libffi/testsuite/libffi.call/many_win32.c +63 -0
- data/ext/libffi/testsuite/libffi.call/negint.c +53 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct.c +160 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
- data/ext/libffi/testsuite/libffi.call/problem1.c +98 -0
- data/ext/libffi/testsuite/libffi.call/promotion.c +59 -0
- data/ext/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
- data/ext/libffi/testsuite/libffi.call/return_dbl.c +35 -0
- data/ext/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
- data/ext/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
- data/ext/libffi/testsuite/libffi.call/return_fl.c +35 -0
- data/ext/libffi/testsuite/libffi.call/return_fl1.c +36 -0
- data/ext/libffi/testsuite/libffi.call/return_fl2.c +49 -0
- data/ext/libffi/testsuite/libffi.call/return_fl3.c +42 -0
- data/ext/libffi/testsuite/libffi.call/return_ldl.c +34 -0
- data/ext/libffi/testsuite/libffi.call/return_ll.c +41 -0
- data/ext/libffi/testsuite/libffi.call/return_ll1.c +42 -0
- data/ext/libffi/testsuite/libffi.call/return_sc.c +36 -0
- data/ext/libffi/testsuite/libffi.call/return_sl.c +38 -0
- data/ext/libffi/testsuite/libffi.call/return_uc.c +38 -0
- data/ext/libffi/testsuite/libffi.call/return_ul.c +38 -0
- data/ext/libffi/testsuite/libffi.call/strlen.c +44 -0
- data/ext/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
- data/ext/libffi/testsuite/libffi.call/struct1.c +65 -0
- data/ext/libffi/testsuite/libffi.call/struct2.c +67 -0
- data/ext/libffi/testsuite/libffi.call/struct3.c +59 -0
- data/ext/libffi/testsuite/libffi.call/struct4.c +63 -0
- data/ext/libffi/testsuite/libffi.call/struct5.c +65 -0
- data/ext/libffi/testsuite/libffi.call/struct6.c +64 -0
- data/ext/libffi/testsuite/libffi.call/struct7.c +74 -0
- data/ext/libffi/testsuite/libffi.call/struct8.c +80 -0
- data/ext/libffi/testsuite/libffi.call/struct9.c +67 -0
- data/ext/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
- data/ext/libffi/testsuite/libffi.special/special.exp +38 -0
- data/ext/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
- data/ext/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
- data/ext/libffi/texinfo.tex +7482 -0
- data/ext/rbffi.h +32 -0
- data/lib/ffi.rb +2 -0
- data/lib/ffi/buffer.rb +25 -0
- data/lib/ffi/callback.rb +10 -0
- data/lib/ffi/ffi.rb +259 -0
- data/lib/ffi/memorypointer.rb +169 -0
- data/lib/ffi/platform.rb +75 -0
- data/lib/ffi/struct.rb +263 -0
- data/nbproject/Makefile-Default.mk +54 -0
- data/nbproject/Makefile-impl.mk +123 -0
- data/nbproject/configurations.xml +169 -0
- data/nbproject/private/configurations.xml +22 -0
- data/nbproject/private/private.xml +7 -0
- data/nbproject/project.properties +0 -0
- data/nbproject/project.xml +11 -0
- data/samples/getlogin.rb +7 -0
- data/samples/getpid.rb +7 -0
- data/samples/gettimeofday.rb +13 -0
- data/samples/hello.rb +7 -0
- data/samples/qsort.rb +20 -0
- data/specs/buffer_spec.rb +141 -0
- data/specs/callback_spec.rb +31 -0
- data/specs/rbx/attach_function_spec.rb +26 -0
- data/specs/rbx/memory_pointer_spec.rb +108 -0
- data/specs/rbx/spec_helper.rb +1 -0
- data/specs/rbx/struct_spec.rb +13 -0
- data/specs/spec_helper.rb +2 -0
- metadata +359 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* Area: closure_call (stdcall convention)
|
|
2
|
+
Purpose: Check handling when caller expects stdcall callee
|
|
3
|
+
Limitations: none.
|
|
4
|
+
PR: none.
|
|
5
|
+
Originator: <twalljava@dev.java.net> */
|
|
6
|
+
|
|
7
|
+
/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
|
|
8
|
+
#include "ffitest.h"
|
|
9
|
+
|
|
10
|
+
static void
|
|
11
|
+
closure_test_stdcall(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
|
12
|
+
void* userdata)
|
|
13
|
+
{
|
|
14
|
+
*(ffi_arg*)resp =
|
|
15
|
+
(int)*(int *)args[0] + (int)(*(int *)args[1])
|
|
16
|
+
+ (int)(*(int *)args[2]) + (int)(*(int *)args[3])
|
|
17
|
+
+ (int)(long)userdata;
|
|
18
|
+
|
|
19
|
+
printf("%d %d %d %d: %d\n",
|
|
20
|
+
(int)*(int *)args[0], (int)(*(int *)args[1]),
|
|
21
|
+
(int)(*(int *)args[2]), (int)(*(int *)args[3]),
|
|
22
|
+
(int)*(ffi_arg *)resp);
|
|
23
|
+
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
typedef int (__stdcall *closure_test_type0)(int, int, int, int);
|
|
27
|
+
|
|
28
|
+
int main (void)
|
|
29
|
+
{
|
|
30
|
+
ffi_cif cif;
|
|
31
|
+
#ifndef USING_MMAP
|
|
32
|
+
static ffi_closure cl;
|
|
33
|
+
#endif
|
|
34
|
+
ffi_closure *pcl;
|
|
35
|
+
ffi_type * cl_arg_types[17];
|
|
36
|
+
int res;
|
|
37
|
+
void* sp_pre;
|
|
38
|
+
void* sp_post;
|
|
39
|
+
char buf[1024];
|
|
40
|
+
|
|
41
|
+
#ifdef USING_MMAP
|
|
42
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
|
43
|
+
#else
|
|
44
|
+
pcl = &cl;
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
cl_arg_types[0] = &ffi_type_uint;
|
|
48
|
+
cl_arg_types[1] = &ffi_type_uint;
|
|
49
|
+
cl_arg_types[2] = &ffi_type_uint;
|
|
50
|
+
cl_arg_types[3] = &ffi_type_uint;
|
|
51
|
+
cl_arg_types[4] = NULL;
|
|
52
|
+
|
|
53
|
+
/* Initialize the cif */
|
|
54
|
+
CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 4,
|
|
55
|
+
&ffi_type_sint, cl_arg_types) == FFI_OK);
|
|
56
|
+
|
|
57
|
+
CHECK(ffi_prep_closure(pcl, &cif, closure_test_stdcall,
|
|
58
|
+
(void *) 3 /* userdata */) == FFI_OK);
|
|
59
|
+
|
|
60
|
+
asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
|
|
61
|
+
res = (*(closure_test_type0)pcl)(0, 1, 2, 3);
|
|
62
|
+
asm volatile (" movl %%esp,%0" : "=g" (sp_post));
|
|
63
|
+
/* { dg-output "0 1 2 3: 9" } */
|
|
64
|
+
|
|
65
|
+
printf("res: %d\n",res);
|
|
66
|
+
/* { dg-output "\nres: 9" } */
|
|
67
|
+
|
|
68
|
+
sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post);
|
|
69
|
+
printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf));
|
|
70
|
+
/* { dg-output "\nstack pointer match" } */
|
|
71
|
+
exit(0);
|
|
72
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/* Area: ffi_call, closure_call
|
|
2
|
+
Purpose: Check structure passing with different structure size.
|
|
3
|
+
Limitations: none.
|
|
4
|
+
PR: none.
|
|
5
|
+
Originator: <andreast@gcc.gnu.org> 20030828 */
|
|
6
|
+
|
|
7
|
+
/* { dg-do run } */
|
|
8
|
+
#include "ffitest.h"
|
|
9
|
+
|
|
10
|
+
typedef struct cls_struct_12byte {
|
|
11
|
+
int a;
|
|
12
|
+
int b;
|
|
13
|
+
int c;
|
|
14
|
+
} cls_struct_12byte;
|
|
15
|
+
|
|
16
|
+
cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1,
|
|
17
|
+
struct cls_struct_12byte b2)
|
|
18
|
+
{
|
|
19
|
+
struct cls_struct_12byte result;
|
|
20
|
+
|
|
21
|
+
result.a = b1.a + b2.a;
|
|
22
|
+
result.b = b1.b + b2.b;
|
|
23
|
+
result.c = b1.c + b2.c;
|
|
24
|
+
|
|
25
|
+
printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
|
|
26
|
+
result.a, result.b, result.c);
|
|
27
|
+
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp,
|
|
32
|
+
void** args , void* userdata __UNUSED__)
|
|
33
|
+
{
|
|
34
|
+
struct cls_struct_12byte b1, b2;
|
|
35
|
+
|
|
36
|
+
b1 = *(struct cls_struct_12byte*)(args[0]);
|
|
37
|
+
b2 = *(struct cls_struct_12byte*)(args[1]);
|
|
38
|
+
|
|
39
|
+
*(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
int main (void)
|
|
43
|
+
{
|
|
44
|
+
ffi_cif cif;
|
|
45
|
+
#ifndef USING_MMAP
|
|
46
|
+
static ffi_closure cl;
|
|
47
|
+
#endif
|
|
48
|
+
ffi_closure *pcl;
|
|
49
|
+
void* args_dbl[5];
|
|
50
|
+
ffi_type* cls_struct_fields[4];
|
|
51
|
+
ffi_type cls_struct_type;
|
|
52
|
+
ffi_type* dbl_arg_types[5];
|
|
53
|
+
|
|
54
|
+
#ifdef USING_MMAP
|
|
55
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
|
56
|
+
#else
|
|
57
|
+
pcl = &cl;
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
cls_struct_type.size = 0;
|
|
61
|
+
cls_struct_type.alignment = 0;
|
|
62
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
|
63
|
+
cls_struct_type.elements = cls_struct_fields;
|
|
64
|
+
|
|
65
|
+
struct cls_struct_12byte h_dbl = { 7, 4, 9 };
|
|
66
|
+
struct cls_struct_12byte j_dbl = { 1, 5, 3 };
|
|
67
|
+
struct cls_struct_12byte res_dbl;
|
|
68
|
+
|
|
69
|
+
cls_struct_fields[0] = &ffi_type_sint;
|
|
70
|
+
cls_struct_fields[1] = &ffi_type_sint;
|
|
71
|
+
cls_struct_fields[2] = &ffi_type_sint;
|
|
72
|
+
cls_struct_fields[3] = NULL;
|
|
73
|
+
|
|
74
|
+
dbl_arg_types[0] = &cls_struct_type;
|
|
75
|
+
dbl_arg_types[1] = &cls_struct_type;
|
|
76
|
+
dbl_arg_types[2] = NULL;
|
|
77
|
+
|
|
78
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
|
79
|
+
dbl_arg_types) == FFI_OK);
|
|
80
|
+
|
|
81
|
+
args_dbl[0] = &h_dbl;
|
|
82
|
+
args_dbl[1] = &j_dbl;
|
|
83
|
+
args_dbl[2] = NULL;
|
|
84
|
+
|
|
85
|
+
ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl);
|
|
86
|
+
/* { dg-output "7 4 9 1 5 3: 8 9 12" } */
|
|
87
|
+
printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
|
88
|
+
/* { dg-output "\nres: 8 9 12" } */
|
|
89
|
+
|
|
90
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_12byte_gn, NULL) == FFI_OK);
|
|
91
|
+
|
|
92
|
+
res_dbl.a = 0;
|
|
93
|
+
res_dbl.b = 0;
|
|
94
|
+
res_dbl.c = 0;
|
|
95
|
+
|
|
96
|
+
res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(pcl))(h_dbl, j_dbl);
|
|
97
|
+
/* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */
|
|
98
|
+
printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
|
99
|
+
/* { dg-output "\nres: 8 9 12" } */
|
|
100
|
+
|
|
101
|
+
exit(0);
|
|
102
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/* Area: ffi_call, closure_call
|
|
2
|
+
Purpose: Check structure passing with different structure size.
|
|
3
|
+
Depending on the ABI. Check overlapping.
|
|
4
|
+
Limitations: none.
|
|
5
|
+
PR: none.
|
|
6
|
+
Originator: <andreast@gcc.gnu.org> 20030828 */
|
|
7
|
+
|
|
8
|
+
/* { dg-do run } */
|
|
9
|
+
#include "ffitest.h"
|
|
10
|
+
|
|
11
|
+
typedef struct cls_struct_16byte {
|
|
12
|
+
int a;
|
|
13
|
+
double b;
|
|
14
|
+
int c;
|
|
15
|
+
} cls_struct_16byte;
|
|
16
|
+
|
|
17
|
+
cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1,
|
|
18
|
+
struct cls_struct_16byte b2)
|
|
19
|
+
{
|
|
20
|
+
struct cls_struct_16byte result;
|
|
21
|
+
|
|
22
|
+
result.a = b1.a + b2.a;
|
|
23
|
+
result.b = b1.b + b2.b;
|
|
24
|
+
result.c = b1.c + b2.c;
|
|
25
|
+
|
|
26
|
+
printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
|
|
27
|
+
result.a, result.b, result.c);
|
|
28
|
+
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp,
|
|
33
|
+
void** args, void* userdata __UNUSED__)
|
|
34
|
+
{
|
|
35
|
+
struct cls_struct_16byte b1, b2;
|
|
36
|
+
|
|
37
|
+
b1 = *(struct cls_struct_16byte*)(args[0]);
|
|
38
|
+
b2 = *(struct cls_struct_16byte*)(args[1]);
|
|
39
|
+
|
|
40
|
+
*(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
int main (void)
|
|
44
|
+
{
|
|
45
|
+
ffi_cif cif;
|
|
46
|
+
#ifndef USING_MMAP
|
|
47
|
+
static ffi_closure cl;
|
|
48
|
+
#endif
|
|
49
|
+
ffi_closure *pcl;
|
|
50
|
+
void* args_dbl[5];
|
|
51
|
+
ffi_type* cls_struct_fields[4];
|
|
52
|
+
ffi_type cls_struct_type;
|
|
53
|
+
ffi_type* dbl_arg_types[5];
|
|
54
|
+
|
|
55
|
+
#ifdef USING_MMAP
|
|
56
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
|
57
|
+
#else
|
|
58
|
+
pcl = &cl;
|
|
59
|
+
#endif
|
|
60
|
+
|
|
61
|
+
cls_struct_type.size = 0;
|
|
62
|
+
cls_struct_type.alignment = 0;
|
|
63
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
|
64
|
+
cls_struct_type.elements = cls_struct_fields;
|
|
65
|
+
|
|
66
|
+
struct cls_struct_16byte h_dbl = { 7, 8.0, 9 };
|
|
67
|
+
struct cls_struct_16byte j_dbl = { 1, 9.0, 3 };
|
|
68
|
+
struct cls_struct_16byte res_dbl;
|
|
69
|
+
|
|
70
|
+
cls_struct_fields[0] = &ffi_type_sint;
|
|
71
|
+
cls_struct_fields[1] = &ffi_type_double;
|
|
72
|
+
cls_struct_fields[2] = &ffi_type_sint;
|
|
73
|
+
cls_struct_fields[3] = NULL;
|
|
74
|
+
|
|
75
|
+
dbl_arg_types[0] = &cls_struct_type;
|
|
76
|
+
dbl_arg_types[1] = &cls_struct_type;
|
|
77
|
+
dbl_arg_types[2] = NULL;
|
|
78
|
+
|
|
79
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
|
80
|
+
dbl_arg_types) == FFI_OK);
|
|
81
|
+
|
|
82
|
+
args_dbl[0] = &h_dbl;
|
|
83
|
+
args_dbl[1] = &j_dbl;
|
|
84
|
+
args_dbl[2] = NULL;
|
|
85
|
+
|
|
86
|
+
ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl);
|
|
87
|
+
/* { dg-output "7 8 9 1 9 3: 8 17 12" } */
|
|
88
|
+
printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
|
89
|
+
/* { dg-output "\nres: 8 17 12" } */
|
|
90
|
+
|
|
91
|
+
res_dbl.a = 0;
|
|
92
|
+
res_dbl.b = 0.0;
|
|
93
|
+
res_dbl.c = 0;
|
|
94
|
+
|
|
95
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_16byte_gn, NULL) == FFI_OK);
|
|
96
|
+
|
|
97
|
+
res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(pcl))(h_dbl, j_dbl);
|
|
98
|
+
/* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */
|
|
99
|
+
printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
|
100
|
+
/* { dg-output "\nres: 8 17 12" } */
|
|
101
|
+
|
|
102
|
+
exit(0);
|
|
103
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/* Area: ffi_call, closure_call
|
|
2
|
+
Purpose: Check structure passing with different structure size.
|
|
3
|
+
Depending on the ABI. Double alignment check on darwin.
|
|
4
|
+
Limitations: none.
|
|
5
|
+
PR: none.
|
|
6
|
+
Originator: <andreast@gcc.gnu.org> 20030915 */
|
|
7
|
+
|
|
8
|
+
/* { dg-do run } */
|
|
9
|
+
#include "ffitest.h"
|
|
10
|
+
|
|
11
|
+
typedef struct cls_struct_18byte {
|
|
12
|
+
double a;
|
|
13
|
+
unsigned char b;
|
|
14
|
+
unsigned char c;
|
|
15
|
+
double d;
|
|
16
|
+
} cls_struct_18byte;
|
|
17
|
+
|
|
18
|
+
cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1,
|
|
19
|
+
struct cls_struct_18byte a2)
|
|
20
|
+
{
|
|
21
|
+
struct cls_struct_18byte result;
|
|
22
|
+
|
|
23
|
+
result.a = a1.a + a2.a;
|
|
24
|
+
result.b = a1.b + a2.b;
|
|
25
|
+
result.c = a1.c + a2.c;
|
|
26
|
+
result.d = a1.d + a2.d;
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d,
|
|
30
|
+
a2.a, a2.b, a2.c, a2.d,
|
|
31
|
+
result.a, result.b, result.c, result.d);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static void
|
|
36
|
+
cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
|
37
|
+
void* userdata __UNUSED__)
|
|
38
|
+
{
|
|
39
|
+
struct cls_struct_18byte a1, a2;
|
|
40
|
+
|
|
41
|
+
a1 = *(struct cls_struct_18byte*)(args[0]);
|
|
42
|
+
a2 = *(struct cls_struct_18byte*)(args[1]);
|
|
43
|
+
|
|
44
|
+
*(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
int main (void)
|
|
48
|
+
{
|
|
49
|
+
ffi_cif cif;
|
|
50
|
+
#ifndef USING_MMAP
|
|
51
|
+
static ffi_closure cl;
|
|
52
|
+
#endif
|
|
53
|
+
ffi_closure *pcl;
|
|
54
|
+
void* args_dbl[3];
|
|
55
|
+
ffi_type* cls_struct_fields[5];
|
|
56
|
+
ffi_type cls_struct_type;
|
|
57
|
+
ffi_type* dbl_arg_types[3];
|
|
58
|
+
|
|
59
|
+
#ifdef USING_MMAP
|
|
60
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
|
61
|
+
#else
|
|
62
|
+
pcl = &cl;
|
|
63
|
+
#endif
|
|
64
|
+
|
|
65
|
+
cls_struct_type.size = 0;
|
|
66
|
+
cls_struct_type.alignment = 0;
|
|
67
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
|
68
|
+
cls_struct_type.elements = cls_struct_fields;
|
|
69
|
+
|
|
70
|
+
struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 };
|
|
71
|
+
struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 };
|
|
72
|
+
struct cls_struct_18byte res_dbl;
|
|
73
|
+
|
|
74
|
+
cls_struct_fields[0] = &ffi_type_double;
|
|
75
|
+
cls_struct_fields[1] = &ffi_type_uchar;
|
|
76
|
+
cls_struct_fields[2] = &ffi_type_uchar;
|
|
77
|
+
cls_struct_fields[3] = &ffi_type_double;
|
|
78
|
+
cls_struct_fields[4] = NULL;
|
|
79
|
+
|
|
80
|
+
dbl_arg_types[0] = &cls_struct_type;
|
|
81
|
+
dbl_arg_types[1] = &cls_struct_type;
|
|
82
|
+
dbl_arg_types[2] = NULL;
|
|
83
|
+
|
|
84
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
|
85
|
+
dbl_arg_types) == FFI_OK);
|
|
86
|
+
|
|
87
|
+
args_dbl[0] = &g_dbl;
|
|
88
|
+
args_dbl[1] = &f_dbl;
|
|
89
|
+
args_dbl[2] = NULL;
|
|
90
|
+
|
|
91
|
+
ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl);
|
|
92
|
+
/* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */
|
|
93
|
+
printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
|
94
|
+
/* { dg-output "\nres: 5 252 250 8" } */
|
|
95
|
+
|
|
96
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_18byte_gn, NULL) == FFI_OK);
|
|
97
|
+
|
|
98
|
+
res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(pcl))(g_dbl, f_dbl);
|
|
99
|
+
/* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */
|
|
100
|
+
printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
|
101
|
+
/* { dg-output "\nres: 5 252 250 8" } */
|
|
102
|
+
|
|
103
|
+
exit(0);
|
|
104
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* Area: ffi_call, closure_call
|
|
2
|
+
Purpose: Check structure passing with different structure size.
|
|
3
|
+
Depending on the ABI. Double alignment check on darwin.
|
|
4
|
+
Limitations: none.
|
|
5
|
+
PR: none.
|
|
6
|
+
Originator: <andreast@gcc.gnu.org> 20030915 */
|
|
7
|
+
|
|
8
|
+
/* { dg-do run } */
|
|
9
|
+
#include "ffitest.h"
|
|
10
|
+
|
|
11
|
+
typedef struct cls_struct_19byte {
|
|
12
|
+
double a;
|
|
13
|
+
unsigned char b;
|
|
14
|
+
unsigned char c;
|
|
15
|
+
double d;
|
|
16
|
+
unsigned char e;
|
|
17
|
+
} cls_struct_19byte;
|
|
18
|
+
|
|
19
|
+
cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1,
|
|
20
|
+
struct cls_struct_19byte a2)
|
|
21
|
+
{
|
|
22
|
+
struct cls_struct_19byte result;
|
|
23
|
+
|
|
24
|
+
result.a = a1.a + a2.a;
|
|
25
|
+
result.b = a1.b + a2.b;
|
|
26
|
+
result.c = a1.c + a2.c;
|
|
27
|
+
result.d = a1.d + a2.d;
|
|
28
|
+
result.e = a1.e + a2.e;
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n",
|
|
32
|
+
a1.a, a1.b, a1.c, a1.d, a1.e,
|
|
33
|
+
a2.a, a2.b, a2.c, a2.d, a2.e,
|
|
34
|
+
result.a, result.b, result.c, result.d, result.e);
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static void
|
|
39
|
+
cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
|
40
|
+
void* userdata __UNUSED__)
|
|
41
|
+
{
|
|
42
|
+
struct cls_struct_19byte a1, a2;
|
|
43
|
+
|
|
44
|
+
a1 = *(struct cls_struct_19byte*)(args[0]);
|
|
45
|
+
a2 = *(struct cls_struct_19byte*)(args[1]);
|
|
46
|
+
|
|
47
|
+
*(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
int main (void)
|
|
51
|
+
{
|
|
52
|
+
ffi_cif cif;
|
|
53
|
+
#ifndef USING_MMAP
|
|
54
|
+
static ffi_closure cl;
|
|
55
|
+
#endif
|
|
56
|
+
ffi_closure *pcl;
|
|
57
|
+
void* args_dbl[3];
|
|
58
|
+
ffi_type* cls_struct_fields[6];
|
|
59
|
+
ffi_type cls_struct_type;
|
|
60
|
+
ffi_type* dbl_arg_types[3];
|
|
61
|
+
|
|
62
|
+
#ifdef USING_MMAP
|
|
63
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
|
64
|
+
#else
|
|
65
|
+
pcl = &cl;
|
|
66
|
+
#endif
|
|
67
|
+
|
|
68
|
+
cls_struct_type.size = 0;
|
|
69
|
+
cls_struct_type.alignment = 0;
|
|
70
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
|
71
|
+
cls_struct_type.elements = cls_struct_fields;
|
|
72
|
+
|
|
73
|
+
struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 };
|
|
74
|
+
struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 };
|
|
75
|
+
struct cls_struct_19byte res_dbl;
|
|
76
|
+
|
|
77
|
+
cls_struct_fields[0] = &ffi_type_double;
|
|
78
|
+
cls_struct_fields[1] = &ffi_type_uchar;
|
|
79
|
+
cls_struct_fields[2] = &ffi_type_uchar;
|
|
80
|
+
cls_struct_fields[3] = &ffi_type_double;
|
|
81
|
+
cls_struct_fields[4] = &ffi_type_uchar;
|
|
82
|
+
cls_struct_fields[5] = NULL;
|
|
83
|
+
|
|
84
|
+
dbl_arg_types[0] = &cls_struct_type;
|
|
85
|
+
dbl_arg_types[1] = &cls_struct_type;
|
|
86
|
+
dbl_arg_types[2] = NULL;
|
|
87
|
+
|
|
88
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
|
89
|
+
dbl_arg_types) == FFI_OK);
|
|
90
|
+
|
|
91
|
+
args_dbl[0] = &g_dbl;
|
|
92
|
+
args_dbl[1] = &f_dbl;
|
|
93
|
+
args_dbl[2] = NULL;
|
|
94
|
+
|
|
95
|
+
ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl);
|
|
96
|
+
/* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
|
|
97
|
+
printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
|
|
98
|
+
res_dbl.d, res_dbl.e);
|
|
99
|
+
/* { dg-output "\nres: 5 252 250 8 239" } */
|
|
100
|
+
|
|
101
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_19byte_gn, NULL) == FFI_OK);
|
|
102
|
+
|
|
103
|
+
res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(pcl))(g_dbl, f_dbl);
|
|
104
|
+
/* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
|
|
105
|
+
printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
|
|
106
|
+
res_dbl.d, res_dbl.e);
|
|
107
|
+
/* { dg-output "\nres: 5 252 250 8 239" } */
|
|
108
|
+
|
|
109
|
+
exit(0);
|
|
110
|
+
}
|