ffi 1.9.18 → 1.9.21
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 +4 -4
- data/README.md +3 -2
- data/Rakefile +14 -3
- 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/README +164 -52
- data/ext/ffi_c/libffi/acinclude.m4 +381 -0
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/configure.ac +148 -256
- data/ext/ffi_c/libffi/configure.host +265 -4
- data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- 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/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/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/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/man/Makefile.am +2 -2
- 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/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/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/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/fixtures/BitmaskTest.c +51 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
- data/spec/ffi/struct_spec.rb +0 -4
- metadata +143 -51
- data/ext/ffi_c/libffi/Makefile.in +0 -1820
- data/ext/ffi_c/libffi/Makefile.vc +0 -141
- data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
- data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
- data/ext/ffi_c/libffi/build-ios.sh +0 -67
- data/ext/ffi_c/libffi/compile +0 -143
- data/ext/ffi_c/libffi/config.guess +0 -1501
- data/ext/ffi_c/libffi/config.sub +0 -1705
- data/ext/ffi_c/libffi/configure +0 -17191
- data/ext/ffi_c/libffi/depcomp +0 -630
- 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/fficonfig.h.in +0 -199
- data/ext/ffi_c/libffi/include/Makefile.in +0 -487
- 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/install-sh +0 -520
- data/ext/ffi_c/libffi/ltmain.sh +0 -9636
- data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
- data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
- data/ext/ffi_c/libffi/man/Makefile.in +0 -466
- data/ext/ffi_c/libffi/mdate-sh +0 -201
- data/ext/ffi_c/libffi/missing +0 -376
- 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/Makefile.in +0 -500
- 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
- data/ext/ffi_c/libffi/texinfo.tex +0 -7210
@@ -0,0 +1,237 @@
|
|
1
|
+
#define LIBFFI_ASM
|
2
|
+
#include <fficonfig.h>
|
3
|
+
#include <ffi.h>
|
4
|
+
#include <ffi_cfi.h>
|
5
|
+
#include "asmnames.h"
|
6
|
+
|
7
|
+
#if defined(HAVE_AS_CFI_PSEUDO_OP)
|
8
|
+
.cfi_sections .debug_frame
|
9
|
+
#endif
|
10
|
+
|
11
|
+
#ifdef X86_WIN64
|
12
|
+
#define SEH(...) __VA_ARGS__
|
13
|
+
#define arg0 rcx
|
14
|
+
#define arg1 rdx
|
15
|
+
#define arg2 r8
|
16
|
+
#define arg3 r9
|
17
|
+
#else
|
18
|
+
#define SEH(...)
|
19
|
+
#define arg0 rdi
|
20
|
+
#define arg1 rsi
|
21
|
+
#define arg2 rdx
|
22
|
+
#define arg3 rcx
|
23
|
+
#endif
|
24
|
+
|
25
|
+
/* This macro allows the safe creation of jump tables without an
|
26
|
+
actual table. The entry points into the table are all 8 bytes.
|
27
|
+
The use of ORG asserts that we're at the correct location. */
|
28
|
+
/* ??? The clang assembler doesn't handle .org with symbolic expressions. */
|
29
|
+
#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
|
30
|
+
# define E(BASE, X) ALIGN 8
|
31
|
+
#else
|
32
|
+
# define E(BASE, X) ALIGN 8; ORG BASE + X * 8
|
33
|
+
#endif
|
34
|
+
|
35
|
+
.CODE
|
36
|
+
extern PLT(C(abort)):near
|
37
|
+
extern C(ffi_closure_win64_inner):near
|
38
|
+
|
39
|
+
/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10)
|
40
|
+
|
41
|
+
Bit o trickiness here -- FRAME is the base of the stack frame
|
42
|
+
for this function. This has been allocated by ffi_call. We also
|
43
|
+
deallocate some of the stack that has been alloca'd. */
|
44
|
+
|
45
|
+
ALIGN 8
|
46
|
+
PUBLIC C(ffi_call_win64)
|
47
|
+
|
48
|
+
; SEH(.safesh ffi_call_win64)
|
49
|
+
C(ffi_call_win64) proc SEH(frame)
|
50
|
+
cfi_startproc
|
51
|
+
/* Set up the local stack frame and install it in rbp/rsp. */
|
52
|
+
mov RAX, [RSP] ; movq (%rsp), %rax
|
53
|
+
mov [arg1], RBP ; movq %rbp, (arg1)
|
54
|
+
mov [arg1 + 8], RAX; movq %rax, 8(arg1)
|
55
|
+
mov RBP, arg1; movq arg1, %rbp
|
56
|
+
cfi_def_cfa(rbp, 16)
|
57
|
+
cfi_rel_offset(rbp, 0)
|
58
|
+
SEH(.pushreg rbp)
|
59
|
+
SEH(.setframe rbp, 0)
|
60
|
+
SEH(.endprolog)
|
61
|
+
mov RSP, arg0 ; movq arg0, %rsp
|
62
|
+
|
63
|
+
mov R10, arg2 ; movq arg2, %r10
|
64
|
+
|
65
|
+
/* Load all slots into both general and xmm registers. */
|
66
|
+
mov RCX, [RSP] ; movq (%rsp), %rcx
|
67
|
+
movsd XMM0, qword ptr [RSP] ; movsd (%rsp), %xmm0
|
68
|
+
mov RDX, [RSP + 8] ;movq 8(%rsp), %rdx
|
69
|
+
movsd XMM1, qword ptr [RSP + 8]; movsd 8(%rsp), %xmm1
|
70
|
+
mov R8, [RSP + 16] ; movq 16(%rsp), %r8
|
71
|
+
movsd XMM2, qword ptr [RSP + 16] ; movsd 16(%rsp), %xmm2
|
72
|
+
mov R9, [RSP + 24] ; movq 24(%rsp), %r9
|
73
|
+
movsd XMM3, qword ptr [RSP + 24] ;movsd 24(%rsp), %xmm3
|
74
|
+
|
75
|
+
CALL qword ptr [RBP + 16] ; call *16(%rbp)
|
76
|
+
|
77
|
+
mov ECX, [RBP + 24] ; movl 24(%rbp), %ecx
|
78
|
+
mov R8, [RBP + 32] ; movq 32(%rbp), %r8
|
79
|
+
LEA R10, ffi_call_win64_tab ; leaq 0f(%rip), %r10
|
80
|
+
CMP ECX, FFI_TYPE_SMALL_STRUCT_4B ; cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx
|
81
|
+
LEA R10, [R10 + RCX*8] ; leaq (%r10, %rcx, 8), %r10
|
82
|
+
JA L99 ; ja 99f
|
83
|
+
JMP R10 ; jmp *%r10
|
84
|
+
|
85
|
+
/* Below, we're space constrained most of the time. Thus we eschew the
|
86
|
+
modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */
|
87
|
+
epilogue macro
|
88
|
+
LEAVE
|
89
|
+
cfi_remember_state
|
90
|
+
cfi_def_cfa(rsp, 8)
|
91
|
+
cfi_restore(rbp)
|
92
|
+
RET
|
93
|
+
cfi_restore_state
|
94
|
+
endm
|
95
|
+
|
96
|
+
ALIGN 8
|
97
|
+
ffi_call_win64_tab LABEL NEAR
|
98
|
+
E(0b, FFI_TYPE_VOID)
|
99
|
+
epilogue
|
100
|
+
E(0b, FFI_TYPE_INT)
|
101
|
+
movsxd rax, eax ; movslq %eax, %rax
|
102
|
+
mov qword ptr [r8], rax; movq %rax, (%r8)
|
103
|
+
epilogue
|
104
|
+
E(0b, FFI_TYPE_FLOAT)
|
105
|
+
movss dword ptr [r8], xmm0 ; movss %xmm0, (%r8)
|
106
|
+
epilogue
|
107
|
+
E(0b, FFI_TYPE_DOUBLE)
|
108
|
+
movsd qword ptr[r8], xmm0; movsd %xmm0, (%r8)
|
109
|
+
epilogue
|
110
|
+
E(0b, FFI_TYPE_LONGDOUBLE)
|
111
|
+
call PLT(C(abort))
|
112
|
+
E(0b, FFI_TYPE_UINT8)
|
113
|
+
movzx eax, al ;movzbl %al, %eax
|
114
|
+
mov qword ptr[r8], rax; movq %rax, (%r8)
|
115
|
+
epilogue
|
116
|
+
E(0b, FFI_TYPE_SINT8)
|
117
|
+
movsx rax, al ; movsbq %al, %rax
|
118
|
+
jmp L98
|
119
|
+
E(0b, FFI_TYPE_UINT16)
|
120
|
+
movzx eax, ax ; movzwl %ax, %eax
|
121
|
+
mov qword ptr[r8], rax; movq %rax, (%r8)
|
122
|
+
epilogue
|
123
|
+
E(0b, FFI_TYPE_SINT16)
|
124
|
+
movsx rax, ax; movswq %ax, %rax
|
125
|
+
jmp L98
|
126
|
+
E(0b, FFI_TYPE_UINT32)
|
127
|
+
mov eax, eax; movl %eax, %eax
|
128
|
+
mov qword ptr[r8], rax ; movq %rax, (%r8)
|
129
|
+
epilogue
|
130
|
+
E(0b, FFI_TYPE_SINT32)
|
131
|
+
movsxd rax, eax; movslq %eax, %rax
|
132
|
+
mov qword ptr [r8], rax; movq %rax, (%r8)
|
133
|
+
epilogue
|
134
|
+
E(0b, FFI_TYPE_UINT64)
|
135
|
+
L98 LABEL near
|
136
|
+
mov qword ptr [r8], rax ; movq %rax, (%r8)
|
137
|
+
epilogue
|
138
|
+
E(0b, FFI_TYPE_SINT64)
|
139
|
+
mov qword ptr [r8], rax;movq %rax, (%r8)
|
140
|
+
epilogue
|
141
|
+
E(0b, FFI_TYPE_STRUCT)
|
142
|
+
epilogue
|
143
|
+
E(0b, FFI_TYPE_POINTER)
|
144
|
+
mov qword ptr [r8], rax ;movq %rax, (%r8)
|
145
|
+
epilogue
|
146
|
+
E(0b, FFI_TYPE_COMPLEX)
|
147
|
+
call PLT(C(abort))
|
148
|
+
E(0b, FFI_TYPE_SMALL_STRUCT_1B)
|
149
|
+
mov byte ptr [r8], al ; movb %al, (%r8)
|
150
|
+
epilogue
|
151
|
+
E(0b, FFI_TYPE_SMALL_STRUCT_2B)
|
152
|
+
mov word ptr [r8], ax ; movw %ax, (%r8)
|
153
|
+
epilogue
|
154
|
+
E(0b, FFI_TYPE_SMALL_STRUCT_4B)
|
155
|
+
mov dword ptr [r8], eax ; movl %eax, (%r8)
|
156
|
+
epilogue
|
157
|
+
|
158
|
+
align 8
|
159
|
+
L99 LABEL near
|
160
|
+
call PLT(C(abort))
|
161
|
+
|
162
|
+
epilogue
|
163
|
+
|
164
|
+
cfi_endproc
|
165
|
+
C(ffi_call_win64) endp
|
166
|
+
|
167
|
+
|
168
|
+
/* 32 bytes of outgoing register stack space, 8 bytes of alignment,
|
169
|
+
16 bytes of result, 32 bytes of xmm registers. */
|
170
|
+
#define ffi_clo_FS (32+8+16+32)
|
171
|
+
#define ffi_clo_OFF_R (32+8)
|
172
|
+
#define ffi_clo_OFF_X (32+8+16)
|
173
|
+
|
174
|
+
align 8
|
175
|
+
PUBLIC C(ffi_go_closure_win64)
|
176
|
+
|
177
|
+
C(ffi_go_closure_win64) proc
|
178
|
+
cfi_startproc
|
179
|
+
/* Save all integer arguments into the incoming reg stack space. */
|
180
|
+
mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp)
|
181
|
+
mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp)
|
182
|
+
mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp)
|
183
|
+
mov qword ptr [rsp + 32], r9 ;movq %r9, 32(%rsp)
|
184
|
+
|
185
|
+
mov rcx, qword ptr [r10 + 8]; movq 8(%r10), %rcx /* load cif */
|
186
|
+
mov rdx, qword ptr [r10 + 16]; movq 16(%r10), %rdx /* load fun */
|
187
|
+
mov r8, r10 ; movq %r10, %r8 /* closure is user_data */
|
188
|
+
jmp ffi_closure_win64_2
|
189
|
+
cfi_endproc
|
190
|
+
C(ffi_go_closure_win64) endp
|
191
|
+
|
192
|
+
align 8
|
193
|
+
|
194
|
+
PUBLIC C(ffi_closure_win64)
|
195
|
+
C(ffi_closure_win64) PROC FRAME
|
196
|
+
cfi_startproc
|
197
|
+
/* Save all integer arguments into the incoming reg stack space. */
|
198
|
+
mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp)
|
199
|
+
mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp)
|
200
|
+
mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp)
|
201
|
+
mov qword ptr [rsp + 32], r9; movq %r9, 32(%rsp)
|
202
|
+
|
203
|
+
mov rcx, qword ptr [FFI_TRAMPOLINE_SIZE + r10] ;movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */
|
204
|
+
mov rdx, qword ptr [FFI_TRAMPOLINE_SIZE + 8 + r10] ; movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */
|
205
|
+
mov r8, qword ptr [FFI_TRAMPOLINE_SIZE+16+r10] ;movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */
|
206
|
+
ffi_closure_win64_2 LABEL near
|
207
|
+
sub rsp, ffi_clo_FS ;subq $ffi_clo_FS, %rsp
|
208
|
+
cfi_adjust_cfa_offset(ffi_clo_FS)
|
209
|
+
SEH(.allocstack ffi_clo_FS)
|
210
|
+
SEH(.endprolog)
|
211
|
+
|
212
|
+
/* Save all sse arguments into the stack frame. */
|
213
|
+
movsd qword ptr [ffi_clo_OFF_X + rsp], xmm0 ; movsd %xmm0, ffi_clo_OFF_X(%rsp)
|
214
|
+
movsd qword ptr [ffi_clo_OFF_X+8+rsp], xmm1 ; movsd %xmm1, ffi_clo_OFF_X+8(%rsp)
|
215
|
+
movsd qword ptr [ffi_clo_OFF_X+16+rsp], xmm2 ; movsd %xmm2, ffi_clo_OFF_X+16(%rsp)
|
216
|
+
movsd qword ptr [ffi_clo_OFF_X+24+rsp], xmm3 ; movsd %xmm3, ffi_clo_OFF_X+24(%rsp)
|
217
|
+
|
218
|
+
lea r9, [ffi_clo_OFF_R + rsp] ; leaq ffi_clo_OFF_R(%rsp), %r9
|
219
|
+
call C(ffi_closure_win64_inner)
|
220
|
+
|
221
|
+
/* Load the result into both possible result registers. */
|
222
|
+
|
223
|
+
mov rax, qword ptr [ffi_clo_OFF_R + rsp] ;movq ffi_clo_OFF_R(%rsp), %rax
|
224
|
+
movsd xmm0, qword ptr [rsp + ffi_clo_OFF_R] ;movsd ffi_clo_OFF_R(%rsp), %xmm0
|
225
|
+
|
226
|
+
add rsp, ffi_clo_FS ;addq $ffi_clo_FS, %rsp
|
227
|
+
cfi_adjust_cfa_offset(-ffi_clo_FS)
|
228
|
+
ret
|
229
|
+
|
230
|
+
cfi_endproc
|
231
|
+
C(ffi_closure_win64) endp
|
232
|
+
|
233
|
+
#if defined __ELF__ && defined __linux__
|
234
|
+
.section .note.GNU-stack,"",@progbits
|
235
|
+
#endif
|
236
|
+
_text ends
|
237
|
+
end
|
@@ -0,0 +1,298 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
ffi.c - Copyright (c) 2013 Tensilica, Inc.
|
3
|
+
|
4
|
+
XTENSA 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
|
+
/*
|
31
|
+
|----------------------------------------|
|
32
|
+
| |
|
33
|
+
on entry to ffi_call ----> |----------------------------------------|
|
34
|
+
| caller stack frame for registers a0-a3 |
|
35
|
+
|----------------------------------------|
|
36
|
+
| |
|
37
|
+
| additional arguments |
|
38
|
+
entry of the function ---> |----------------------------------------|
|
39
|
+
| copy of function arguments a2-a7 |
|
40
|
+
| - - - - - - - - - - - - - |
|
41
|
+
| |
|
42
|
+
|
43
|
+
The area below the entry line becomes the new stack frame for the function.
|
44
|
+
|
45
|
+
*/
|
46
|
+
|
47
|
+
|
48
|
+
#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST
|
49
|
+
|
50
|
+
|
51
|
+
extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags,
|
52
|
+
void(*fn)(void), unsigned nbytes, extended_cif*);
|
53
|
+
extern void ffi_closure_SYSV(void) FFI_HIDDEN;
|
54
|
+
|
55
|
+
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
56
|
+
{
|
57
|
+
switch(cif->rtype->type) {
|
58
|
+
case FFI_TYPE_SINT8:
|
59
|
+
case FFI_TYPE_UINT8:
|
60
|
+
case FFI_TYPE_SINT16:
|
61
|
+
case FFI_TYPE_UINT16:
|
62
|
+
cif->flags = cif->rtype->type;
|
63
|
+
break;
|
64
|
+
case FFI_TYPE_VOID:
|
65
|
+
case FFI_TYPE_FLOAT:
|
66
|
+
cif->flags = FFI_TYPE_UINT32;
|
67
|
+
break;
|
68
|
+
case FFI_TYPE_DOUBLE:
|
69
|
+
case FFI_TYPE_UINT64:
|
70
|
+
case FFI_TYPE_SINT64:
|
71
|
+
cif->flags = FFI_TYPE_UINT64; // cif->rtype->type;
|
72
|
+
break;
|
73
|
+
case FFI_TYPE_STRUCT:
|
74
|
+
cif->flags = FFI_TYPE_STRUCT; //_REGS;
|
75
|
+
/* Up to 16 bytes are returned in registers */
|
76
|
+
if (cif->rtype->size > 4 * 4) {
|
77
|
+
/* returned structure is referenced by a register; use 8 bytes
|
78
|
+
(including 4 bytes for potential additional alignment) */
|
79
|
+
cif->flags = FFI_TYPE_STRUCT;
|
80
|
+
cif->bytes += 8;
|
81
|
+
}
|
82
|
+
break;
|
83
|
+
|
84
|
+
default:
|
85
|
+
cif->flags = FFI_TYPE_UINT32;
|
86
|
+
break;
|
87
|
+
}
|
88
|
+
|
89
|
+
/* Round the stack up to a full 4 register frame, just in case
|
90
|
+
(we use this size in movsp). This way, it's also a multiple of
|
91
|
+
8 bytes for 64-bit arguments. */
|
92
|
+
cif->bytes = FFI_ALIGN(cif->bytes, 16);
|
93
|
+
|
94
|
+
return FFI_OK;
|
95
|
+
}
|
96
|
+
|
97
|
+
void ffi_prep_args(extended_cif *ecif, unsigned char* stack)
|
98
|
+
{
|
99
|
+
unsigned int i;
|
100
|
+
unsigned long *addr;
|
101
|
+
ffi_type **ptr;
|
102
|
+
|
103
|
+
union {
|
104
|
+
void **v;
|
105
|
+
char **c;
|
106
|
+
signed char **sc;
|
107
|
+
unsigned char **uc;
|
108
|
+
signed short **ss;
|
109
|
+
unsigned short **us;
|
110
|
+
unsigned int **i;
|
111
|
+
long long **ll;
|
112
|
+
float **f;
|
113
|
+
double **d;
|
114
|
+
} p_argv;
|
115
|
+
|
116
|
+
/* Verify that everything is aligned up properly */
|
117
|
+
FFI_ASSERT (((unsigned long) stack & 0x7) == 0);
|
118
|
+
|
119
|
+
p_argv.v = ecif->avalue;
|
120
|
+
addr = (unsigned long*)stack;
|
121
|
+
|
122
|
+
/* structures with a size greater than 16 bytes are passed in memory */
|
123
|
+
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16)
|
124
|
+
{
|
125
|
+
*addr++ = (unsigned long)ecif->rvalue;
|
126
|
+
}
|
127
|
+
|
128
|
+
for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types;
|
129
|
+
i > 0;
|
130
|
+
i--, ptr++, p_argv.v++)
|
131
|
+
{
|
132
|
+
switch ((*ptr)->type)
|
133
|
+
{
|
134
|
+
case FFI_TYPE_SINT8:
|
135
|
+
*addr++ = **p_argv.sc;
|
136
|
+
break;
|
137
|
+
case FFI_TYPE_UINT8:
|
138
|
+
*addr++ = **p_argv.uc;
|
139
|
+
break;
|
140
|
+
case FFI_TYPE_SINT16:
|
141
|
+
*addr++ = **p_argv.ss;
|
142
|
+
break;
|
143
|
+
case FFI_TYPE_UINT16:
|
144
|
+
*addr++ = **p_argv.us;
|
145
|
+
break;
|
146
|
+
case FFI_TYPE_FLOAT:
|
147
|
+
case FFI_TYPE_INT:
|
148
|
+
case FFI_TYPE_UINT32:
|
149
|
+
case FFI_TYPE_SINT32:
|
150
|
+
case FFI_TYPE_POINTER:
|
151
|
+
*addr++ = **p_argv.i;
|
152
|
+
break;
|
153
|
+
case FFI_TYPE_DOUBLE:
|
154
|
+
case FFI_TYPE_UINT64:
|
155
|
+
case FFI_TYPE_SINT64:
|
156
|
+
if (((unsigned long)addr & 4) != 0)
|
157
|
+
addr++;
|
158
|
+
*(unsigned long long*)addr = **p_argv.ll;
|
159
|
+
addr += sizeof(unsigned long long) / sizeof (addr);
|
160
|
+
break;
|
161
|
+
|
162
|
+
case FFI_TYPE_STRUCT:
|
163
|
+
{
|
164
|
+
unsigned long offs;
|
165
|
+
unsigned long size;
|
166
|
+
|
167
|
+
if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4)
|
168
|
+
addr++;
|
169
|
+
|
170
|
+
offs = (unsigned long) addr - (unsigned long) stack;
|
171
|
+
size = (*ptr)->size;
|
172
|
+
|
173
|
+
/* Entire structure must fit the argument registers or referenced */
|
174
|
+
if (offs < FFI_REGISTER_NARGS * 4
|
175
|
+
&& offs + size > FFI_REGISTER_NARGS * 4)
|
176
|
+
addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4);
|
177
|
+
|
178
|
+
memcpy((char*) addr, *p_argv.c, size);
|
179
|
+
addr += (size + 3) / 4;
|
180
|
+
break;
|
181
|
+
}
|
182
|
+
|
183
|
+
default:
|
184
|
+
FFI_ASSERT(0);
|
185
|
+
}
|
186
|
+
}
|
187
|
+
}
|
188
|
+
|
189
|
+
|
190
|
+
void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue)
|
191
|
+
{
|
192
|
+
extended_cif ecif;
|
193
|
+
unsigned long rsize = cif->rtype->size;
|
194
|
+
int flags = cif->flags;
|
195
|
+
void *alloc = NULL;
|
196
|
+
|
197
|
+
ecif.cif = cif;
|
198
|
+
ecif.avalue = avalue;
|
199
|
+
|
200
|
+
/* Note that for structures that are returned in registers (size <= 16 bytes)
|
201
|
+
we allocate a temporary buffer and use memcpy to copy it to the final
|
202
|
+
destination. The reason is that the target address might be misaligned or
|
203
|
+
the length not a multiple of 4 bytes. Handling all those cases would be
|
204
|
+
very complex. */
|
205
|
+
|
206
|
+
if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL))
|
207
|
+
{
|
208
|
+
alloc = alloca(FFI_ALIGN(rsize, 4));
|
209
|
+
ecif.rvalue = alloc;
|
210
|
+
}
|
211
|
+
else
|
212
|
+
{
|
213
|
+
ecif.rvalue = rvalue;
|
214
|
+
}
|
215
|
+
|
216
|
+
if (cif->abi != FFI_SYSV)
|
217
|
+
FFI_ASSERT(0);
|
218
|
+
|
219
|
+
ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif);
|
220
|
+
|
221
|
+
if (alloc != NULL && rvalue != NULL)
|
222
|
+
memcpy(rvalue, alloc, rsize);
|
223
|
+
}
|
224
|
+
|
225
|
+
extern void ffi_trampoline();
|
226
|
+
extern void ffi_cacheflush(void* start, void* end);
|
227
|
+
|
228
|
+
ffi_status
|
229
|
+
ffi_prep_closure_loc (ffi_closure* closure,
|
230
|
+
ffi_cif* cif,
|
231
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
232
|
+
void *user_data,
|
233
|
+
void *codeloc)
|
234
|
+
{
|
235
|
+
/* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */
|
236
|
+
memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE);
|
237
|
+
*(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV;
|
238
|
+
|
239
|
+
// Do we have this function?
|
240
|
+
// __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE)
|
241
|
+
ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE);
|
242
|
+
|
243
|
+
closure->cif = cif;
|
244
|
+
closure->fun = fun;
|
245
|
+
closure->user_data = user_data;
|
246
|
+
return FFI_OK;
|
247
|
+
}
|
248
|
+
|
249
|
+
|
250
|
+
long FFI_HIDDEN
|
251
|
+
ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue)
|
252
|
+
{
|
253
|
+
ffi_cif *cif;
|
254
|
+
ffi_type **arg_types;
|
255
|
+
void **avalue;
|
256
|
+
int i, areg;
|
257
|
+
|
258
|
+
cif = closure->cif;
|
259
|
+
if (cif->abi != FFI_SYSV)
|
260
|
+
return FFI_BAD_ABI;
|
261
|
+
|
262
|
+
areg = 0;
|
263
|
+
|
264
|
+
int rtype = cif->rtype->type;
|
265
|
+
if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4)
|
266
|
+
{
|
267
|
+
rvalue = *values;
|
268
|
+
areg++;
|
269
|
+
}
|
270
|
+
|
271
|
+
cif = closure->cif;
|
272
|
+
arg_types = cif->arg_types;
|
273
|
+
avalue = alloca(cif->nargs * sizeof(void *));
|
274
|
+
|
275
|
+
for (i = 0; i < cif->nargs; i++)
|
276
|
+
{
|
277
|
+
if (arg_types[i]->alignment == 8 && (areg & 1) != 0)
|
278
|
+
areg++;
|
279
|
+
|
280
|
+
// skip the entry 16,a1 framework, add 16 bytes (4 registers)
|
281
|
+
if (areg == FFI_REGISTER_NARGS)
|
282
|
+
areg += 4;
|
283
|
+
|
284
|
+
if (arg_types[i]->type == FFI_TYPE_STRUCT)
|
285
|
+
{
|
286
|
+
int numregs = ((arg_types[i]->size + 3) & ~3) / 4;
|
287
|
+
if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS)
|
288
|
+
areg = FFI_REGISTER_NARGS + 4;
|
289
|
+
}
|
290
|
+
|
291
|
+
avalue[i] = &values[areg];
|
292
|
+
areg += (arg_types[i]->size + 3) / 4;
|
293
|
+
}
|
294
|
+
|
295
|
+
(closure->fun)(cif, rvalue, avalue, closure->user_data);
|
296
|
+
|
297
|
+
return rtype;
|
298
|
+
}
|