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
@@ -1,5 +1,6 @@
|
|
1
1
|
/* -----------------------------------------------------------------*-C-*-
|
2
|
-
|
2
|
+
ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd.
|
3
|
+
Target configuration macros for Meta
|
3
4
|
|
4
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
5
6
|
a copy of this software and associated documentation files (the
|
@@ -23,35 +24,30 @@
|
|
23
24
|
|
24
25
|
----------------------------------------------------------------------- */
|
25
26
|
|
26
|
-
|
27
|
+
#ifndef LIBFFI_TARGET_H
|
28
|
+
#define LIBFFI_TARGET_H
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
#
|
31
|
-
#define LIBFFICONFIG_H
|
30
|
+
#ifndef LIBFFI_H
|
31
|
+
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
32
|
+
#endif
|
32
33
|
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
#define HAVE_STDLIB_H 1
|
37
|
-
#define HAVE_STRING_H 1
|
38
|
-
#define HAVE_SYS_STAT_H 1
|
39
|
-
#define HAVE_SYS_TYPES_H 1
|
40
|
-
#define STDC_HEADERS 1
|
34
|
+
#ifndef LIBFFI_ASM
|
35
|
+
typedef unsigned long ffi_arg;
|
36
|
+
typedef signed long ffi_sarg;
|
41
37
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
typedef enum ffi_abi {
|
39
|
+
FFI_FIRST_ABI = 0,
|
40
|
+
FFI_SYSV,
|
41
|
+
FFI_DEFAULT_ABI = FFI_SYSV,
|
42
|
+
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1,
|
43
|
+
} ffi_abi;
|
48
44
|
#endif
|
49
45
|
|
50
|
-
|
51
|
-
#define FFI_HIDDEN(name)
|
52
|
-
#else
|
53
|
-
#define FFI_HIDDEN
|
54
|
-
#endif
|
46
|
+
/* ---- Definitions for closures ----------------------------------------- */
|
55
47
|
|
56
|
-
#
|
48
|
+
#define FFI_CLOSURES 1
|
49
|
+
#define FFI_TRAMPOLINE_SIZE 48
|
50
|
+
#define FFI_NATIVE_RAW_API 0
|
51
|
+
|
52
|
+
#endif
|
57
53
|
|
@@ -0,0 +1,311 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
sysv.S - Copyright (c) 2013 Imagination Technologies Ltd.
|
3
|
+
|
4
|
+
Meta 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
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
22
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
23
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
25
|
+
DEALINGS IN THE SOFTWARE.
|
26
|
+
----------------------------------------------------------------------- */
|
27
|
+
|
28
|
+
#define LIBFFI_ASM
|
29
|
+
#include <fficonfig.h>
|
30
|
+
#include <ffi.h>
|
31
|
+
#ifdef HAVE_MACHINE_ASM_H
|
32
|
+
#include <machine/asm.h>
|
33
|
+
#else
|
34
|
+
#ifdef __USER_LABEL_PREFIX__
|
35
|
+
#define CONCAT1(a, b) CONCAT2(a, b)
|
36
|
+
#define CONCAT2(a, b) a ## b
|
37
|
+
|
38
|
+
/* Use the right prefix for global labels. */
|
39
|
+
#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
|
40
|
+
#else
|
41
|
+
#define CNAME(x) x
|
42
|
+
#endif
|
43
|
+
#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x):
|
44
|
+
#endif
|
45
|
+
|
46
|
+
#ifdef __ELF__
|
47
|
+
#define LSYM(x) .x
|
48
|
+
#else
|
49
|
+
#define LSYM(x) x
|
50
|
+
#endif
|
51
|
+
|
52
|
+
.macro call_reg x=
|
53
|
+
.text
|
54
|
+
.balign 4
|
55
|
+
mov D1RtP, \x
|
56
|
+
swap D1RtP, PC
|
57
|
+
.endm
|
58
|
+
|
59
|
+
! Save register arguments
|
60
|
+
.macro SAVE_ARGS
|
61
|
+
.text
|
62
|
+
.balign 4
|
63
|
+
setl [A0StP++], D0Ar6, D1Ar5
|
64
|
+
setl [A0StP++], D0Ar4, D1Ar3
|
65
|
+
setl [A0StP++], D0Ar2, D1Ar1
|
66
|
+
.endm
|
67
|
+
|
68
|
+
! Save retrun, frame pointer and other regs
|
69
|
+
.macro SAVE_REGS regs=
|
70
|
+
.text
|
71
|
+
.balign 4
|
72
|
+
setl [A0StP++], D0FrT, D1RtP
|
73
|
+
! Needs to be a pair of regs
|
74
|
+
.ifnc "\regs",""
|
75
|
+
setl [A0StP++], \regs
|
76
|
+
.endif
|
77
|
+
.endm
|
78
|
+
|
79
|
+
! Declare a global function
|
80
|
+
.macro METAG_FUNC_START name
|
81
|
+
.text
|
82
|
+
.balign 4
|
83
|
+
ENTRY(\name)
|
84
|
+
.endm
|
85
|
+
|
86
|
+
! Return registers from the stack. Reverse SAVE_REGS operation
|
87
|
+
.macro RET_REGS regs=, cond=
|
88
|
+
.ifnc "\regs", ""
|
89
|
+
getl \regs, [--A0StP]
|
90
|
+
.endif
|
91
|
+
getl D0FrT, D1RtP, [--A0StP]
|
92
|
+
.endm
|
93
|
+
|
94
|
+
! Return arguments
|
95
|
+
.macro RET_ARGS
|
96
|
+
getl D0Ar2, D1Ar1, [--A0StP]
|
97
|
+
getl D0Ar4, D1Ar3, [--A0StP]
|
98
|
+
getl D0Ar6, D1Ar5, [--A0StP]
|
99
|
+
.endm
|
100
|
+
|
101
|
+
|
102
|
+
! D1Ar1: fn
|
103
|
+
! D0Ar2: &ecif
|
104
|
+
! D1Ar3: cif->bytes
|
105
|
+
! D0Ar4: fig->flags
|
106
|
+
! D1Ar5: ecif.rvalue
|
107
|
+
|
108
|
+
! This assumes we are using GNU as
|
109
|
+
METAG_FUNC_START ffi_call_SYSV
|
110
|
+
! Save argument registers
|
111
|
+
|
112
|
+
SAVE_ARGS
|
113
|
+
|
114
|
+
! new frame
|
115
|
+
mov D0FrT, A0FrP
|
116
|
+
add A0FrP, A0StP, #0
|
117
|
+
|
118
|
+
! Preserve the old frame pointer
|
119
|
+
SAVE_REGS "D1.5, D0.5"
|
120
|
+
|
121
|
+
! Make room for new args. cifs->bytes is the total space for input
|
122
|
+
! and return arguments
|
123
|
+
|
124
|
+
add A0StP, A0StP, D1Ar3
|
125
|
+
|
126
|
+
! Preserve cifs->bytes & fn
|
127
|
+
mov D0.5, D1Ar3
|
128
|
+
mov D1.5, D1Ar1
|
129
|
+
|
130
|
+
! Place all of the ffi_prep_args in position
|
131
|
+
mov D1Ar1, A0StP
|
132
|
+
|
133
|
+
! Call ffi_prep_args(stack, &ecif)
|
134
|
+
#ifdef __PIC__
|
135
|
+
callr D1RtP, CNAME(ffi_prep_args@PLT)
|
136
|
+
#else
|
137
|
+
callr D1RtP, CNAME(ffi_prep_args)
|
138
|
+
#endif
|
139
|
+
|
140
|
+
! Restore fn pointer
|
141
|
+
|
142
|
+
! The foreign stack should look like this
|
143
|
+
! XXXXX XXXXXX <--- stack pointer
|
144
|
+
! FnArgN rvalue
|
145
|
+
! FnArgN+2 FnArgN+1
|
146
|
+
! FnArgN+4 FnArgN+3
|
147
|
+
! ....
|
148
|
+
!
|
149
|
+
|
150
|
+
! A0StP now points to the first (or return) argument + 4
|
151
|
+
|
152
|
+
! Preserve cif->bytes
|
153
|
+
getl D0Ar2, D1Ar1, [--A0StP]
|
154
|
+
getl D0Ar4, D1Ar3, [--A0StP]
|
155
|
+
getl D0Ar6, D1Ar5, [--A0StP]
|
156
|
+
|
157
|
+
! Place A0StP to the first argument again
|
158
|
+
add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each
|
159
|
+
|
160
|
+
! A0FrP points to the initial stack without the reserved space for the
|
161
|
+
! cifs->bytes, whilst A0StP points to the stack after the space allocation
|
162
|
+
|
163
|
+
! fn was the first argument of ffi_call_SYSV.
|
164
|
+
! The stack at this point looks like this:
|
165
|
+
!
|
166
|
+
! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low
|
167
|
+
! Arg4 Arg3 |
|
168
|
+
! Arg2 Arg1 |
|
169
|
+
! A0FrP ----> D0FrtP D1RtP |
|
170
|
+
! D1.5 D0.5 |
|
171
|
+
! A0StP(bf prep_args) -> FnArgn FnArgn-1 |
|
172
|
+
! FnArgn-2FnArgn-3 |
|
173
|
+
! ................ | <= cifs->bytes
|
174
|
+
! FnArg4 FnArg3 |
|
175
|
+
! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high
|
176
|
+
!
|
177
|
+
! fn was in Arg1 so it's located in in A0FrP+#-0xC
|
178
|
+
!
|
179
|
+
|
180
|
+
! D0Re0 contains the size of arguments stored in registers
|
181
|
+
sub A0StP, A0StP, D0Re0
|
182
|
+
|
183
|
+
! Arg1 is the function pointer for the foreign call. This has been
|
184
|
+
! preserved in D1.5
|
185
|
+
|
186
|
+
! Time to call (fn). Arguments should be like this:
|
187
|
+
! Arg1-Arg6 are loaded to regs
|
188
|
+
! The rest of the arguments are stored in stack pointed by A0StP
|
189
|
+
|
190
|
+
call_reg D1.5
|
191
|
+
|
192
|
+
! Reset stack.
|
193
|
+
|
194
|
+
mov A0StP, A0FrP
|
195
|
+
|
196
|
+
! Load Arg1 with the pointer to storage for the return type
|
197
|
+
! This was stored in Arg5
|
198
|
+
|
199
|
+
getd D1Ar1, [A0FrP+#-20]
|
200
|
+
|
201
|
+
! Load D0Ar2 with the return type code. This was stored in Arg4 (flags)
|
202
|
+
|
203
|
+
getd D0Ar2, [A0FrP+#-16]
|
204
|
+
|
205
|
+
! We are ready to start processing the return value
|
206
|
+
! D0Re0 (and D1Re0) hold the return value
|
207
|
+
|
208
|
+
! If the return value is NULL, assume no return value
|
209
|
+
cmp D1Ar1, #0
|
210
|
+
beq LSYM(Lepilogue)
|
211
|
+
|
212
|
+
! return INT
|
213
|
+
cmp D0Ar2, #FFI_TYPE_INT
|
214
|
+
! Sadly, there is no setd{cc} instruction so we need to workaround that
|
215
|
+
bne .INT64
|
216
|
+
setd [D1Ar1], D0Re0
|
217
|
+
b LSYM(Lepilogue)
|
218
|
+
|
219
|
+
! return INT64
|
220
|
+
.INT64:
|
221
|
+
cmp D0Ar2, #FFI_TYPE_SINT64
|
222
|
+
setleq [D1Ar1], D0Re0, D1Re0
|
223
|
+
|
224
|
+
! return DOUBLE
|
225
|
+
cmp D0Ar2, #FFI_TYPE_DOUBLE
|
226
|
+
setl [D1AR1++], D0Re0, D1Re0
|
227
|
+
|
228
|
+
LSYM(Lepilogue):
|
229
|
+
! At this point, the stack pointer points right after the argument
|
230
|
+
! saved area. We need to restore 4 regs, therefore we need to move
|
231
|
+
! 16 bytes ahead.
|
232
|
+
add A0StP, A0StP, #16
|
233
|
+
RET_REGS "D1.5, D0.5"
|
234
|
+
RET_ARGS
|
235
|
+
getd D0Re0, [A0StP]
|
236
|
+
mov A0FrP, D0FrT
|
237
|
+
swap D1RtP, PC
|
238
|
+
|
239
|
+
.ffi_call_SYSV_end:
|
240
|
+
.size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
|
241
|
+
|
242
|
+
|
243
|
+
/*
|
244
|
+
(called by ffi_metag_trampoline)
|
245
|
+
void ffi_closure_SYSV (ffi_closure*)
|
246
|
+
|
247
|
+
(called by ffi_closure_SYSV)
|
248
|
+
unsigned int FFI_HIDDEN
|
249
|
+
ffi_closure_SYSV_inner (closure,respp, args)
|
250
|
+
ffi_closure *closure;
|
251
|
+
void **respp;
|
252
|
+
void *args;
|
253
|
+
*/
|
254
|
+
|
255
|
+
METAG_FUNC_START ffi_closure_SYSV
|
256
|
+
! We assume that D1Ar1 holds the address of the
|
257
|
+
! ffi_closure struct. We will use that to fetch the
|
258
|
+
! arguments. The stack pointer points to an empty space
|
259
|
+
! and it is ready to store more data.
|
260
|
+
|
261
|
+
! D1Ar1 is ready
|
262
|
+
! Allocate stack space for return value
|
263
|
+
add A0StP, A0StP, #8
|
264
|
+
! Store it to D0Ar2
|
265
|
+
sub D0Ar2, A0StP, #8
|
266
|
+
|
267
|
+
sub D1Ar3, A0FrP, #4
|
268
|
+
|
269
|
+
! D1Ar3 contains the address of the original D1Ar1 argument
|
270
|
+
! We need to subtract #4 later on
|
271
|
+
|
272
|
+
! Preverve D0Ar2
|
273
|
+
mov D0.5, D0Ar2
|
274
|
+
|
275
|
+
#ifdef __PIC__
|
276
|
+
callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT)
|
277
|
+
#else
|
278
|
+
callr D1RtP, CNAME(ffi_closure_SYSV_inner)
|
279
|
+
#endif
|
280
|
+
|
281
|
+
! Check the return value and store it to D0.5
|
282
|
+
cmp D0Re0, #FFI_TYPE_INT
|
283
|
+
beq .Lretint
|
284
|
+
cmp D0Re0, #FFI_TYPE_DOUBLE
|
285
|
+
beq .Lretdouble
|
286
|
+
.Lclosure_epilogue:
|
287
|
+
sub A0StP, A0StP, #8
|
288
|
+
RET_REGS "D1.5, D0.5"
|
289
|
+
RET_ARGS
|
290
|
+
swap D1RtP, PC
|
291
|
+
|
292
|
+
.Lretint:
|
293
|
+
setd [D0.5], D0Re0
|
294
|
+
b .Lclosure_epilogue
|
295
|
+
.Lretdouble:
|
296
|
+
setl [D0.5++], D0Re0, D1Re0
|
297
|
+
b .Lclosure_epilogue
|
298
|
+
.ffi_closure_SYSV_end:
|
299
|
+
.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
|
300
|
+
|
301
|
+
|
302
|
+
ENTRY(ffi_metag_trampoline)
|
303
|
+
SAVE_ARGS
|
304
|
+
! New frame
|
305
|
+
mov A0FrP, A0StP
|
306
|
+
SAVE_REGS "D1.5, D0.5"
|
307
|
+
mov D0.5, PC
|
308
|
+
! Load D1Ar1 the value of ffi_metag_trampoline
|
309
|
+
getd D1Ar1, [D0.5 + #8]
|
310
|
+
! Jump to ffi_closure_SYSV
|
311
|
+
getd PC, [D0.5 + #12]
|
@@ -0,0 +1,321 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc
|
3
|
+
|
4
|
+
MicroBlaze 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
|
+
extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*,
|
31
|
+
unsigned int, unsigned int, unsigned int*, void (*fn)(void),
|
32
|
+
unsigned int, unsigned int);
|
33
|
+
|
34
|
+
extern void ffi_closure_SYSV(void);
|
35
|
+
|
36
|
+
#define WORD_SIZE sizeof(unsigned int)
|
37
|
+
#define ARGS_REGISTER_SIZE (WORD_SIZE * 6)
|
38
|
+
#define WORD_FFI_ALIGN(x) FFI_ALIGN(x, WORD_SIZE)
|
39
|
+
|
40
|
+
/* ffi_prep_args is called by the assembly routine once stack space
|
41
|
+
has been allocated for the function's arguments */
|
42
|
+
void ffi_prep_args(void* stack, extended_cif* ecif)
|
43
|
+
{
|
44
|
+
unsigned int i;
|
45
|
+
ffi_type** p_arg;
|
46
|
+
void** p_argv;
|
47
|
+
void* stack_args_p = stack;
|
48
|
+
|
49
|
+
if (ecif == NULL || ecif->cif == NULL) {
|
50
|
+
return; /* no description to prepare */
|
51
|
+
}
|
52
|
+
|
53
|
+
p_argv = ecif->avalue;
|
54
|
+
|
55
|
+
if ((ecif->cif->rtype != NULL) &&
|
56
|
+
(ecif->cif->rtype->type == FFI_TYPE_STRUCT))
|
57
|
+
{
|
58
|
+
/* if return type is a struct which is referenced on the stack/reg5,
|
59
|
+
* by a pointer. Stored the return value pointer in r5.
|
60
|
+
*/
|
61
|
+
char* addr = stack_args_p;
|
62
|
+
memcpy(addr, &(ecif->rvalue), WORD_SIZE);
|
63
|
+
stack_args_p += WORD_SIZE;
|
64
|
+
}
|
65
|
+
|
66
|
+
if (ecif->avalue == NULL) {
|
67
|
+
return; /* no arguments to prepare */
|
68
|
+
}
|
69
|
+
|
70
|
+
for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
|
71
|
+
i++, p_arg++)
|
72
|
+
{
|
73
|
+
size_t size = (*p_arg)->size;
|
74
|
+
int type = (*p_arg)->type;
|
75
|
+
void* value = p_argv[i];
|
76
|
+
char* addr = stack_args_p;
|
77
|
+
int aligned_size = WORD_FFI_ALIGN(size);
|
78
|
+
|
79
|
+
/* force word alignment on the stack */
|
80
|
+
stack_args_p += aligned_size;
|
81
|
+
|
82
|
+
switch (type)
|
83
|
+
{
|
84
|
+
case FFI_TYPE_UINT8:
|
85
|
+
*(unsigned int *)addr = (unsigned int)*(UINT8*)(value);
|
86
|
+
break;
|
87
|
+
case FFI_TYPE_SINT8:
|
88
|
+
*(signed int *)addr = (signed int)*(SINT8*)(value);
|
89
|
+
break;
|
90
|
+
case FFI_TYPE_UINT16:
|
91
|
+
*(unsigned int *)addr = (unsigned int)*(UINT16*)(value);
|
92
|
+
break;
|
93
|
+
case FFI_TYPE_SINT16:
|
94
|
+
*(signed int *)addr = (signed int)*(SINT16*)(value);
|
95
|
+
break;
|
96
|
+
case FFI_TYPE_STRUCT:
|
97
|
+
#if __BIG_ENDIAN__
|
98
|
+
/*
|
99
|
+
* MicroBlaze toolchain appears to emit:
|
100
|
+
* bsrli r5, r5, 8 (caller)
|
101
|
+
* ...
|
102
|
+
* <branch to callee>
|
103
|
+
* ...
|
104
|
+
* bslli r5, r5, 8 (callee)
|
105
|
+
*
|
106
|
+
* For structs like "struct a { uint8_t a[3]; };", when passed
|
107
|
+
* by value.
|
108
|
+
*
|
109
|
+
* Structs like "struct b { uint16_t a; };" are also expected
|
110
|
+
* to be packed strangely in registers.
|
111
|
+
*
|
112
|
+
* This appears to be because the microblaze toolchain expects
|
113
|
+
* "struct b == uint16_t", which is only any issue for big
|
114
|
+
* endian.
|
115
|
+
*
|
116
|
+
* The following is a work around for big-endian only, for the
|
117
|
+
* above mentioned case, it will re-align the contents of a
|
118
|
+
* <= 3-byte struct value.
|
119
|
+
*/
|
120
|
+
if (size < WORD_SIZE)
|
121
|
+
{
|
122
|
+
memcpy (addr + (WORD_SIZE - size), value, size);
|
123
|
+
break;
|
124
|
+
}
|
125
|
+
#endif
|
126
|
+
case FFI_TYPE_SINT32:
|
127
|
+
case FFI_TYPE_UINT32:
|
128
|
+
case FFI_TYPE_FLOAT:
|
129
|
+
case FFI_TYPE_SINT64:
|
130
|
+
case FFI_TYPE_UINT64:
|
131
|
+
case FFI_TYPE_DOUBLE:
|
132
|
+
default:
|
133
|
+
memcpy(addr, value, aligned_size);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
ffi_status ffi_prep_cif_machdep(ffi_cif* cif)
|
139
|
+
{
|
140
|
+
/* check ABI */
|
141
|
+
switch (cif->abi)
|
142
|
+
{
|
143
|
+
case FFI_SYSV:
|
144
|
+
break;
|
145
|
+
default:
|
146
|
+
return FFI_BAD_ABI;
|
147
|
+
}
|
148
|
+
return FFI_OK;
|
149
|
+
}
|
150
|
+
|
151
|
+
void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue)
|
152
|
+
{
|
153
|
+
extended_cif ecif;
|
154
|
+
ecif.cif = cif;
|
155
|
+
ecif.avalue = avalue;
|
156
|
+
|
157
|
+
/* If the return value is a struct and we don't have a return */
|
158
|
+
/* value address then we need to make one */
|
159
|
+
if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
|
160
|
+
ecif.rvalue = alloca(cif->rtype->size);
|
161
|
+
} else {
|
162
|
+
ecif.rvalue = rvalue;
|
163
|
+
}
|
164
|
+
|
165
|
+
switch (cif->abi)
|
166
|
+
{
|
167
|
+
case FFI_SYSV:
|
168
|
+
ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags,
|
169
|
+
ecif.rvalue, fn, cif->rtype->type, cif->rtype->size);
|
170
|
+
break;
|
171
|
+
default:
|
172
|
+
FFI_ASSERT(0);
|
173
|
+
break;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
void ffi_closure_call_SYSV(void* register_args, void* stack_args,
|
178
|
+
ffi_closure* closure, void* rvalue,
|
179
|
+
unsigned int* rtype, unsigned int* rsize)
|
180
|
+
{
|
181
|
+
/* prepare arguments for closure call */
|
182
|
+
ffi_cif* cif = closure->cif;
|
183
|
+
ffi_type** arg_types = cif->arg_types;
|
184
|
+
|
185
|
+
/* re-allocate data for the args. This needs to be done in order to keep
|
186
|
+
* multi-word objects (e.g. structs) in contiguous memory. Callers are not
|
187
|
+
* required to store the value of args in the lower 6 words in the stack
|
188
|
+
* (although they are allocated in the stack).
|
189
|
+
*/
|
190
|
+
char* stackclone = alloca(cif->bytes);
|
191
|
+
void** avalue = alloca(cif->nargs * sizeof(void*));
|
192
|
+
void* struct_rvalue = NULL;
|
193
|
+
char* ptr = stackclone;
|
194
|
+
int i;
|
195
|
+
|
196
|
+
/* copy registers into stack clone */
|
197
|
+
int registers_used = cif->bytes;
|
198
|
+
if (registers_used > ARGS_REGISTER_SIZE) {
|
199
|
+
registers_used = ARGS_REGISTER_SIZE;
|
200
|
+
}
|
201
|
+
memcpy(stackclone, register_args, registers_used);
|
202
|
+
|
203
|
+
/* copy stack allocated args into stack clone */
|
204
|
+
if (cif->bytes > ARGS_REGISTER_SIZE) {
|
205
|
+
int stack_used = cif->bytes - ARGS_REGISTER_SIZE;
|
206
|
+
memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used);
|
207
|
+
}
|
208
|
+
|
209
|
+
/* preserve struct type return pointer passing */
|
210
|
+
if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
|
211
|
+
struct_rvalue = *((void**)ptr);
|
212
|
+
ptr += WORD_SIZE;
|
213
|
+
}
|
214
|
+
|
215
|
+
/* populate arg pointer list */
|
216
|
+
for (i = 0; i < cif->nargs; i++)
|
217
|
+
{
|
218
|
+
switch (arg_types[i]->type)
|
219
|
+
{
|
220
|
+
case FFI_TYPE_SINT8:
|
221
|
+
case FFI_TYPE_UINT8:
|
222
|
+
#ifdef __BIG_ENDIAN__
|
223
|
+
avalue[i] = ptr + 3;
|
224
|
+
#else
|
225
|
+
avalue[i] = ptr;
|
226
|
+
#endif
|
227
|
+
break;
|
228
|
+
case FFI_TYPE_SINT16:
|
229
|
+
case FFI_TYPE_UINT16:
|
230
|
+
#ifdef __BIG_ENDIAN__
|
231
|
+
avalue[i] = ptr + 2;
|
232
|
+
#else
|
233
|
+
avalue[i] = ptr;
|
234
|
+
#endif
|
235
|
+
break;
|
236
|
+
case FFI_TYPE_STRUCT:
|
237
|
+
#if __BIG_ENDIAN__
|
238
|
+
/*
|
239
|
+
* Work around strange ABI behaviour.
|
240
|
+
* (see info in ffi_prep_args)
|
241
|
+
*/
|
242
|
+
if (arg_types[i]->size < WORD_SIZE)
|
243
|
+
{
|
244
|
+
memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size);
|
245
|
+
}
|
246
|
+
#endif
|
247
|
+
avalue[i] = (void*)ptr;
|
248
|
+
break;
|
249
|
+
case FFI_TYPE_UINT64:
|
250
|
+
case FFI_TYPE_SINT64:
|
251
|
+
case FFI_TYPE_DOUBLE:
|
252
|
+
avalue[i] = ptr;
|
253
|
+
break;
|
254
|
+
case FFI_TYPE_SINT32:
|
255
|
+
case FFI_TYPE_UINT32:
|
256
|
+
case FFI_TYPE_FLOAT:
|
257
|
+
default:
|
258
|
+
/* default 4-byte argument */
|
259
|
+
avalue[i] = ptr;
|
260
|
+
break;
|
261
|
+
}
|
262
|
+
ptr += WORD_FFI_ALIGN(arg_types[i]->size);
|
263
|
+
}
|
264
|
+
|
265
|
+
/* set the return type info passed back to the wrapper */
|
266
|
+
*rsize = cif->rtype->size;
|
267
|
+
*rtype = cif->rtype->type;
|
268
|
+
if (struct_rvalue != NULL) {
|
269
|
+
closure->fun(cif, struct_rvalue, avalue, closure->user_data);
|
270
|
+
/* copy struct return pointer value into function return value */
|
271
|
+
*((void**)rvalue) = struct_rvalue;
|
272
|
+
} else {
|
273
|
+
closure->fun(cif, rvalue, avalue, closure->user_data);
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
ffi_status ffi_prep_closure_loc(
|
278
|
+
ffi_closure* closure, ffi_cif* cif,
|
279
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
280
|
+
void* user_data, void* codeloc)
|
281
|
+
{
|
282
|
+
unsigned long* tramp = (unsigned long*)&(closure->tramp[0]);
|
283
|
+
unsigned long cls = (unsigned long)codeloc;
|
284
|
+
unsigned long fn = 0;
|
285
|
+
unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV;
|
286
|
+
|
287
|
+
closure->cif = cif;
|
288
|
+
closure->fun = fun;
|
289
|
+
closure->user_data = user_data;
|
290
|
+
|
291
|
+
switch (cif->abi)
|
292
|
+
{
|
293
|
+
case FFI_SYSV:
|
294
|
+
fn = (unsigned long)ffi_closure_SYSV;
|
295
|
+
|
296
|
+
/* load r11 (temp) with fn */
|
297
|
+
/* imm fn(upper) */
|
298
|
+
tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff);
|
299
|
+
/* addik r11, r0, fn(lower) */
|
300
|
+
tramp[1] = 0x31600000 | (fn & 0xffff);
|
301
|
+
|
302
|
+
/* load r12 (temp) with cls */
|
303
|
+
/* imm cls(upper) */
|
304
|
+
tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff);
|
305
|
+
/* addik r12, r0, cls(lower) */
|
306
|
+
tramp[3] = 0x31800000 | (cls & 0xffff);
|
307
|
+
|
308
|
+
/* load r3 (temp) with ffi_closure_call_SYSV */
|
309
|
+
/* imm fn_closure_call_sysv(upper) */
|
310
|
+
tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff);
|
311
|
+
/* addik r3, r0, fn_closure_call_sysv(lower) */
|
312
|
+
tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff);
|
313
|
+
/* branch/jump to address stored in r11 (fn) */
|
314
|
+
tramp[6] = 0x98085800; /* bra r11 */
|
315
|
+
|
316
|
+
break;
|
317
|
+
default:
|
318
|
+
return FFI_BAD_ABI;
|
319
|
+
}
|
320
|
+
return FFI_OK;
|
321
|
+
}
|