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
@@ -1,468 +1,232 @@
|
|
1
1
|
#define LIBFFI_ASM
|
2
2
|
#include <fficonfig.h>
|
3
3
|
#include <ffi.h>
|
4
|
-
|
5
|
-
|
6
|
-
#define STACK 0
|
7
|
-
#define PREP_ARGS_FN 32
|
8
|
-
#define ECIF 40
|
9
|
-
#define CIF_BYTES 48
|
10
|
-
#define CIF_FLAGS 56
|
11
|
-
#define RVALUE 64
|
12
|
-
#define FN 72
|
4
|
+
#include <ffi_cfi.h>
|
5
|
+
#include "asmnames.h"
|
13
6
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
*/
|
18
|
-
|
19
|
-
#ifdef _MSC_VER
|
20
|
-
PUBLIC ffi_call_win64
|
21
|
-
|
22
|
-
EXTRN __chkstk:NEAR
|
23
|
-
EXTRN ffi_closure_win64_inner:NEAR
|
24
|
-
|
25
|
-
_TEXT SEGMENT
|
26
|
-
|
27
|
-
;;; ffi_closure_win64 will be called with these registers set:
|
28
|
-
;;; rax points to 'closure'
|
29
|
-
;;; r11 contains a bit mask that specifies which of the
|
30
|
-
;;; first four parameters are float or double
|
31
|
-
;;;
|
32
|
-
;;; It must move the parameters passed in registers to their stack location,
|
33
|
-
;;; call ffi_closure_win64_inner for the actual work, then return the result.
|
34
|
-
;;;
|
35
|
-
ffi_closure_win64 PROC FRAME
|
36
|
-
;; copy register arguments onto stack
|
37
|
-
test r11, 1
|
38
|
-
jne first_is_float
|
39
|
-
mov QWORD PTR [rsp+8], rcx
|
40
|
-
jmp second
|
41
|
-
first_is_float:
|
42
|
-
movlpd QWORD PTR [rsp+8], xmm0
|
43
|
-
|
44
|
-
second:
|
45
|
-
test r11, 2
|
46
|
-
jne second_is_float
|
47
|
-
mov QWORD PTR [rsp+16], rdx
|
48
|
-
jmp third
|
49
|
-
second_is_float:
|
50
|
-
movlpd QWORD PTR [rsp+16], xmm1
|
51
|
-
|
52
|
-
third:
|
53
|
-
test r11, 4
|
54
|
-
jne third_is_float
|
55
|
-
mov QWORD PTR [rsp+24], r8
|
56
|
-
jmp fourth
|
57
|
-
third_is_float:
|
58
|
-
movlpd QWORD PTR [rsp+24], xmm2
|
59
|
-
|
60
|
-
fourth:
|
61
|
-
test r11, 8
|
62
|
-
jne fourth_is_float
|
63
|
-
mov QWORD PTR [rsp+32], r9
|
64
|
-
jmp done
|
65
|
-
fourth_is_float:
|
66
|
-
movlpd QWORD PTR [rsp+32], xmm3
|
67
|
-
|
68
|
-
done:
|
69
|
-
.ALLOCSTACK 40
|
70
|
-
sub rsp, 40
|
71
|
-
.ENDPROLOG
|
72
|
-
mov rcx, rax ; context is first parameter
|
73
|
-
mov rdx, rsp ; stack is second parameter
|
74
|
-
add rdx, 48 ; point to start of arguments
|
75
|
-
mov rax, ffi_closure_win64_inner
|
76
|
-
call rax ; call the real closure function
|
77
|
-
add rsp, 40
|
78
|
-
movd xmm0, rax ; If the closure returned a float,
|
79
|
-
; ffi_closure_win64_inner wrote it to rax
|
80
|
-
ret 0
|
81
|
-
ffi_closure_win64 ENDP
|
82
|
-
|
83
|
-
ffi_call_win64 PROC FRAME
|
84
|
-
;; copy registers onto stack
|
85
|
-
mov QWORD PTR [rsp+32], r9
|
86
|
-
mov QWORD PTR [rsp+24], r8
|
87
|
-
mov QWORD PTR [rsp+16], rdx
|
88
|
-
mov QWORD PTR [rsp+8], rcx
|
89
|
-
.PUSHREG rbp
|
90
|
-
push rbp
|
91
|
-
.ALLOCSTACK 48
|
92
|
-
sub rsp, 48 ; 00000030H
|
93
|
-
.SETFRAME rbp, 32
|
94
|
-
lea rbp, QWORD PTR [rsp+32]
|
95
|
-
.ENDPROLOG
|
96
|
-
|
97
|
-
mov eax, DWORD PTR CIF_BYTES[rbp]
|
98
|
-
add rax, 15
|
99
|
-
and rax, -16
|
100
|
-
call __chkstk
|
101
|
-
sub rsp, rax
|
102
|
-
lea rax, QWORD PTR [rsp+32]
|
103
|
-
mov QWORD PTR STACK[rbp], rax
|
104
|
-
|
105
|
-
mov rdx, QWORD PTR ECIF[rbp]
|
106
|
-
mov rcx, QWORD PTR STACK[rbp]
|
107
|
-
call QWORD PTR PREP_ARGS_FN[rbp]
|
108
|
-
|
109
|
-
mov rsp, QWORD PTR STACK[rbp]
|
110
|
-
|
111
|
-
movlpd xmm3, QWORD PTR [rsp+24]
|
112
|
-
movd r9, xmm3
|
113
|
-
|
114
|
-
movlpd xmm2, QWORD PTR [rsp+16]
|
115
|
-
movd r8, xmm2
|
116
|
-
|
117
|
-
movlpd xmm1, QWORD PTR [rsp+8]
|
118
|
-
movd rdx, xmm1
|
119
|
-
|
120
|
-
movlpd xmm0, QWORD PTR [rsp]
|
121
|
-
movd rcx, xmm0
|
122
|
-
|
123
|
-
call QWORD PTR FN[rbp]
|
124
|
-
ret_struct4b$:
|
125
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B
|
126
|
-
jne ret_struct2b$
|
127
|
-
|
128
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
129
|
-
mov DWORD PTR [rcx], eax
|
130
|
-
jmp ret_void$
|
131
|
-
|
132
|
-
ret_struct2b$:
|
133
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B
|
134
|
-
jne ret_struct1b$
|
135
|
-
|
136
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
137
|
-
mov WORD PTR [rcx], ax
|
138
|
-
jmp ret_void$
|
139
|
-
|
140
|
-
ret_struct1b$:
|
141
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B
|
142
|
-
jne ret_uint8$
|
143
|
-
|
144
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
145
|
-
mov BYTE PTR [rcx], al
|
146
|
-
jmp ret_void$
|
147
|
-
|
148
|
-
ret_uint8$:
|
149
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8
|
150
|
-
jne ret_sint8$
|
151
|
-
|
152
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
153
|
-
movzx rax, al
|
154
|
-
mov QWORD PTR [rcx], rax
|
155
|
-
jmp ret_void$
|
156
|
-
|
157
|
-
ret_sint8$:
|
158
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8
|
159
|
-
jne ret_uint16$
|
160
|
-
|
161
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
162
|
-
movsx rax, al
|
163
|
-
mov QWORD PTR [rcx], rax
|
164
|
-
jmp ret_void$
|
165
|
-
|
166
|
-
ret_uint16$:
|
167
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16
|
168
|
-
jne ret_sint16$
|
169
|
-
|
170
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
171
|
-
movzx rax, ax
|
172
|
-
mov QWORD PTR [rcx], rax
|
173
|
-
jmp SHORT ret_void$
|
174
|
-
|
175
|
-
ret_sint16$:
|
176
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16
|
177
|
-
jne ret_uint32$
|
178
|
-
|
179
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
180
|
-
movsx rax, ax
|
181
|
-
mov QWORD PTR [rcx], rax
|
182
|
-
jmp SHORT ret_void$
|
183
|
-
|
184
|
-
ret_uint32$:
|
185
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32
|
186
|
-
jne ret_sint32$
|
187
|
-
|
188
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
189
|
-
mov eax, eax
|
190
|
-
mov QWORD PTR [rcx], rax
|
191
|
-
jmp SHORT ret_void$
|
192
|
-
|
193
|
-
ret_sint32$:
|
194
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32
|
195
|
-
jne ret_float$
|
196
|
-
|
197
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
198
|
-
cdqe
|
199
|
-
mov QWORD PTR [rcx], rax
|
200
|
-
jmp SHORT ret_void$
|
201
|
-
|
202
|
-
ret_float$:
|
203
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT
|
204
|
-
jne SHORT ret_double$
|
205
|
-
|
206
|
-
mov rax, QWORD PTR RVALUE[rbp]
|
207
|
-
movss DWORD PTR [rax], xmm0
|
208
|
-
jmp SHORT ret_void$
|
209
|
-
|
210
|
-
ret_double$:
|
211
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE
|
212
|
-
jne SHORT ret_sint64$
|
213
|
-
|
214
|
-
mov rax, QWORD PTR RVALUE[rbp]
|
215
|
-
movlpd QWORD PTR [rax], xmm0
|
216
|
-
jmp SHORT ret_void$
|
217
|
-
|
218
|
-
ret_sint64$:
|
219
|
-
cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64
|
220
|
-
jne ret_void$
|
221
|
-
|
222
|
-
mov rcx, QWORD PTR RVALUE[rbp]
|
223
|
-
mov QWORD PTR [rcx], rax
|
224
|
-
jmp SHORT ret_void$
|
225
|
-
|
226
|
-
ret_void$:
|
227
|
-
xor rax, rax
|
228
|
-
|
229
|
-
lea rsp, QWORD PTR [rbp+16]
|
230
|
-
pop rbp
|
231
|
-
ret 0
|
232
|
-
ffi_call_win64 ENDP
|
233
|
-
_TEXT ENDS
|
234
|
-
END
|
7
|
+
#if defined(HAVE_AS_CFI_PSEUDO_OP)
|
8
|
+
.cfi_sections .debug_frame
|
9
|
+
#endif
|
235
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
|
236
17
|
#else
|
18
|
+
#define SEH(...)
|
19
|
+
#define arg0 %rdi
|
20
|
+
#define arg1 %rsi
|
21
|
+
#define arg2 %rdx
|
22
|
+
#define arg3 %rcx
|
23
|
+
#endif
|
237
24
|
|
238
|
-
|
239
|
-
|
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) .balign 8
|
240
31
|
#else
|
241
|
-
#define
|
32
|
+
# define E(BASE, X) .balign 8; .org BASE + X * 8
|
242
33
|
#endif
|
243
34
|
|
244
|
-
.text
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
.
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
.
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
.
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
.
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
movq
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
movq
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
jmp .Lret_void
|
443
|
-
|
444
|
-
.Lret_double:
|
445
|
-
cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp)
|
446
|
-
jne .Lret_sint64
|
447
|
-
|
448
|
-
mov RVALUE(%rbp), %rax
|
449
|
-
movlpd %xmm0, (%rax)
|
450
|
-
jmp .Lret_void
|
451
|
-
|
452
|
-
.Lret_sint64:
|
453
|
-
cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp)
|
454
|
-
jne .Lret_void
|
455
|
-
|
456
|
-
mov RVALUE(%rbp), %rcx
|
457
|
-
mov %rax, (%rcx)
|
458
|
-
jmp .Lret_void
|
459
|
-
|
460
|
-
.Lret_void:
|
461
|
-
xor %rax, %rax
|
462
|
-
|
463
|
-
lea 16(%rbp), %rsp
|
464
|
-
pop %rbp
|
465
|
-
retq
|
466
|
-
.ffi_call_win64_end:
|
467
|
-
#endif /* !_MSC_VER */
|
468
|
-
|
35
|
+
.text
|
36
|
+
|
37
|
+
/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10)
|
38
|
+
|
39
|
+
Bit o trickiness here -- FRAME is the base of the stack frame
|
40
|
+
for this function. This has been allocated by ffi_call. We also
|
41
|
+
deallocate some of the stack that has been alloca'd. */
|
42
|
+
|
43
|
+
.align 8
|
44
|
+
.globl C(ffi_call_win64)
|
45
|
+
|
46
|
+
SEH(.seh_proc ffi_call_win64)
|
47
|
+
C(ffi_call_win64):
|
48
|
+
cfi_startproc
|
49
|
+
/* Set up the local stack frame and install it in rbp/rsp. */
|
50
|
+
movq (%rsp), %rax
|
51
|
+
movq %rbp, (arg1)
|
52
|
+
movq %rax, 8(arg1)
|
53
|
+
movq arg1, %rbp
|
54
|
+
cfi_def_cfa(%rbp, 16)
|
55
|
+
cfi_rel_offset(%rbp, 0)
|
56
|
+
SEH(.seh_pushreg %rbp)
|
57
|
+
SEH(.seh_setframe %rbp, 0)
|
58
|
+
SEH(.seh_endprologue)
|
59
|
+
movq arg0, %rsp
|
60
|
+
|
61
|
+
movq arg2, %r10
|
62
|
+
|
63
|
+
/* Load all slots into both general and xmm registers. */
|
64
|
+
movq (%rsp), %rcx
|
65
|
+
movsd (%rsp), %xmm0
|
66
|
+
movq 8(%rsp), %rdx
|
67
|
+
movsd 8(%rsp), %xmm1
|
68
|
+
movq 16(%rsp), %r8
|
69
|
+
movsd 16(%rsp), %xmm2
|
70
|
+
movq 24(%rsp), %r9
|
71
|
+
movsd 24(%rsp), %xmm3
|
72
|
+
|
73
|
+
call *16(%rbp)
|
74
|
+
|
75
|
+
movl 24(%rbp), %ecx
|
76
|
+
movq 32(%rbp), %r8
|
77
|
+
leaq 0f(%rip), %r10
|
78
|
+
cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx
|
79
|
+
leaq (%r10, %rcx, 8), %r10
|
80
|
+
ja 99f
|
81
|
+
jmp *%r10
|
82
|
+
|
83
|
+
/* Below, we're space constrained most of the time. Thus we eschew the
|
84
|
+
modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */
|
85
|
+
.macro epilogue
|
86
|
+
leaveq
|
87
|
+
cfi_remember_state
|
88
|
+
cfi_def_cfa(%rsp, 8)
|
89
|
+
cfi_restore(%rbp)
|
90
|
+
ret
|
91
|
+
cfi_restore_state
|
92
|
+
.endm
|
93
|
+
|
94
|
+
.align 8
|
95
|
+
0:
|
96
|
+
E(0b, FFI_TYPE_VOID)
|
97
|
+
epilogue
|
98
|
+
E(0b, FFI_TYPE_INT)
|
99
|
+
movslq %eax, %rax
|
100
|
+
movq %rax, (%r8)
|
101
|
+
epilogue
|
102
|
+
E(0b, FFI_TYPE_FLOAT)
|
103
|
+
movss %xmm0, (%r8)
|
104
|
+
epilogue
|
105
|
+
E(0b, FFI_TYPE_DOUBLE)
|
106
|
+
movsd %xmm0, (%r8)
|
107
|
+
epilogue
|
108
|
+
E(0b, FFI_TYPE_LONGDOUBLE)
|
109
|
+
call PLT(C(abort))
|
110
|
+
E(0b, FFI_TYPE_UINT8)
|
111
|
+
movzbl %al, %eax
|
112
|
+
movq %rax, (%r8)
|
113
|
+
epilogue
|
114
|
+
E(0b, FFI_TYPE_SINT8)
|
115
|
+
movsbq %al, %rax
|
116
|
+
jmp 98f
|
117
|
+
E(0b, FFI_TYPE_UINT16)
|
118
|
+
movzwl %ax, %eax
|
119
|
+
movq %rax, (%r8)
|
120
|
+
epilogue
|
121
|
+
E(0b, FFI_TYPE_SINT16)
|
122
|
+
movswq %ax, %rax
|
123
|
+
jmp 98f
|
124
|
+
E(0b, FFI_TYPE_UINT32)
|
125
|
+
movl %eax, %eax
|
126
|
+
movq %rax, (%r8)
|
127
|
+
epilogue
|
128
|
+
E(0b, FFI_TYPE_SINT32)
|
129
|
+
movslq %eax, %rax
|
130
|
+
movq %rax, (%r8)
|
131
|
+
epilogue
|
132
|
+
E(0b, FFI_TYPE_UINT64)
|
133
|
+
98: movq %rax, (%r8)
|
134
|
+
epilogue
|
135
|
+
E(0b, FFI_TYPE_SINT64)
|
136
|
+
movq %rax, (%r8)
|
137
|
+
epilogue
|
138
|
+
E(0b, FFI_TYPE_STRUCT)
|
139
|
+
epilogue
|
140
|
+
E(0b, FFI_TYPE_POINTER)
|
141
|
+
movq %rax, (%r8)
|
142
|
+
epilogue
|
143
|
+
E(0b, FFI_TYPE_COMPLEX)
|
144
|
+
call PLT(C(abort))
|
145
|
+
E(0b, FFI_TYPE_SMALL_STRUCT_1B)
|
146
|
+
movb %al, (%r8)
|
147
|
+
epilogue
|
148
|
+
E(0b, FFI_TYPE_SMALL_STRUCT_2B)
|
149
|
+
movw %ax, (%r8)
|
150
|
+
epilogue
|
151
|
+
E(0b, FFI_TYPE_SMALL_STRUCT_4B)
|
152
|
+
movl %eax, (%r8)
|
153
|
+
epilogue
|
154
|
+
|
155
|
+
.align 8
|
156
|
+
99: call PLT(C(abort))
|
157
|
+
|
158
|
+
epilogue
|
159
|
+
|
160
|
+
cfi_endproc
|
161
|
+
SEH(.seh_endproc)
|
162
|
+
|
163
|
+
|
164
|
+
/* 32 bytes of outgoing register stack space, 8 bytes of alignment,
|
165
|
+
16 bytes of result, 32 bytes of xmm registers. */
|
166
|
+
#define ffi_clo_FS (32+8+16+32)
|
167
|
+
#define ffi_clo_OFF_R (32+8)
|
168
|
+
#define ffi_clo_OFF_X (32+8+16)
|
169
|
+
|
170
|
+
.align 8
|
171
|
+
.globl C(ffi_go_closure_win64)
|
172
|
+
|
173
|
+
SEH(.seh_proc ffi_go_closure_win64)
|
174
|
+
C(ffi_go_closure_win64):
|
175
|
+
cfi_startproc
|
176
|
+
/* Save all integer arguments into the incoming reg stack space. */
|
177
|
+
movq %rcx, 8(%rsp)
|
178
|
+
movq %rdx, 16(%rsp)
|
179
|
+
movq %r8, 24(%rsp)
|
180
|
+
movq %r9, 32(%rsp)
|
181
|
+
|
182
|
+
movq 8(%r10), %rcx /* load cif */
|
183
|
+
movq 16(%r10), %rdx /* load fun */
|
184
|
+
movq %r10, %r8 /* closure is user_data */
|
185
|
+
jmp 0f
|
186
|
+
cfi_endproc
|
187
|
+
SEH(.seh_endproc)
|
188
|
+
|
189
|
+
.align 8
|
190
|
+
.globl C(ffi_closure_win64)
|
191
|
+
|
192
|
+
SEH(.seh_proc ffi_closure_win64)
|
193
|
+
C(ffi_closure_win64):
|
194
|
+
cfi_startproc
|
195
|
+
/* Save all integer arguments into the incoming reg stack space. */
|
196
|
+
movq %rcx, 8(%rsp)
|
197
|
+
movq %rdx, 16(%rsp)
|
198
|
+
movq %r8, 24(%rsp)
|
199
|
+
movq %r9, 32(%rsp)
|
200
|
+
|
201
|
+
movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */
|
202
|
+
movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */
|
203
|
+
movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */
|
204
|
+
0:
|
205
|
+
subq $ffi_clo_FS, %rsp
|
206
|
+
cfi_adjust_cfa_offset(ffi_clo_FS)
|
207
|
+
SEH(.seh_stackalloc ffi_clo_FS)
|
208
|
+
SEH(.seh_endprologue)
|
209
|
+
|
210
|
+
/* Save all sse arguments into the stack frame. */
|
211
|
+
movsd %xmm0, ffi_clo_OFF_X(%rsp)
|
212
|
+
movsd %xmm1, ffi_clo_OFF_X+8(%rsp)
|
213
|
+
movsd %xmm2, ffi_clo_OFF_X+16(%rsp)
|
214
|
+
movsd %xmm3, ffi_clo_OFF_X+24(%rsp)
|
215
|
+
|
216
|
+
leaq ffi_clo_OFF_R(%rsp), %r9
|
217
|
+
call C(ffi_closure_win64_inner)
|
218
|
+
|
219
|
+
/* Load the result into both possible result registers. */
|
220
|
+
movq ffi_clo_OFF_R(%rsp), %rax
|
221
|
+
movsd ffi_clo_OFF_R(%rsp), %xmm0
|
222
|
+
|
223
|
+
addq $ffi_clo_FS, %rsp
|
224
|
+
cfi_adjust_cfa_offset(-ffi_clo_FS)
|
225
|
+
ret
|
226
|
+
|
227
|
+
cfi_endproc
|
228
|
+
SEH(.seh_endproc)
|
229
|
+
|
230
|
+
#if defined __ELF__ && defined __linux__
|
231
|
+
.section .note.GNU-stack,"",@progbits
|
232
|
+
#endif
|