ffi 1.9.18-x86-mingw32 → 1.9.21-x86-mingw32
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.
- checksums.yaml +5 -5
- data/README.md +3 -2
- data/Rakefile +14 -4
- data/ext/ffi_c/AbstractMemory.c +6 -1
- data/ext/ffi_c/Platform.c +10 -2
- data/ext/ffi_c/extconf.rb +7 -2
- data/ext/ffi_c/libffi.bsd.mk +9 -3
- data/ext/ffi_c/libffi.darwin.mk +14 -4
- data/ext/ffi_c/libffi.gnu.mk +2 -1
- data/ext/ffi_c/libffi.mk +9 -4
- data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
- data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
- data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +166 -157
- data/ext/ffi_c/libffi/Makefile.in +923 -938
- data/ext/ffi_c/libffi/README +164 -52
- data/ext/ffi_c/libffi/acinclude.m4 +381 -0
- data/ext/ffi_c/libffi/aclocal.m4 +645 -384
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.0 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.1 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.2 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.3 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/requests +331 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.0 +4010 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.1 +1005 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.2 +4010 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.3 +4010 -0
- data/ext/ffi_c/libffi/compile +218 -14
- data/ext/ffi_c/libffi/config.guess +329 -368
- data/ext/ffi_c/libffi/config.sub +232 -112
- data/ext/ffi_c/libffi/configure +6970 -2189
- data/ext/ffi_c/libffi/configure.ac +148 -256
- data/ext/ffi_c/libffi/configure.host +265 -4
- data/ext/ffi_c/libffi/depcomp +346 -185
- data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
- data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
- data/ext/ffi_c/libffi/{mdate-sh → doc/mdate-sh} +40 -13
- data/ext/ffi_c/libffi/{texinfo.tex → doc/texinfo.tex} +3990 -1121
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
- data/ext/ffi_c/libffi/fficonfig.h.in~ +210 -0
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +207 -0
- data/ext/ffi_c/libffi/include/Makefile.am +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +188 -71
- data/ext/ffi_c/libffi/include/ffi.h.in +107 -50
- data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
- data/ext/ffi_c/libffi/install-sh +190 -202
- data/ext/ffi_c/libffi/libffi.map.in +80 -0
- data/ext/ffi_c/libffi/libffi.pc.in +3 -2
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +637 -0
- data/ext/ffi_c/libffi/libtool-ldflags +106 -0
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
- data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
- data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
- data/ext/ffi_c/libffi/m4/libtool.m4 +1691 -1135
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +104 -36
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +4 -3
- data/ext/ffi_c/libffi/m4/ltversion.m4 +6 -6
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +4 -3
- data/ext/ffi_c/libffi/man/Makefile.am +2 -2
- data/ext/ffi_c/libffi/man/Makefile.in +141 -49
- data/ext/ffi_c/libffi/man/ffi.3 +10 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
- data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
- data/ext/ffi_c/libffi/missing +150 -311
- data/ext/ffi_c/libffi/msvcc.sh +72 -9
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
- data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
- data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
- data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
- data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +597 -517
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
- data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
- data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
- data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
- data/ext/ffi_c/libffi/src/closures.c +319 -44
- data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/debug.c +6 -1
- data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
- data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
- data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
- data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
- data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
- data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
- data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
- data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
- data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
- data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +95 -28
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +9 -2
- data/ext/ffi_c/libffi/src/mips/n32.S +126 -56
- data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
- data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
- data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
- data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
- data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
- data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
- data/ext/ffi_c/libffi/src/powerpc/aix.S +6 -6
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +3 -1
- data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +25 -25
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +100 -44
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
- data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
- data/ext/ffi_c/libffi/src/raw_api.c +18 -5
- data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
- data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
- data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
- data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
- data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
- data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
- data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
- data/ext/ffi_c/libffi/src/types.c +43 -14
- data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
- data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
- data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +589 -500
- data/ext/ffi_c/libffi/src/x86/ffi64.c +338 -116
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
- data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
- data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
- data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
- data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
- data/ext/ffi_c/libffi/stamp-h.in +1 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -73
- data/ext/ffi_c/libffi/testsuite/Makefile.in +218 -111
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +120 -25
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
- data/ffi.gemspec +2 -2
- data/lib/2.0/ffi_c.so +0 -0
- data/lib/2.1/ffi_c.so +0 -0
- data/lib/2.2/ffi_c.so +0 -0
- data/lib/2.3/ffi_c.so +0 -0
- data/lib/2.4/ffi_c.so +0 -0
- data/lib/2.5/ffi_c.so +0 -0
- data/lib/ffi/enum.rb +124 -0
- data/lib/ffi/library.rb +65 -13
- data/lib/ffi/platform.rb +7 -2
- data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
- data/lib/ffi/pointer.rb +1 -0
- data/lib/ffi/struct.rb +0 -2
- data/lib/ffi/version.rb +1 -1
- data/spec/ffi/bitmask_spec.rb +575 -0
- data/spec/ffi/embed-test/ext/Makefile +242 -0
- data/spec/ffi/fixtures/BitmaskTest.c +51 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
- data/spec/ffi/struct_spec.rb +0 -4
- metadata +158 -32
- data/ext/ffi_c/libffi/Makefile.vc +0 -141
- data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
- data/ext/ffi_c/libffi/build-ios.sh +0 -67
- data/ext/ffi_c/libffi/doc/libffi.info +0 -593
- data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
- data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
- data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
- data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
- data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
- data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
- data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
- data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
- data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
@@ -0,0 +1,52 @@
|
|
1
|
+
/* libffi target includes for Altera Nios II.
|
2
|
+
|
3
|
+
Copyright (c) 2013 Mentor Graphics.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
``Software''), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
23
|
+
|
24
|
+
|
25
|
+
#ifndef LIBFFI_TARGET_H
|
26
|
+
#define LIBFFI_TARGET_H
|
27
|
+
|
28
|
+
#ifndef LIBFFI_H
|
29
|
+
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
30
|
+
#endif
|
31
|
+
|
32
|
+
#ifndef LIBFFI_ASM
|
33
|
+
typedef unsigned long ffi_arg;
|
34
|
+
typedef signed long ffi_sarg;
|
35
|
+
|
36
|
+
typedef enum ffi_abi {
|
37
|
+
FFI_FIRST_ABI = 0,
|
38
|
+
FFI_SYSV,
|
39
|
+
FFI_LAST_ABI,
|
40
|
+
FFI_DEFAULT_ABI = FFI_SYSV
|
41
|
+
} ffi_abi;
|
42
|
+
#endif
|
43
|
+
|
44
|
+
/* Structures have a 4-byte alignment even if all the fields have lesser
|
45
|
+
alignment requirements. */
|
46
|
+
#define FFI_AGGREGATE_ALIGNMENT 4
|
47
|
+
|
48
|
+
#define FFI_CLOSURES 1
|
49
|
+
#define FFI_TRAMPOLINE_SIZE 28 /* 7 instructions */
|
50
|
+
#define FFI_NATIVE_RAW_API 0
|
51
|
+
|
52
|
+
#endif
|
@@ -0,0 +1,136 @@
|
|
1
|
+
/* Low-level libffi support for Altera Nios II.
|
2
|
+
|
3
|
+
Copyright (c) 2013 Mentor Graphics.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
``Software''), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
23
|
+
|
24
|
+
/* This function is declared on the C side as
|
25
|
+
|
26
|
+
extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *),
|
27
|
+
extended_cif *ecif,
|
28
|
+
unsigned nbytes,
|
29
|
+
void (*fn) (void));
|
30
|
+
|
31
|
+
On input, the arguments appear as
|
32
|
+
r4 = arghook
|
33
|
+
r5 = ecif
|
34
|
+
r6 = nbytes
|
35
|
+
r7 = fn
|
36
|
+
*/
|
37
|
+
|
38
|
+
.section .text
|
39
|
+
.align 2
|
40
|
+
.global ffi_call_sysv
|
41
|
+
.type ffi_call_sysv, @function
|
42
|
+
|
43
|
+
ffi_call_sysv:
|
44
|
+
.cfi_startproc
|
45
|
+
|
46
|
+
/* Create the stack frame, saving r16 so we can use it locally. */
|
47
|
+
addi sp, sp, -12
|
48
|
+
.cfi_def_cfa_offset 12
|
49
|
+
stw ra, 8(sp)
|
50
|
+
stw fp, 4(sp)
|
51
|
+
stw r16, 0(sp)
|
52
|
+
.cfi_offset 31, -4
|
53
|
+
.cfi_offset 28, -8
|
54
|
+
.cfi_offset 16, -12
|
55
|
+
mov fp, sp
|
56
|
+
.cfi_def_cfa_register 28
|
57
|
+
mov r16, r7
|
58
|
+
|
59
|
+
/* Adjust the stack pointer to create the argument buffer
|
60
|
+
nbytes long. */
|
61
|
+
sub sp, sp, r6
|
62
|
+
|
63
|
+
/* Call the arghook function. */
|
64
|
+
mov r2, r4 /* fn */
|
65
|
+
mov r4, sp /* argbuffer */
|
66
|
+
callr r2 /* r5 already contains ecif */
|
67
|
+
|
68
|
+
/* Pop off the first 16 bytes of the argument buffer on the stack,
|
69
|
+
transferring the contents to the argument registers. */
|
70
|
+
ldw r4, 0(sp)
|
71
|
+
ldw r5, 4(sp)
|
72
|
+
ldw r6, 8(sp)
|
73
|
+
ldw r7, 12(sp)
|
74
|
+
addi sp, sp, 16
|
75
|
+
|
76
|
+
/* Call the user function, which leaves its result in r2 and r3. */
|
77
|
+
callr r16
|
78
|
+
|
79
|
+
/* Pop off the stack frame. */
|
80
|
+
mov sp, fp
|
81
|
+
ldw ra, 8(sp)
|
82
|
+
ldw fp, 4(sp)
|
83
|
+
ldw r16, 0(sp)
|
84
|
+
addi sp, sp, 12
|
85
|
+
ret
|
86
|
+
.cfi_endproc
|
87
|
+
.size ffi_call_sysv, .-ffi_call_sysv
|
88
|
+
|
89
|
+
|
90
|
+
/* Closure trampolines jump here after putting the C helper address
|
91
|
+
in r9 and the closure pointer in r10. The user-supplied arguments
|
92
|
+
to the closure are in the normal places, in r4-r7 and on the
|
93
|
+
stack. Push the register arguments on the stack too and then call the
|
94
|
+
C helper function to deal with them. */
|
95
|
+
|
96
|
+
.section .text
|
97
|
+
.align 2
|
98
|
+
.global ffi_closure_sysv
|
99
|
+
.type ffi_closure_sysv, @function
|
100
|
+
|
101
|
+
ffi_closure_sysv:
|
102
|
+
.cfi_startproc
|
103
|
+
|
104
|
+
/* Create the stack frame, pushing the register args on the stack
|
105
|
+
just below the stack args. This is the same trick illustrated
|
106
|
+
in Figure 7-3 in the Nios II Processor Reference Handbook, used
|
107
|
+
for variable arguments and structures passed by value. */
|
108
|
+
addi sp, sp, -20
|
109
|
+
.cfi_def_cfa_offset 20
|
110
|
+
stw ra, 0(sp)
|
111
|
+
.cfi_offset 31, -20
|
112
|
+
stw r4, 4(sp)
|
113
|
+
.cfi_offset 4, -16
|
114
|
+
stw r5, 8(sp)
|
115
|
+
.cfi_offset 5, -12
|
116
|
+
stw r6, 12(sp)
|
117
|
+
.cfi_offset 6, -8
|
118
|
+
stw r7, 16(sp)
|
119
|
+
.cfi_offset 7, -4
|
120
|
+
|
121
|
+
/* Call the helper.
|
122
|
+
r4 = pointer to arguments on stack
|
123
|
+
r5 = closure pointer (loaded in r10 by the trampoline)
|
124
|
+
r9 = address of helper function (loaded by trampoline) */
|
125
|
+
addi r4, sp, 4
|
126
|
+
mov r5, r10
|
127
|
+
callr r9
|
128
|
+
|
129
|
+
/* Pop the stack and return. */
|
130
|
+
ldw ra, 0(sp)
|
131
|
+
addi sp, sp, 20
|
132
|
+
.cfi_def_cfa_offset -20
|
133
|
+
ret
|
134
|
+
.cfi_endproc
|
135
|
+
.size ffi_closure_sysv, .-ffi_closure_sysv
|
136
|
+
|
@@ -0,0 +1,328 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
ffi.c - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de>
|
3
|
+
|
4
|
+
OpenRISC Foreign Function Interface
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
``Software''), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be included
|
15
|
+
in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
21
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
22
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
24
|
+
DEALINGS IN THE SOFTWARE.
|
25
|
+
----------------------------------------------------------------------- */
|
26
|
+
|
27
|
+
#include <ffi.h>
|
28
|
+
#include "ffi_common.h"
|
29
|
+
|
30
|
+
/* ffi_prep_args is called by the assembly routine once stack space
|
31
|
+
has been allocated for the function's arguments */
|
32
|
+
|
33
|
+
void* ffi_prep_args(char *stack, extended_cif *ecif)
|
34
|
+
{
|
35
|
+
char *stacktemp = stack;
|
36
|
+
int i, s;
|
37
|
+
ffi_type **arg;
|
38
|
+
int count = 0;
|
39
|
+
int nfixedargs;
|
40
|
+
|
41
|
+
nfixedargs = ecif->cif->nfixedargs;
|
42
|
+
arg = ecif->cif->arg_types;
|
43
|
+
void **argv = ecif->avalue;
|
44
|
+
|
45
|
+
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
|
46
|
+
{
|
47
|
+
*(void **) stack = ecif->rvalue;
|
48
|
+
stack += 4;
|
49
|
+
count = 4;
|
50
|
+
}
|
51
|
+
for(i=0; i<ecif->cif->nargs; i++)
|
52
|
+
{
|
53
|
+
|
54
|
+
/* variadic args are saved on stack */
|
55
|
+
if ((nfixedargs == 0) && (count < 24))
|
56
|
+
{
|
57
|
+
count = 24;
|
58
|
+
stack = stacktemp + 24;
|
59
|
+
}
|
60
|
+
nfixedargs--;
|
61
|
+
|
62
|
+
s = 4;
|
63
|
+
switch((*arg)->type)
|
64
|
+
{
|
65
|
+
case FFI_TYPE_STRUCT:
|
66
|
+
*(void **)stack = *argv;
|
67
|
+
break;
|
68
|
+
|
69
|
+
case FFI_TYPE_SINT8:
|
70
|
+
*(signed int *) stack = (signed int)*(SINT8 *)(* argv);
|
71
|
+
break;
|
72
|
+
|
73
|
+
case FFI_TYPE_UINT8:
|
74
|
+
*(unsigned int *) stack = (unsigned int)*(UINT8 *)(* argv);
|
75
|
+
break;
|
76
|
+
|
77
|
+
case FFI_TYPE_SINT16:
|
78
|
+
*(signed int *) stack = (signed int)*(SINT16 *)(* argv);
|
79
|
+
break;
|
80
|
+
|
81
|
+
case FFI_TYPE_UINT16:
|
82
|
+
*(unsigned int *) stack = (unsigned int)*(UINT16 *)(* argv);
|
83
|
+
break;
|
84
|
+
|
85
|
+
case FFI_TYPE_SINT32:
|
86
|
+
case FFI_TYPE_UINT32:
|
87
|
+
case FFI_TYPE_FLOAT:
|
88
|
+
case FFI_TYPE_POINTER:
|
89
|
+
*(int *)stack = *(int*)(*argv);
|
90
|
+
break;
|
91
|
+
|
92
|
+
default: /* 8 byte types */
|
93
|
+
if (count == 20) /* never split arguments */
|
94
|
+
{
|
95
|
+
stack += 4;
|
96
|
+
count += 4;
|
97
|
+
}
|
98
|
+
s = (*arg)->size;
|
99
|
+
memcpy(stack, *argv, s);
|
100
|
+
break;
|
101
|
+
}
|
102
|
+
|
103
|
+
stack += s;
|
104
|
+
count += s;
|
105
|
+
argv++;
|
106
|
+
arg++;
|
107
|
+
}
|
108
|
+
return stacktemp + ((count>24)?24:0);
|
109
|
+
}
|
110
|
+
|
111
|
+
extern void ffi_call_SYSV(unsigned,
|
112
|
+
extended_cif *,
|
113
|
+
void *(*)(int *, extended_cif *),
|
114
|
+
unsigned *,
|
115
|
+
void (*fn)(void),
|
116
|
+
unsigned);
|
117
|
+
|
118
|
+
|
119
|
+
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
120
|
+
{
|
121
|
+
int i;
|
122
|
+
int size;
|
123
|
+
ffi_type **arg;
|
124
|
+
|
125
|
+
/* Calculate size to allocate on stack */
|
126
|
+
|
127
|
+
for(i = 0, arg = cif->arg_types, size=0; i < cif->nargs; i++, arg++)
|
128
|
+
{
|
129
|
+
if ((*arg)->type == FFI_TYPE_STRUCT)
|
130
|
+
size += 4;
|
131
|
+
else
|
132
|
+
if ((*arg)->size <= 4)
|
133
|
+
size += 4;
|
134
|
+
else
|
135
|
+
size += 8;
|
136
|
+
}
|
137
|
+
|
138
|
+
/* for variadic functions more space is needed on the stack */
|
139
|
+
if (cif->nargs != cif->nfixedargs)
|
140
|
+
size += 24;
|
141
|
+
|
142
|
+
if (cif->rtype->type == FFI_TYPE_STRUCT)
|
143
|
+
size += 4;
|
144
|
+
|
145
|
+
|
146
|
+
extended_cif ecif;
|
147
|
+
ecif.cif = cif;
|
148
|
+
ecif.avalue = avalue;
|
149
|
+
ecif.rvalue = rvalue;
|
150
|
+
|
151
|
+
switch (cif->abi)
|
152
|
+
{
|
153
|
+
case FFI_SYSV:
|
154
|
+
ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags);
|
155
|
+
break;
|
156
|
+
default:
|
157
|
+
FFI_ASSERT(0);
|
158
|
+
break;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
|
163
|
+
void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5,
|
164
|
+
unsigned long r6, unsigned long r7, unsigned long r8)
|
165
|
+
{
|
166
|
+
register int *sp __asm__ ("r17");
|
167
|
+
register int *r13 __asm__ ("r13");
|
168
|
+
|
169
|
+
ffi_closure* closure = (ffi_closure*) r13;
|
170
|
+
char *stack_args = sp;
|
171
|
+
|
172
|
+
/* Lay the register arguments down in a continuous chunk of memory. */
|
173
|
+
unsigned register_args[6] =
|
174
|
+
{ r3, r4, r5, r6, r7, r8 };
|
175
|
+
|
176
|
+
/* Pointer to a struct return value. */
|
177
|
+
void *struct_rvalue = (void *) r3;
|
178
|
+
|
179
|
+
ffi_cif *cif = closure->cif;
|
180
|
+
ffi_type **arg_types = cif->arg_types;
|
181
|
+
void **avalue = alloca (cif->nargs * sizeof(void *));
|
182
|
+
char *ptr = (char *) register_args;
|
183
|
+
int count = 0;
|
184
|
+
int nfixedargs = cif->nfixedargs;
|
185
|
+
int i;
|
186
|
+
|
187
|
+
/* preserve struct type return pointer passing */
|
188
|
+
|
189
|
+
if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
|
190
|
+
{
|
191
|
+
ptr += 4;
|
192
|
+
count = 4;
|
193
|
+
}
|
194
|
+
|
195
|
+
/* Find the address of each argument. */
|
196
|
+
for (i = 0; i < cif->nargs; i++)
|
197
|
+
{
|
198
|
+
|
199
|
+
/* variadic args are saved on stack */
|
200
|
+
if ((nfixedargs == 0) && (count < 24))
|
201
|
+
{
|
202
|
+
ptr = stack_args;
|
203
|
+
count = 24;
|
204
|
+
}
|
205
|
+
nfixedargs--;
|
206
|
+
|
207
|
+
switch (arg_types[i]->type)
|
208
|
+
{
|
209
|
+
case FFI_TYPE_SINT8:
|
210
|
+
case FFI_TYPE_UINT8:
|
211
|
+
avalue[i] = ptr + 3;
|
212
|
+
break;
|
213
|
+
|
214
|
+
case FFI_TYPE_SINT16:
|
215
|
+
case FFI_TYPE_UINT16:
|
216
|
+
avalue[i] = ptr + 2;
|
217
|
+
break;
|
218
|
+
|
219
|
+
case FFI_TYPE_SINT32:
|
220
|
+
case FFI_TYPE_UINT32:
|
221
|
+
case FFI_TYPE_FLOAT:
|
222
|
+
case FFI_TYPE_POINTER:
|
223
|
+
avalue[i] = ptr;
|
224
|
+
break;
|
225
|
+
|
226
|
+
case FFI_TYPE_STRUCT:
|
227
|
+
avalue[i] = *(void**)ptr;
|
228
|
+
break;
|
229
|
+
|
230
|
+
default:
|
231
|
+
/* 8-byte values */
|
232
|
+
|
233
|
+
/* arguments are never splitted */
|
234
|
+
if (ptr == ®ister_args[5])
|
235
|
+
ptr = stack_args;
|
236
|
+
avalue[i] = ptr;
|
237
|
+
ptr += 4;
|
238
|
+
count += 4;
|
239
|
+
break;
|
240
|
+
}
|
241
|
+
ptr += 4;
|
242
|
+
count += 4;
|
243
|
+
|
244
|
+
/* If we've handled more arguments than fit in registers,
|
245
|
+
start looking at the those passed on the stack. */
|
246
|
+
|
247
|
+
if (count == 24)
|
248
|
+
ptr = stack_args;
|
249
|
+
}
|
250
|
+
|
251
|
+
if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT))
|
252
|
+
{
|
253
|
+
(closure->fun) (cif, struct_rvalue, avalue, closure->user_data);
|
254
|
+
} else
|
255
|
+
{
|
256
|
+
long long rvalue;
|
257
|
+
(closure->fun) (cif, &rvalue, avalue, closure->user_data);
|
258
|
+
if (cif->rtype)
|
259
|
+
asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue));
|
260
|
+
}
|
261
|
+
}
|
262
|
+
|
263
|
+
|
264
|
+
ffi_status
|
265
|
+
ffi_prep_closure_loc (ffi_closure* closure,
|
266
|
+
ffi_cif* cif,
|
267
|
+
void (*fun)(ffi_cif*,void*,void**,void*),
|
268
|
+
void *user_data,
|
269
|
+
void *codeloc)
|
270
|
+
{
|
271
|
+
unsigned short *tramp = (unsigned short *) closure->tramp;
|
272
|
+
unsigned long fn = (unsigned long) ffi_closure_SYSV;
|
273
|
+
unsigned long cls = (unsigned long) codeloc;
|
274
|
+
|
275
|
+
if (cif->abi != FFI_SYSV)
|
276
|
+
return FFI_BAD_ABI;
|
277
|
+
|
278
|
+
closure->cif = cif;
|
279
|
+
closure->user_data = user_data;
|
280
|
+
closure->fun = fun;
|
281
|
+
|
282
|
+
/* write pointers to temporary registers */
|
283
|
+
tramp[0] = (0x6 << 10) | (13 << 5); /* l.movhi r13, ... */
|
284
|
+
tramp[1] = cls >> 16;
|
285
|
+
tramp[2] = (0x2a << 10) | (13 << 5) | 13; /* l.ori r13, r13, ... */
|
286
|
+
tramp[3] = cls & 0xFFFF;
|
287
|
+
|
288
|
+
tramp[4] = (0x6 << 10) | (15 << 5); /* l.movhi r15, ... */
|
289
|
+
tramp[5] = fn >> 16;
|
290
|
+
tramp[6] = (0x2a << 10) | (15 << 5) | 15; /* l.ori r15, r15 ... */
|
291
|
+
tramp[7] = fn & 0xFFFF;
|
292
|
+
|
293
|
+
tramp[8] = (0x11 << 10); /* l.jr r15 */
|
294
|
+
tramp[9] = 15 << 11;
|
295
|
+
|
296
|
+
tramp[10] = (0x2a << 10) | (17 << 5) | 1; /* l.ori r17, r1, ... */
|
297
|
+
tramp[11] = 0x0;
|
298
|
+
|
299
|
+
return FFI_OK;
|
300
|
+
}
|
301
|
+
|
302
|
+
|
303
|
+
ffi_status ffi_prep_cif_machdep (ffi_cif *cif)
|
304
|
+
{
|
305
|
+
cif->flags = 0;
|
306
|
+
|
307
|
+
/* structures are returned as pointers */
|
308
|
+
if (cif->rtype->type == FFI_TYPE_STRUCT)
|
309
|
+
cif->flags = FFI_TYPE_STRUCT;
|
310
|
+
else
|
311
|
+
if (cif->rtype->size > 4)
|
312
|
+
cif->flags = FFI_TYPE_UINT64;
|
313
|
+
|
314
|
+
cif->nfixedargs = cif->nargs;
|
315
|
+
|
316
|
+
return FFI_OK;
|
317
|
+
}
|
318
|
+
|
319
|
+
|
320
|
+
ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
|
321
|
+
unsigned int nfixedargs, unsigned int ntotalargs)
|
322
|
+
{
|
323
|
+
ffi_status status;
|
324
|
+
|
325
|
+
status = ffi_prep_cif_machdep (cif);
|
326
|
+
cif->nfixedargs = nfixedargs;
|
327
|
+
return status;
|
328
|
+
}
|