ffi 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- 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,64 @@
|
|
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
|
+
typedef struct
|
10
|
+
{
|
11
|
+
float f;
|
12
|
+
double d;
|
13
|
+
} test_structure_6;
|
14
|
+
|
15
|
+
static test_structure_6 struct6 (test_structure_6 ts)
|
16
|
+
{
|
17
|
+
ts.f += 1;
|
18
|
+
ts.d += 1;
|
19
|
+
|
20
|
+
return ts;
|
21
|
+
}
|
22
|
+
|
23
|
+
int main (void)
|
24
|
+
{
|
25
|
+
ffi_cif cif;
|
26
|
+
ffi_type *args[MAX_ARGS];
|
27
|
+
void *values[MAX_ARGS];
|
28
|
+
ffi_type ts6_type;
|
29
|
+
ffi_type *ts6_type_elements[3];
|
30
|
+
ts6_type.size = 0;
|
31
|
+
ts6_type.alignment = 0;
|
32
|
+
ts6_type.type = FFI_TYPE_STRUCT;
|
33
|
+
ts6_type.elements = ts6_type_elements;
|
34
|
+
ts6_type_elements[0] = &ffi_type_float;
|
35
|
+
ts6_type_elements[1] = &ffi_type_double;
|
36
|
+
ts6_type_elements[2] = NULL;
|
37
|
+
|
38
|
+
|
39
|
+
test_structure_6 ts6_arg;
|
40
|
+
|
41
|
+
/* This is a hack to get a properly aligned result buffer */
|
42
|
+
test_structure_6 *ts6_result =
|
43
|
+
(test_structure_6 *) malloc (sizeof(test_structure_6));
|
44
|
+
|
45
|
+
args[0] = &ts6_type;
|
46
|
+
values[0] = &ts6_arg;
|
47
|
+
|
48
|
+
/* Initialize the cif */
|
49
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts6_type, args) == FFI_OK);
|
50
|
+
|
51
|
+
ts6_arg.f = 5.55f;
|
52
|
+
ts6_arg.d = 6.66;
|
53
|
+
|
54
|
+
printf ("%g\n", ts6_arg.f);
|
55
|
+
printf ("%g\n", ts6_arg.d);
|
56
|
+
|
57
|
+
ffi_call(&cif, FFI_FN(struct6), ts6_result, values);
|
58
|
+
|
59
|
+
CHECK(ts6_result->f == 5.55f + 1);
|
60
|
+
CHECK(ts6_result->d == 6.66 + 1);
|
61
|
+
|
62
|
+
free (ts6_result);
|
63
|
+
exit(0);
|
64
|
+
}
|
@@ -0,0 +1,74 @@
|
|
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
|
+
typedef struct
|
10
|
+
{
|
11
|
+
float f1;
|
12
|
+
float f2;
|
13
|
+
double d;
|
14
|
+
} test_structure_7;
|
15
|
+
|
16
|
+
static test_structure_7 struct7 (test_structure_7 ts)
|
17
|
+
{
|
18
|
+
ts.f1 += 1;
|
19
|
+
ts.f2 += 1;
|
20
|
+
ts.d += 1;
|
21
|
+
|
22
|
+
return ts;
|
23
|
+
}
|
24
|
+
|
25
|
+
int main (void)
|
26
|
+
{
|
27
|
+
ffi_cif cif;
|
28
|
+
ffi_type *args[MAX_ARGS];
|
29
|
+
void *values[MAX_ARGS];
|
30
|
+
ffi_type ts7_type;
|
31
|
+
ffi_type *ts7_type_elements[4];
|
32
|
+
ts7_type.size = 0;
|
33
|
+
ts7_type.alignment = 0;
|
34
|
+
ts7_type.type = FFI_TYPE_STRUCT;
|
35
|
+
ts7_type.elements = ts7_type_elements;
|
36
|
+
ts7_type_elements[0] = &ffi_type_float;
|
37
|
+
ts7_type_elements[1] = &ffi_type_float;
|
38
|
+
ts7_type_elements[2] = &ffi_type_double;
|
39
|
+
ts7_type_elements[3] = NULL;
|
40
|
+
|
41
|
+
|
42
|
+
test_structure_7 ts7_arg;
|
43
|
+
|
44
|
+
/* This is a hack to get a properly aligned result buffer */
|
45
|
+
test_structure_7 *ts7_result =
|
46
|
+
(test_structure_7 *) malloc (sizeof(test_structure_7));
|
47
|
+
|
48
|
+
args[0] = &ts7_type;
|
49
|
+
values[0] = &ts7_arg;
|
50
|
+
|
51
|
+
/* Initialize the cif */
|
52
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts7_type, args) == FFI_OK);
|
53
|
+
|
54
|
+
ts7_arg.f1 = 5.55f;
|
55
|
+
ts7_arg.f2 = 55.5f;
|
56
|
+
ts7_arg.d = 6.66;
|
57
|
+
|
58
|
+
printf ("%g\n", ts7_arg.f1);
|
59
|
+
printf ("%g\n", ts7_arg.f2);
|
60
|
+
printf ("%g\n", ts7_arg.d);
|
61
|
+
|
62
|
+
ffi_call(&cif, FFI_FN(struct7), ts7_result, values);
|
63
|
+
|
64
|
+
printf ("%g\n", ts7_result->f1);
|
65
|
+
printf ("%g\n", ts7_result->f2);
|
66
|
+
printf ("%g\n", ts7_result->d);
|
67
|
+
|
68
|
+
CHECK(ts7_result->f1 == 5.55f + 1);
|
69
|
+
CHECK(ts7_result->f2 == 55.5f + 1);
|
70
|
+
CHECK(ts7_result->d == 6.66 + 1);
|
71
|
+
|
72
|
+
free (ts7_result);
|
73
|
+
exit(0);
|
74
|
+
}
|
@@ -0,0 +1,80 @@
|
|
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
|
+
typedef struct
|
10
|
+
{
|
11
|
+
float f1;
|
12
|
+
float f2;
|
13
|
+
float f3;
|
14
|
+
float f4;
|
15
|
+
} test_structure_8;
|
16
|
+
|
17
|
+
static test_structure_8 struct8 (test_structure_8 ts)
|
18
|
+
{
|
19
|
+
ts.f1 += 1;
|
20
|
+
ts.f2 += 1;
|
21
|
+
ts.f3 += 1;
|
22
|
+
ts.f4 += 1;
|
23
|
+
|
24
|
+
return ts;
|
25
|
+
}
|
26
|
+
|
27
|
+
int main (void)
|
28
|
+
{
|
29
|
+
ffi_cif cif;
|
30
|
+
ffi_type *args[MAX_ARGS];
|
31
|
+
void *values[MAX_ARGS];
|
32
|
+
ffi_type ts8_type;
|
33
|
+
ffi_type *ts8_type_elements[5];
|
34
|
+
ts8_type.size = 0;
|
35
|
+
ts8_type.alignment = 0;
|
36
|
+
ts8_type.type = FFI_TYPE_STRUCT;
|
37
|
+
ts8_type.elements = ts8_type_elements;
|
38
|
+
ts8_type_elements[0] = &ffi_type_float;
|
39
|
+
ts8_type_elements[1] = &ffi_type_float;
|
40
|
+
ts8_type_elements[2] = &ffi_type_float;
|
41
|
+
ts8_type_elements[3] = &ffi_type_float;
|
42
|
+
ts8_type_elements[4] = NULL;
|
43
|
+
|
44
|
+
test_structure_8 ts8_arg;
|
45
|
+
|
46
|
+
/* This is a hack to get a properly aligned result buffer */
|
47
|
+
test_structure_8 *ts8_result =
|
48
|
+
(test_structure_8 *) malloc (sizeof(test_structure_8));
|
49
|
+
|
50
|
+
args[0] = &ts8_type;
|
51
|
+
values[0] = &ts8_arg;
|
52
|
+
|
53
|
+
/* Initialize the cif */
|
54
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts8_type, args) == FFI_OK);
|
55
|
+
|
56
|
+
ts8_arg.f1 = 5.55f;
|
57
|
+
ts8_arg.f2 = 55.5f;
|
58
|
+
ts8_arg.f3 = -5.55f;
|
59
|
+
ts8_arg.f4 = -55.5f;
|
60
|
+
|
61
|
+
printf ("%g\n", ts8_arg.f1);
|
62
|
+
printf ("%g\n", ts8_arg.f2);
|
63
|
+
printf ("%g\n", ts8_arg.f3);
|
64
|
+
printf ("%g\n", ts8_arg.f4);
|
65
|
+
|
66
|
+
ffi_call(&cif, FFI_FN(struct8), ts8_result, values);
|
67
|
+
|
68
|
+
printf ("%g\n", ts8_result->f1);
|
69
|
+
printf ("%g\n", ts8_result->f2);
|
70
|
+
printf ("%g\n", ts8_result->f3);
|
71
|
+
printf ("%g\n", ts8_result->f4);
|
72
|
+
|
73
|
+
CHECK(ts8_result->f1 == 5.55f + 1);
|
74
|
+
CHECK(ts8_result->f2 == 55.5f + 1);
|
75
|
+
CHECK(ts8_result->f3 == -5.55f + 1);
|
76
|
+
CHECK(ts8_result->f4 == -55.5f + 1);
|
77
|
+
|
78
|
+
free (ts8_result);
|
79
|
+
exit(0);
|
80
|
+
}
|
@@ -0,0 +1,67 @@
|
|
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
|
+
float f;
|
13
|
+
int i;
|
14
|
+
} test_structure_9;
|
15
|
+
|
16
|
+
static test_structure_9 struct9 (test_structure_9 ts)
|
17
|
+
{
|
18
|
+
ts.f += 1;
|
19
|
+
ts.i += 1;
|
20
|
+
|
21
|
+
return ts;
|
22
|
+
}
|
23
|
+
|
24
|
+
int main (void)
|
25
|
+
{
|
26
|
+
ffi_cif cif;
|
27
|
+
ffi_type *args[MAX_ARGS];
|
28
|
+
void *values[MAX_ARGS];
|
29
|
+
ffi_type ts9_type;
|
30
|
+
ffi_type *ts9_type_elements[3];
|
31
|
+
ts9_type.size = 0;
|
32
|
+
ts9_type.alignment = 0;
|
33
|
+
ts9_type.type = FFI_TYPE_STRUCT;
|
34
|
+
ts9_type.elements = ts9_type_elements;
|
35
|
+
ts9_type_elements[0] = &ffi_type_float;
|
36
|
+
ts9_type_elements[1] = &ffi_type_sint;
|
37
|
+
ts9_type_elements[2] = NULL;
|
38
|
+
|
39
|
+
test_structure_9 ts9_arg;
|
40
|
+
|
41
|
+
/* This is a hack to get a properly aligned result buffer */
|
42
|
+
test_structure_9 *ts9_result =
|
43
|
+
(test_structure_9 *) malloc (sizeof(test_structure_9));
|
44
|
+
|
45
|
+
args[0] = &ts9_type;
|
46
|
+
values[0] = &ts9_arg;
|
47
|
+
|
48
|
+
/* Initialize the cif */
|
49
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts9_type, args) == FFI_OK);
|
50
|
+
|
51
|
+
ts9_arg.f = 5.55f;
|
52
|
+
ts9_arg.i = 5;
|
53
|
+
|
54
|
+
printf ("%g\n", ts9_arg.f);
|
55
|
+
printf ("%d\n", ts9_arg.i);
|
56
|
+
|
57
|
+
ffi_call(&cif, FFI_FN(struct9), ts9_result, values);
|
58
|
+
|
59
|
+
printf ("%g\n", ts9_result->f);
|
60
|
+
printf ("%d\n", ts9_result->i);
|
61
|
+
|
62
|
+
CHECK(ts9_result->f == 5.55f + 1);
|
63
|
+
CHECK(ts9_result->i == 5 + 1);
|
64
|
+
|
65
|
+
free (ts9_result);
|
66
|
+
exit(0);
|
67
|
+
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#include <stdlib.h>
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <fcntl.h>
|
4
|
+
#include <ffi.h>
|
5
|
+
#include "fficonfig.h"
|
6
|
+
|
7
|
+
#define MAX_ARGS 256
|
8
|
+
|
9
|
+
|
10
|
+
/* Define __UNUSED__ that also other compilers than gcc can run the tests. */
|
11
|
+
#undef __UNUSED__
|
12
|
+
#if defined(__GNUC__)
|
13
|
+
#define __UNUSED__ __attribute__((__unused__))
|
14
|
+
#else
|
15
|
+
#define __UNUSED__
|
16
|
+
#endif
|
17
|
+
|
18
|
+
#define CHECK(x) (!(x) ? abort() : (void)0)
|
19
|
+
|
20
|
+
/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
|
21
|
+
file open. */
|
22
|
+
#ifdef HAVE_MMAP_ANON
|
23
|
+
# undef HAVE_MMAP_DEV_ZERO
|
24
|
+
|
25
|
+
# include <sys/mman.h>
|
26
|
+
# ifndef MAP_FAILED
|
27
|
+
# define MAP_FAILED -1
|
28
|
+
# endif
|
29
|
+
# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
|
30
|
+
# define MAP_ANONYMOUS MAP_ANON
|
31
|
+
# endif
|
32
|
+
# define USING_MMAP
|
33
|
+
|
34
|
+
#endif
|
35
|
+
|
36
|
+
#ifdef HAVE_MMAP_DEV_ZERO
|
37
|
+
|
38
|
+
# include <sys/mman.h>
|
39
|
+
# ifndef MAP_FAILED
|
40
|
+
# define MAP_FAILED -1
|
41
|
+
# endif
|
42
|
+
# define USING_MMAP
|
43
|
+
|
44
|
+
#endif
|
45
|
+
|
46
|
+
#ifdef USING_MMAP
|
47
|
+
static inline void *
|
48
|
+
allocate_mmap (size_t size)
|
49
|
+
{
|
50
|
+
void *page;
|
51
|
+
#if defined (HAVE_MMAP_DEV_ZERO)
|
52
|
+
static int dev_zero_fd = -1;
|
53
|
+
#endif
|
54
|
+
|
55
|
+
#ifdef HAVE_MMAP_DEV_ZERO
|
56
|
+
if (dev_zero_fd == -1)
|
57
|
+
{
|
58
|
+
dev_zero_fd = open ("/dev/zero", O_RDONLY);
|
59
|
+
if (dev_zero_fd == -1)
|
60
|
+
{
|
61
|
+
perror ("open /dev/zero: %m");
|
62
|
+
exit (1);
|
63
|
+
}
|
64
|
+
}
|
65
|
+
#endif
|
66
|
+
|
67
|
+
|
68
|
+
#ifdef HAVE_MMAP_ANON
|
69
|
+
page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
|
70
|
+
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
71
|
+
#endif
|
72
|
+
#ifdef HAVE_MMAP_DEV_ZERO
|
73
|
+
page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
|
74
|
+
MAP_PRIVATE, dev_zero_fd, 0);
|
75
|
+
#endif
|
76
|
+
|
77
|
+
if (page == MAP_FAILED)
|
78
|
+
{
|
79
|
+
perror ("virtual memory exhausted");
|
80
|
+
exit (1);
|
81
|
+
}
|
82
|
+
|
83
|
+
return page;
|
84
|
+
}
|
85
|
+
|
86
|
+
#endif
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Copyright (C) 2003, 2006 Free Software Foundation, Inc.
|
2
|
+
|
3
|
+
# This program is free software; you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation; either version 2 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program; if not, write to the Free Software
|
15
|
+
# Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
16
|
+
# libffi testsuite that uses the 'dg.exp' driver.
|
17
|
+
|
18
|
+
load_lib libffi-dg.exp
|
19
|
+
|
20
|
+
dg-init
|
21
|
+
libffi-init
|
22
|
+
|
23
|
+
global srcdir subdir
|
24
|
+
|
25
|
+
global cxx_options
|
26
|
+
|
27
|
+
set cxx_options " -shared-libgcc -lstdc++"
|
28
|
+
|
29
|
+
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O0 -W -Wall"
|
30
|
+
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O2"
|
31
|
+
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O3"
|
32
|
+
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-Os"
|
33
|
+
|
34
|
+
dg-finish
|
35
|
+
|
36
|
+
# Local Variables:
|
37
|
+
# tcl-indent-level:4
|
38
|
+
# End:
|
@@ -0,0 +1,123 @@
|
|
1
|
+
/* Area: ffi_closure, unwind info
|
2
|
+
Purpose: Check if the unwind information is passed correctly.
|
3
|
+
Limitations: none.
|
4
|
+
PR: none.
|
5
|
+
Originator: Jeff Sturm <jsturm@one-point.com> */
|
6
|
+
|
7
|
+
/* { dg-do run } */
|
8
|
+
#include "ffitestcxx.h"
|
9
|
+
|
10
|
+
void
|
11
|
+
closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
|
12
|
+
void** args __UNUSED__, void* userdata __UNUSED__)
|
13
|
+
{
|
14
|
+
throw 9;
|
15
|
+
}
|
16
|
+
|
17
|
+
typedef void (*closure_test_type)();
|
18
|
+
|
19
|
+
void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp,
|
20
|
+
void** args, void* userdata __UNUSED__)
|
21
|
+
{
|
22
|
+
*(ffi_arg*)resp =
|
23
|
+
(int)*(float *)args[0] +(int)(*(float *)args[1]) +
|
24
|
+
(int)(*(float *)args[2]) + (int)*(float *)args[3] +
|
25
|
+
(int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) +
|
26
|
+
(int)*(float *)args[6] + (int)(*(int *)args[7]) +
|
27
|
+
(int)(*(double*)args[8]) + (int)*(int *)args[9] +
|
28
|
+
(int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
|
29
|
+
(int)*(int *)args[12] + (int)(*(int *)args[13]) +
|
30
|
+
(int)(*(int *)args[14]) + *(int *)args[15] + (int)(long)userdata;
|
31
|
+
|
32
|
+
printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
|
33
|
+
(int)*(float *)args[0], (int)(*(float *)args[1]),
|
34
|
+
(int)(*(float *)args[2]), (int)*(float *)args[3],
|
35
|
+
(int)(*(signed short *)args[4]), (int)(*(float *)args[5]),
|
36
|
+
(int)*(float *)args[6], (int)(*(int *)args[7]),
|
37
|
+
(int)(*(double *)args[8]), (int)*(int *)args[9],
|
38
|
+
(int)(*(int *)args[10]), (int)(*(float *)args[11]),
|
39
|
+
(int)*(int *)args[12], (int)(*(int *)args[13]),
|
40
|
+
(int)(*(int *)args[14]), *(int *)args[15],
|
41
|
+
(int)(long)userdata, (int)*(ffi_arg*)resp);
|
42
|
+
|
43
|
+
throw (int)*(ffi_arg*)resp;
|
44
|
+
}
|
45
|
+
|
46
|
+
typedef int (*closure_test_type1)(float, float, float, float, signed short,
|
47
|
+
float, float, int, double, int, int, float,
|
48
|
+
int, int, int, int);
|
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
|
+
ffi_type * cl_arg_types[17];
|
58
|
+
#ifdef USING_MMAP
|
59
|
+
pcl = (ffi_closure *) allocate_mmap (sizeof(ffi_closure));
|
60
|
+
#else
|
61
|
+
pcl = &cl;
|
62
|
+
#endif
|
63
|
+
|
64
|
+
{
|
65
|
+
cl_arg_types[1] = NULL;
|
66
|
+
|
67
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0,
|
68
|
+
&ffi_type_void, cl_arg_types) == FFI_OK);
|
69
|
+
CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn, NULL) == FFI_OK);
|
70
|
+
|
71
|
+
try
|
72
|
+
{
|
73
|
+
(*((closure_test_type)(pcl)))();
|
74
|
+
} catch (int exception_code)
|
75
|
+
{
|
76
|
+
CHECK(exception_code == 9);
|
77
|
+
}
|
78
|
+
|
79
|
+
printf("part one OK\n");
|
80
|
+
/* { dg-output "part one OK" } */
|
81
|
+
}
|
82
|
+
|
83
|
+
{
|
84
|
+
|
85
|
+
cl_arg_types[0] = &ffi_type_float;
|
86
|
+
cl_arg_types[1] = &ffi_type_float;
|
87
|
+
cl_arg_types[2] = &ffi_type_float;
|
88
|
+
cl_arg_types[3] = &ffi_type_float;
|
89
|
+
cl_arg_types[4] = &ffi_type_sshort;
|
90
|
+
cl_arg_types[5] = &ffi_type_float;
|
91
|
+
cl_arg_types[6] = &ffi_type_float;
|
92
|
+
cl_arg_types[7] = &ffi_type_uint;
|
93
|
+
cl_arg_types[8] = &ffi_type_double;
|
94
|
+
cl_arg_types[9] = &ffi_type_uint;
|
95
|
+
cl_arg_types[10] = &ffi_type_uint;
|
96
|
+
cl_arg_types[11] = &ffi_type_float;
|
97
|
+
cl_arg_types[12] = &ffi_type_uint;
|
98
|
+
cl_arg_types[13] = &ffi_type_uint;
|
99
|
+
cl_arg_types[14] = &ffi_type_uint;
|
100
|
+
cl_arg_types[15] = &ffi_type_uint;
|
101
|
+
cl_arg_types[16] = NULL;
|
102
|
+
|
103
|
+
/* Initialize the cif */
|
104
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
|
105
|
+
&ffi_type_sint, cl_arg_types) == FFI_OK);
|
106
|
+
|
107
|
+
CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn1,
|
108
|
+
(void *) 3 /* userdata */) == FFI_OK);
|
109
|
+
try
|
110
|
+
{
|
111
|
+
(*((closure_test_type1)pcl))
|
112
|
+
(1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
|
113
|
+
19, 21, 1);
|
114
|
+
/* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
|
115
|
+
} catch (int exception_code)
|
116
|
+
{
|
117
|
+
CHECK(exception_code == 255);
|
118
|
+
}
|
119
|
+
printf("part two OK\n");
|
120
|
+
/* { dg-output "\npart two OK" } */
|
121
|
+
}
|
122
|
+
exit(0);
|
123
|
+
}
|