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,6 +1,7 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
unix64.S - Copyright (c)
|
3
|
-
|
2
|
+
unix64.S - Copyright (c) 2013 The Written Word, Inc.
|
3
|
+
- Copyright (c) 2008 Red Hat, Inc
|
4
|
+
- Copyright (c) 2002 Bo Thorsen <bo@suse.de>
|
4
5
|
|
5
6
|
x86-64 Foreign Function Interface
|
6
7
|
|
@@ -29,8 +30,20 @@
|
|
29
30
|
#define LIBFFI_ASM
|
30
31
|
#include <fficonfig.h>
|
31
32
|
#include <ffi.h>
|
33
|
+
#include "internal64.h"
|
34
|
+
#include "asmnames.h"
|
32
35
|
|
33
|
-
.text
|
36
|
+
.text
|
37
|
+
|
38
|
+
/* This macro allows the safe creation of jump tables without an
|
39
|
+
actual table. The entry points into the table are all 8 bytes.
|
40
|
+
The use of ORG asserts that we're at the correct location. */
|
41
|
+
/* ??? The clang assembler doesn't handle .org with symbolic expressions. */
|
42
|
+
#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
|
43
|
+
# define E(BASE, X) .balign 8
|
44
|
+
#else
|
45
|
+
# define E(BASE, X) .balign 8; .org BASE + X * 8
|
46
|
+
#endif
|
34
47
|
|
35
48
|
/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
|
36
49
|
void *raddr, void (*fnaddr)(void));
|
@@ -39,12 +52,12 @@
|
|
39
52
|
for this function. This has been allocated by ffi_call. We also
|
40
53
|
deallocate some of the stack that has been alloca'd. */
|
41
54
|
|
42
|
-
.
|
43
|
-
.globl ffi_call_unix64
|
44
|
-
|
55
|
+
.balign 8
|
56
|
+
.globl C(ffi_call_unix64)
|
57
|
+
FFI_HIDDEN(C(ffi_call_unix64))
|
45
58
|
|
46
|
-
ffi_call_unix64:
|
47
|
-
|
59
|
+
C(ffi_call_unix64):
|
60
|
+
L(UW0):
|
48
61
|
movq (%rsp), %r10 /* Load return address. */
|
49
62
|
leaq (%rdi, %rsi), %rax /* Find local stack base. */
|
50
63
|
movq %rdx, (%rax) /* Save flags. */
|
@@ -52,24 +65,37 @@ ffi_call_unix64:
|
|
52
65
|
movq %rbp, 16(%rax) /* Save old frame pointer. */
|
53
66
|
movq %r10, 24(%rax) /* Relocate return address. */
|
54
67
|
movq %rax, %rbp /* Finalize local stack frame. */
|
55
|
-
|
68
|
+
|
69
|
+
/* New stack frame based off rbp. This is a itty bit of unwind
|
70
|
+
trickery in that the CFA *has* changed. There is no easy way
|
71
|
+
to describe it correctly on entry to the function. Fortunately,
|
72
|
+
it doesn't matter too much since at all points we can correctly
|
73
|
+
unwind back to ffi_call. Note that the location to which we
|
74
|
+
moved the return address is (the new) CFA-8, so from the
|
75
|
+
perspective of the unwind info, it hasn't moved. */
|
76
|
+
L(UW1):
|
77
|
+
/* cfi_def_cfa(%rbp, 32) */
|
78
|
+
/* cfi_rel_offset(%rbp, 16) */
|
79
|
+
|
56
80
|
movq %rdi, %r10 /* Save a copy of the register area. */
|
57
81
|
movq %r8, %r11 /* Save a copy of the target fn. */
|
58
82
|
movl %r9d, %eax /* Set number of SSE registers. */
|
59
83
|
|
60
84
|
/* Load up all argument registers. */
|
61
85
|
movq (%r10), %rdi
|
62
|
-
movq
|
63
|
-
movq
|
64
|
-
movq
|
65
|
-
movq
|
66
|
-
movq
|
86
|
+
movq 0x08(%r10), %rsi
|
87
|
+
movq 0x10(%r10), %rdx
|
88
|
+
movq 0x18(%r10), %rcx
|
89
|
+
movq 0x20(%r10), %r8
|
90
|
+
movq 0x28(%r10), %r9
|
91
|
+
movl 0xb0(%r10), %eax
|
67
92
|
testl %eax, %eax
|
68
|
-
jnz
|
69
|
-
|
93
|
+
jnz L(load_sse)
|
94
|
+
L(ret_from_load_sse):
|
70
95
|
|
71
|
-
/* Deallocate the reg arg area. */
|
72
|
-
leaq
|
96
|
+
/* Deallocate the reg arg area, except for r10, then load via pop. */
|
97
|
+
leaq 0xb8(%r10), %rsp
|
98
|
+
popq %r10
|
73
99
|
|
74
100
|
/* Call the user function. */
|
75
101
|
call *%r11
|
@@ -80,347 +106,420 @@ ffi_call_unix64:
|
|
80
106
|
movq 0(%rbp), %rcx /* Reload flags. */
|
81
107
|
movq 8(%rbp), %rdi /* Reload raddr. */
|
82
108
|
movq 16(%rbp), %rbp /* Reload old frame pointer. */
|
83
|
-
|
109
|
+
L(UW2):
|
110
|
+
/* cfi_remember_state */
|
111
|
+
/* cfi_def_cfa(%rsp, 8) */
|
112
|
+
/* cfi_restore(%rbp) */
|
84
113
|
|
85
114
|
/* The first byte of the flags contains the FFI_TYPE. */
|
115
|
+
cmpb $UNIX64_RET_LAST, %cl
|
86
116
|
movzbl %cl, %r10d
|
87
|
-
leaq
|
88
|
-
|
89
|
-
|
117
|
+
leaq L(store_table)(%rip), %r11
|
118
|
+
ja L(sa)
|
119
|
+
leaq (%r11, %r10, 8), %r10
|
120
|
+
|
121
|
+
/* Prep for the structure cases: scratch area in redzone. */
|
122
|
+
leaq -20(%rsp), %rsi
|
90
123
|
jmp *%r10
|
91
124
|
|
92
|
-
.
|
93
|
-
|
94
|
-
|
95
|
-
.long .Lst_float-.Lstore_table /* FFI_TYPE_FLOAT */
|
96
|
-
.long .Lst_double-.Lstore_table /* FFI_TYPE_DOUBLE */
|
97
|
-
.long .Lst_ldouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */
|
98
|
-
.long .Lst_uint8-.Lstore_table /* FFI_TYPE_UINT8 */
|
99
|
-
.long .Lst_sint8-.Lstore_table /* FFI_TYPE_SINT8 */
|
100
|
-
.long .Lst_uint16-.Lstore_table /* FFI_TYPE_UINT16 */
|
101
|
-
.long .Lst_sint16-.Lstore_table /* FFI_TYPE_SINT16 */
|
102
|
-
.long .Lst_uint32-.Lstore_table /* FFI_TYPE_UINT32 */
|
103
|
-
.long .Lst_sint32-.Lstore_table /* FFI_TYPE_SINT32 */
|
104
|
-
.long .Lst_int64-.Lstore_table /* FFI_TYPE_UINT64 */
|
105
|
-
.long .Lst_int64-.Lstore_table /* FFI_TYPE_SINT64 */
|
106
|
-
.long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */
|
107
|
-
.long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */
|
108
|
-
|
109
|
-
.align 2
|
110
|
-
.Lst_void:
|
125
|
+
.balign 8
|
126
|
+
L(store_table):
|
127
|
+
E(L(store_table), UNIX64_RET_VOID)
|
111
128
|
ret
|
112
|
-
|
113
|
-
|
114
|
-
.Lst_uint8:
|
115
|
-
movzbq %al, %rax
|
129
|
+
E(L(store_table), UNIX64_RET_UINT8)
|
130
|
+
movzbl %al, %eax
|
116
131
|
movq %rax, (%rdi)
|
117
132
|
ret
|
118
|
-
|
119
|
-
|
120
|
-
movsbq %al, %rax
|
133
|
+
E(L(store_table), UNIX64_RET_UINT16)
|
134
|
+
movzwl %ax, %eax
|
121
135
|
movq %rax, (%rdi)
|
122
136
|
ret
|
123
|
-
|
124
|
-
|
125
|
-
movzwq %ax, %rax
|
137
|
+
E(L(store_table), UNIX64_RET_UINT32)
|
138
|
+
movl %eax, %eax
|
126
139
|
movq %rax, (%rdi)
|
127
|
-
|
128
|
-
|
129
|
-
|
140
|
+
ret
|
141
|
+
E(L(store_table), UNIX64_RET_SINT8)
|
142
|
+
movsbq %al, %rax
|
130
143
|
movq %rax, (%rdi)
|
131
144
|
ret
|
132
|
-
|
133
|
-
|
134
|
-
movl %eax, %eax
|
145
|
+
E(L(store_table), UNIX64_RET_SINT16)
|
146
|
+
movswq %ax, %rax
|
135
147
|
movq %rax, (%rdi)
|
136
|
-
|
137
|
-
|
148
|
+
ret
|
149
|
+
E(L(store_table), UNIX64_RET_SINT32)
|
138
150
|
cltq
|
139
151
|
movq %rax, (%rdi)
|
140
152
|
ret
|
141
|
-
|
142
|
-
.Lst_int64:
|
153
|
+
E(L(store_table), UNIX64_RET_INT64)
|
143
154
|
movq %rax, (%rdi)
|
144
155
|
ret
|
145
|
-
|
146
|
-
|
147
|
-
.Lst_float:
|
148
|
-
movss %xmm0, (%rdi)
|
156
|
+
E(L(store_table), UNIX64_RET_XMM32)
|
157
|
+
movd %xmm0, (%rdi)
|
149
158
|
ret
|
150
|
-
|
151
|
-
|
152
|
-
movsd %xmm0, (%rdi)
|
159
|
+
E(L(store_table), UNIX64_RET_XMM64)
|
160
|
+
movq %xmm0, (%rdi)
|
153
161
|
ret
|
154
|
-
|
162
|
+
E(L(store_table), UNIX64_RET_X87)
|
155
163
|
fstpt (%rdi)
|
156
164
|
ret
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
cmovnz %r10, %rax
|
172
|
-
testl $0x200, %ecx
|
173
|
-
cmovnz %r10, %rdx
|
174
|
-
testl $0x400, %ecx
|
175
|
-
cmovnz %r10, %rax
|
176
|
-
cmovnz %r11, %rdx
|
177
|
-
movq %rax, (%rsi)
|
165
|
+
E(L(store_table), UNIX64_RET_X87_2)
|
166
|
+
fstpt (%rdi)
|
167
|
+
fstpt 16(%rdi)
|
168
|
+
ret
|
169
|
+
E(L(store_table), UNIX64_RET_ST_XMM0_RAX)
|
170
|
+
movq %rax, 8(%rsi)
|
171
|
+
jmp L(s3)
|
172
|
+
E(L(store_table), UNIX64_RET_ST_RAX_XMM0)
|
173
|
+
movq %xmm0, 8(%rsi)
|
174
|
+
jmp L(s2)
|
175
|
+
E(L(store_table), UNIX64_RET_ST_XMM0_XMM1)
|
176
|
+
movq %xmm1, 8(%rsi)
|
177
|
+
jmp L(s3)
|
178
|
+
E(L(store_table), UNIX64_RET_ST_RAX_RDX)
|
178
179
|
movq %rdx, 8(%rsi)
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
shrl $12, %ecx
|
180
|
+
L(s2):
|
181
|
+
movq %rax, (%rsi)
|
182
|
+
shrl $UNIX64_SIZE_SHIFT, %ecx
|
183
183
|
rep movsb
|
184
184
|
ret
|
185
|
+
.balign 8
|
186
|
+
L(s3):
|
187
|
+
movq %xmm0, (%rsi)
|
188
|
+
shrl $UNIX64_SIZE_SHIFT, %ecx
|
189
|
+
rep movsb
|
190
|
+
ret
|
191
|
+
|
192
|
+
L(sa): call PLT(C(abort))
|
185
193
|
|
186
194
|
/* Many times we can avoid loading any SSE registers at all.
|
187
195
|
It's not worth an indirect jump to load the exact set of
|
188
196
|
SSE registers needed; zero or all is a good compromise. */
|
189
|
-
.
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
movdqa
|
194
|
-
movdqa
|
195
|
-
movdqa
|
196
|
-
movdqa
|
197
|
-
movdqa
|
198
|
-
movdqa
|
199
|
-
movdqa
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
197
|
+
.balign 2
|
198
|
+
L(UW3):
|
199
|
+
/* cfi_restore_state */
|
200
|
+
L(load_sse):
|
201
|
+
movdqa 0x30(%r10), %xmm0
|
202
|
+
movdqa 0x40(%r10), %xmm1
|
203
|
+
movdqa 0x50(%r10), %xmm2
|
204
|
+
movdqa 0x60(%r10), %xmm3
|
205
|
+
movdqa 0x70(%r10), %xmm4
|
206
|
+
movdqa 0x80(%r10), %xmm5
|
207
|
+
movdqa 0x90(%r10), %xmm6
|
208
|
+
movdqa 0xa0(%r10), %xmm7
|
209
|
+
jmp L(ret_from_load_sse)
|
210
|
+
|
211
|
+
L(UW4):
|
212
|
+
ENDF(C(ffi_call_unix64))
|
213
|
+
|
214
|
+
/* 6 general registers, 8 vector registers,
|
215
|
+
32 bytes of rvalue, 8 bytes of alignment. */
|
216
|
+
#define ffi_closure_OFS_G 0
|
217
|
+
#define ffi_closure_OFS_V (6*8)
|
218
|
+
#define ffi_closure_OFS_RVALUE (ffi_closure_OFS_V + 8*16)
|
219
|
+
#define ffi_closure_FS (ffi_closure_OFS_RVALUE + 32 + 8)
|
220
|
+
|
221
|
+
/* The location of rvalue within the red zone after deallocating the frame. */
|
222
|
+
#define ffi_closure_RED_RVALUE (ffi_closure_OFS_RVALUE - ffi_closure_FS)
|
223
|
+
|
224
|
+
.balign 2
|
225
|
+
.globl C(ffi_closure_unix64_sse)
|
226
|
+
FFI_HIDDEN(C(ffi_closure_unix64_sse))
|
227
|
+
|
228
|
+
C(ffi_closure_unix64_sse):
|
229
|
+
L(UW5):
|
230
|
+
subq $ffi_closure_FS, %rsp
|
231
|
+
L(UW6):
|
232
|
+
/* cfi_adjust_cfa_offset(ffi_closure_FS) */
|
233
|
+
|
234
|
+
movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp)
|
235
|
+
movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp)
|
236
|
+
movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp)
|
237
|
+
movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp)
|
238
|
+
movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp)
|
239
|
+
movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp)
|
240
|
+
movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp)
|
241
|
+
movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp)
|
242
|
+
jmp L(sse_entry1)
|
243
|
+
|
244
|
+
L(UW7):
|
245
|
+
ENDF(C(ffi_closure_unix64_sse))
|
246
|
+
|
247
|
+
.balign 2
|
248
|
+
.globl C(ffi_closure_unix64)
|
249
|
+
FFI_HIDDEN(C(ffi_closure_unix64))
|
250
|
+
|
251
|
+
C(ffi_closure_unix64):
|
252
|
+
L(UW8):
|
253
|
+
subq $ffi_closure_FS, %rsp
|
254
|
+
L(UW9):
|
255
|
+
/* cfi_adjust_cfa_offset(ffi_closure_FS) */
|
256
|
+
L(sse_entry1):
|
257
|
+
movq %rdi, ffi_closure_OFS_G+0x00(%rsp)
|
258
|
+
movq %rsi, ffi_closure_OFS_G+0x08(%rsp)
|
259
|
+
movq %rdx, ffi_closure_OFS_G+0x10(%rsp)
|
260
|
+
movq %rcx, ffi_closure_OFS_G+0x18(%rsp)
|
261
|
+
movq %r8, ffi_closure_OFS_G+0x20(%rsp)
|
262
|
+
movq %r9, ffi_closure_OFS_G+0x28(%rsp)
|
263
|
+
|
264
|
+
#ifdef __ILP32__
|
265
|
+
movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */
|
266
|
+
movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */
|
267
|
+
movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */
|
268
|
+
#else
|
269
|
+
movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */
|
270
|
+
movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */
|
271
|
+
movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */
|
272
|
+
#endif
|
273
|
+
L(do_closure):
|
274
|
+
leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */
|
275
|
+
movq %rsp, %r8 /* Load reg_args */
|
276
|
+
leaq ffi_closure_FS+8(%rsp), %r9 /* Load argp */
|
277
|
+
call C(ffi_closure_unix64_inner)
|
229
278
|
|
230
279
|
/* Deallocate stack frame early; return value is now in redzone. */
|
231
|
-
addq $
|
232
|
-
|
280
|
+
addq $ffi_closure_FS, %rsp
|
281
|
+
L(UW10):
|
282
|
+
/* cfi_adjust_cfa_offset(-ffi_closure_FS) */
|
233
283
|
|
234
284
|
/* The first byte of the return value contains the FFI_TYPE. */
|
285
|
+
cmpb $UNIX64_RET_LAST, %al
|
235
286
|
movzbl %al, %r10d
|
236
|
-
leaq
|
237
|
-
|
238
|
-
|
287
|
+
leaq L(load_table)(%rip), %r11
|
288
|
+
ja L(la)
|
289
|
+
leaq (%r11, %r10, 8), %r10
|
290
|
+
leaq ffi_closure_RED_RVALUE(%rsp), %rsi
|
239
291
|
jmp *%r10
|
240
292
|
|
241
|
-
.
|
242
|
-
|
243
|
-
|
244
|
-
.long .Lld_float-.Lload_table /* FFI_TYPE_FLOAT */
|
245
|
-
.long .Lld_double-.Lload_table /* FFI_TYPE_DOUBLE */
|
246
|
-
.long .Lld_ldouble-.Lload_table /* FFI_TYPE_LONGDOUBLE */
|
247
|
-
.long .Lld_int8-.Lload_table /* FFI_TYPE_UINT8 */
|
248
|
-
.long .Lld_int8-.Lload_table /* FFI_TYPE_SINT8 */
|
249
|
-
.long .Lld_int16-.Lload_table /* FFI_TYPE_UINT16 */
|
250
|
-
.long .Lld_int16-.Lload_table /* FFI_TYPE_SINT16 */
|
251
|
-
.long .Lld_int32-.Lload_table /* FFI_TYPE_UINT32 */
|
252
|
-
.long .Lld_int32-.Lload_table /* FFI_TYPE_SINT32 */
|
253
|
-
.long .Lld_int64-.Lload_table /* FFI_TYPE_UINT64 */
|
254
|
-
.long .Lld_int64-.Lload_table /* FFI_TYPE_SINT64 */
|
255
|
-
.long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */
|
256
|
-
.long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */
|
257
|
-
|
258
|
-
.align 2
|
259
|
-
.Lld_void:
|
293
|
+
.balign 8
|
294
|
+
L(load_table):
|
295
|
+
E(L(load_table), UNIX64_RET_VOID)
|
260
296
|
ret
|
261
|
-
|
262
|
-
|
263
|
-
.Lld_int8:
|
264
|
-
movzbl -24(%rsp), %eax
|
297
|
+
E(L(load_table), UNIX64_RET_UINT8)
|
298
|
+
movzbl (%rsi), %eax
|
265
299
|
ret
|
266
|
-
|
267
|
-
|
268
|
-
movzwl -24(%rsp), %eax
|
300
|
+
E(L(load_table), UNIX64_RET_UINT16)
|
301
|
+
movzwl (%rsi), %eax
|
269
302
|
ret
|
270
|
-
|
271
|
-
|
272
|
-
movl -24(%rsp), %eax
|
303
|
+
E(L(load_table), UNIX64_RET_UINT32)
|
304
|
+
movl (%rsi), %eax
|
273
305
|
ret
|
274
|
-
|
275
|
-
|
276
|
-
movq -24(%rsp), %rax
|
306
|
+
E(L(load_table), UNIX64_RET_SINT8)
|
307
|
+
movsbl (%rsi), %eax
|
277
308
|
ret
|
278
|
-
|
279
|
-
|
280
|
-
.Lld_float:
|
281
|
-
movss -24(%rsp), %xmm0
|
309
|
+
E(L(load_table), UNIX64_RET_SINT16)
|
310
|
+
movswl (%rsi), %eax
|
282
311
|
ret
|
283
|
-
|
284
|
-
|
285
|
-
movsd -24(%rsp), %xmm0
|
312
|
+
E(L(load_table), UNIX64_RET_SINT32)
|
313
|
+
movl (%rsi), %eax
|
286
314
|
ret
|
287
|
-
|
288
|
-
|
289
|
-
fldt -24(%rsp)
|
315
|
+
E(L(load_table), UNIX64_RET_INT64)
|
316
|
+
movq (%rsi), %rax
|
290
317
|
ret
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
318
|
+
E(L(load_table), UNIX64_RET_XMM32)
|
319
|
+
movd (%rsi), %xmm0
|
320
|
+
ret
|
321
|
+
E(L(load_table), UNIX64_RET_XMM64)
|
322
|
+
movq (%rsi), %xmm0
|
323
|
+
ret
|
324
|
+
E(L(load_table), UNIX64_RET_X87)
|
325
|
+
fldt (%rsi)
|
326
|
+
ret
|
327
|
+
E(L(load_table), UNIX64_RET_X87_2)
|
328
|
+
fldt 16(%rsi)
|
329
|
+
fldt (%rsi)
|
330
|
+
ret
|
331
|
+
E(L(load_table), UNIX64_RET_ST_XMM0_RAX)
|
332
|
+
movq 8(%rsi), %rax
|
333
|
+
jmp L(l3)
|
334
|
+
E(L(load_table), UNIX64_RET_ST_RAX_XMM0)
|
335
|
+
movq 8(%rsi), %xmm0
|
336
|
+
jmp L(l2)
|
337
|
+
E(L(load_table), UNIX64_RET_ST_XMM0_XMM1)
|
338
|
+
movq 8(%rsi), %xmm1
|
339
|
+
jmp L(l3)
|
340
|
+
E(L(load_table), UNIX64_RET_ST_RAX_RDX)
|
341
|
+
movq 8(%rsi), %rdx
|
342
|
+
L(l2):
|
343
|
+
movq (%rsi), %rax
|
344
|
+
ret
|
345
|
+
.balign 8
|
346
|
+
L(l3):
|
347
|
+
movq (%rsi), %xmm0
|
308
348
|
ret
|
309
349
|
|
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
|
-
|
350
|
+
L(la): call PLT(C(abort))
|
351
|
+
|
352
|
+
L(UW11):
|
353
|
+
ENDF(C(ffi_closure_unix64))
|
354
|
+
|
355
|
+
.balign 2
|
356
|
+
.globl C(ffi_go_closure_unix64_sse)
|
357
|
+
FFI_HIDDEN(C(ffi_go_closure_unix64_sse))
|
358
|
+
|
359
|
+
C(ffi_go_closure_unix64_sse):
|
360
|
+
L(UW12):
|
361
|
+
subq $ffi_closure_FS, %rsp
|
362
|
+
L(UW13):
|
363
|
+
/* cfi_adjust_cfa_offset(ffi_closure_FS) */
|
364
|
+
|
365
|
+
movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp)
|
366
|
+
movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp)
|
367
|
+
movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp)
|
368
|
+
movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp)
|
369
|
+
movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp)
|
370
|
+
movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp)
|
371
|
+
movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp)
|
372
|
+
movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp)
|
373
|
+
jmp L(sse_entry2)
|
374
|
+
|
375
|
+
L(UW14):
|
376
|
+
ENDF(C(ffi_go_closure_unix64_sse))
|
377
|
+
|
378
|
+
.balign 2
|
379
|
+
.globl C(ffi_go_closure_unix64)
|
380
|
+
FFI_HIDDEN(C(ffi_go_closure_unix64))
|
381
|
+
|
382
|
+
C(ffi_go_closure_unix64):
|
383
|
+
L(UW15):
|
384
|
+
subq $ffi_closure_FS, %rsp
|
385
|
+
L(UW16):
|
386
|
+
/* cfi_adjust_cfa_offset(ffi_closure_FS) */
|
387
|
+
L(sse_entry2):
|
388
|
+
movq %rdi, ffi_closure_OFS_G+0x00(%rsp)
|
389
|
+
movq %rsi, ffi_closure_OFS_G+0x08(%rsp)
|
390
|
+
movq %rdx, ffi_closure_OFS_G+0x10(%rsp)
|
391
|
+
movq %rcx, ffi_closure_OFS_G+0x18(%rsp)
|
392
|
+
movq %r8, ffi_closure_OFS_G+0x20(%rsp)
|
393
|
+
movq %r9, ffi_closure_OFS_G+0x28(%rsp)
|
394
|
+
|
395
|
+
#ifdef __ILP32__
|
396
|
+
movl 4(%r10), %edi /* Load cif */
|
397
|
+
movl 8(%r10), %esi /* Load fun */
|
398
|
+
movl %r10d, %edx /* Load closure (user_data) */
|
356
399
|
#else
|
357
|
-
|
400
|
+
movq 8(%r10), %rdi /* Load cif */
|
401
|
+
movq 16(%r10), %rsi /* Load fun */
|
402
|
+
movq %r10, %rdx /* Load closure (user_data) */
|
358
403
|
#endif
|
359
|
-
|
360
|
-
.uleb128 0x0 /* Augmentation size */
|
361
|
-
|
362
|
-
.byte 0x4 /* DW_CFA_advance_loc4 */
|
363
|
-
.long .LUW1-.LUW0
|
404
|
+
jmp L(do_closure)
|
364
405
|
|
365
|
-
|
366
|
-
|
367
|
-
to describe it correctly on entry to the function. Fortunately,
|
368
|
-
it doesn't matter too much since at all points we can correctly
|
369
|
-
unwind back to ffi_call. Note that the location to which we
|
370
|
-
moved the return address is (the new) CFA-8, so from the
|
371
|
-
perspective of the unwind info, it hasn't moved. */
|
372
|
-
.byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */
|
373
|
-
.uleb128 6
|
374
|
-
.uleb128 32
|
375
|
-
.byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */
|
376
|
-
.uleb128 2
|
377
|
-
.byte 0xa /* DW_CFA_remember_state */
|
406
|
+
L(UW17):
|
407
|
+
ENDF(C(ffi_go_closure_unix64))
|
378
408
|
|
379
|
-
|
380
|
-
.long .LUW2-.LUW1
|
381
|
-
.byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */
|
382
|
-
.uleb128 7
|
383
|
-
.uleb128 8
|
384
|
-
.byte 0xc0+6 /* DW_CFA_restore, %rbp */
|
409
|
+
/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */
|
385
410
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
.LEFDE1:
|
392
|
-
.LSFDE3:
|
393
|
-
.long .LEFDE3-.LASFDE3 /* FDE Length */
|
394
|
-
.LASFDE3:
|
395
|
-
.long .LASFDE3-.Lframe1 /* FDE CIE offset */
|
396
|
-
#if HAVE_AS_X86_PCREL
|
397
|
-
.long .LUW5-. /* FDE initial location */
|
411
|
+
#ifdef __APPLE__
|
412
|
+
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
|
413
|
+
EHFrame0:
|
414
|
+
#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE)
|
415
|
+
.section .eh_frame,"a",@unwind
|
398
416
|
#else
|
399
|
-
|
417
|
+
.section .eh_frame,"a",@progbits
|
400
418
|
#endif
|
401
|
-
.long .LUW9-.LUW5 /* FDE address range */
|
402
|
-
.uleb128 0x0 /* Augmentation size */
|
403
419
|
|
404
|
-
|
405
|
-
.
|
406
|
-
|
407
|
-
|
408
|
-
|
420
|
+
#ifdef HAVE_AS_X86_PCREL
|
421
|
+
# define PCREL(X) X - .
|
422
|
+
#else
|
423
|
+
# define PCREL(X) X@rel
|
424
|
+
#endif
|
409
425
|
|
410
|
-
|
411
|
-
.
|
412
|
-
.byte 0xe /* DW_CFA_def_cfa_offset */
|
413
|
-
.uleb128 8
|
426
|
+
/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */
|
427
|
+
#define ADV(N, P) .byte 2, L(N)-L(P)
|
414
428
|
|
415
|
-
.
|
416
|
-
|
429
|
+
.balign 8
|
430
|
+
L(CIE):
|
431
|
+
.set L(set0),L(ECIE)-L(SCIE)
|
432
|
+
.long L(set0) /* CIE Length */
|
433
|
+
L(SCIE):
|
434
|
+
.long 0 /* CIE Identifier Tag */
|
435
|
+
.byte 1 /* CIE Version */
|
436
|
+
.ascii "zR\0" /* CIE Augmentation */
|
437
|
+
.byte 1 /* CIE Code Alignment Factor */
|
438
|
+
.byte 0x78 /* CIE Data Alignment Factor */
|
439
|
+
.byte 0x10 /* CIE RA Column */
|
440
|
+
.byte 1 /* Augmentation size */
|
441
|
+
.byte 0x1b /* FDE Encoding (pcrel sdata4) */
|
442
|
+
.byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp offset 8 */
|
443
|
+
.byte 0x80+16, 1 /* DW_CFA_offset, %rip offset 1*-8 */
|
444
|
+
.balign 8
|
445
|
+
L(ECIE):
|
446
|
+
|
447
|
+
.set L(set1),L(EFDE1)-L(SFDE1)
|
448
|
+
.long L(set1) /* FDE Length */
|
449
|
+
L(SFDE1):
|
450
|
+
.long L(SFDE1)-L(CIE) /* FDE CIE offset */
|
451
|
+
.long PCREL(L(UW0)) /* Initial location */
|
452
|
+
.long L(UW4)-L(UW0) /* Address range */
|
453
|
+
.byte 0 /* Augmentation size */
|
454
|
+
ADV(UW1, UW0)
|
455
|
+
.byte 0xc, 6, 32 /* DW_CFA_def_cfa, %rbp 32 */
|
456
|
+
.byte 0x80+6, 2 /* DW_CFA_offset, %rbp 2*-8 */
|
457
|
+
ADV(UW2, UW1)
|
458
|
+
.byte 0xa /* DW_CFA_remember_state */
|
459
|
+
.byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp 8 */
|
460
|
+
.byte 0xc0+6 /* DW_CFA_restore, %rbp */
|
461
|
+
ADV(UW3, UW2)
|
417
462
|
.byte 0xb /* DW_CFA_restore_state */
|
418
|
-
|
419
|
-
|
420
|
-
|
463
|
+
.balign 8
|
464
|
+
L(EFDE1):
|
465
|
+
|
466
|
+
.set L(set2),L(EFDE2)-L(SFDE2)
|
467
|
+
.long L(set2) /* FDE Length */
|
468
|
+
L(SFDE2):
|
469
|
+
.long L(SFDE2)-L(CIE) /* FDE CIE offset */
|
470
|
+
.long PCREL(L(UW5)) /* Initial location */
|
471
|
+
.long L(UW7)-L(UW5) /* Address range */
|
472
|
+
.byte 0 /* Augmentation size */
|
473
|
+
ADV(UW6, UW5)
|
474
|
+
.byte 0xe /* DW_CFA_def_cfa_offset */
|
475
|
+
.byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
|
476
|
+
.balign 8
|
477
|
+
L(EFDE2):
|
478
|
+
|
479
|
+
.set L(set3),L(EFDE3)-L(SFDE3)
|
480
|
+
.long L(set3) /* FDE Length */
|
481
|
+
L(SFDE3):
|
482
|
+
.long L(SFDE3)-L(CIE) /* FDE CIE offset */
|
483
|
+
.long PCREL(L(UW8)) /* Initial location */
|
484
|
+
.long L(UW11)-L(UW8) /* Address range */
|
485
|
+
.byte 0 /* Augmentation size */
|
486
|
+
ADV(UW9, UW8)
|
487
|
+
.byte 0xe /* DW_CFA_def_cfa_offset */
|
488
|
+
.byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
|
489
|
+
ADV(UW10, UW9)
|
490
|
+
.byte 0xe, 8 /* DW_CFA_def_cfa_offset 8 */
|
491
|
+
L(EFDE3):
|
492
|
+
|
493
|
+
.set L(set4),L(EFDE4)-L(SFDE4)
|
494
|
+
.long L(set4) /* FDE Length */
|
495
|
+
L(SFDE4):
|
496
|
+
.long L(SFDE4)-L(CIE) /* FDE CIE offset */
|
497
|
+
.long PCREL(L(UW12)) /* Initial location */
|
498
|
+
.long L(UW14)-L(UW12) /* Address range */
|
499
|
+
.byte 0 /* Augmentation size */
|
500
|
+
ADV(UW13, UW12)
|
501
|
+
.byte 0xe /* DW_CFA_def_cfa_offset */
|
502
|
+
.byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
|
503
|
+
.balign 8
|
504
|
+
L(EFDE4):
|
505
|
+
|
506
|
+
.set L(set5),L(EFDE5)-L(SFDE5)
|
507
|
+
.long L(set5) /* FDE Length */
|
508
|
+
L(SFDE5):
|
509
|
+
.long L(SFDE5)-L(CIE) /* FDE CIE offset */
|
510
|
+
.long PCREL(L(UW15)) /* Initial location */
|
511
|
+
.long L(UW17)-L(UW15) /* Address range */
|
512
|
+
.byte 0 /* Augmentation size */
|
513
|
+
ADV(UW16, UW15)
|
514
|
+
.byte 0xe /* DW_CFA_def_cfa_offset */
|
515
|
+
.byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
|
516
|
+
.balign 8
|
517
|
+
L(EFDE5):
|
518
|
+
#ifdef __APPLE__
|
519
|
+
.subsections_via_symbols
|
520
|
+
#endif
|
421
521
|
|
422
522
|
#endif /* __x86_64__ */
|
423
|
-
|
424
523
|
#if defined __ELF__ && defined __linux__
|
425
524
|
.section .note.GNU-stack,"",@progbits
|
426
525
|
#endif
|