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,5 +1,6 @@
|
|
1
1
|
/* -----------------------------------------------------------------*-C-*-
|
2
|
-
ffitarget.h - Copyright (c)
|
2
|
+
ffitarget.h - Copyright (c) 2012 Anthony Green
|
3
|
+
Copyright (c) 1996-2003 Red Hat, Inc.
|
3
4
|
Target configuration macros for Motorola 68K.
|
4
5
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining
|
@@ -27,6 +28,10 @@
|
|
27
28
|
#ifndef LIBFFI_TARGET_H
|
28
29
|
#define LIBFFI_TARGET_H
|
29
30
|
|
31
|
+
#ifndef LIBFFI_H
|
32
|
+
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
33
|
+
#endif
|
34
|
+
|
30
35
|
#ifndef LIBFFI_ASM
|
31
36
|
typedef unsigned long ffi_arg;
|
32
37
|
typedef signed long ffi_sarg;
|
@@ -1,9 +1,11 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
2
|
|
3
|
-
sysv.S - Copyright (c)
|
4
|
-
Copyright (c)
|
5
|
-
|
6
|
-
|
3
|
+
sysv.S - Copyright (c) 2012 Alan Hourihane
|
4
|
+
Copyright (c) 1998, 2012 Andreas Schwab
|
5
|
+
Copyright (c) 2008 Red Hat, Inc.
|
6
|
+
Copyright (c) 2012, 2016 Thorsten Glaser
|
7
|
+
|
8
|
+
m68k Foreign Function Interface
|
7
9
|
|
8
10
|
Permission is hereby granted, free of charge, to any person obtaining
|
9
11
|
a copy of this software and associated documentation files (the
|
@@ -40,15 +42,21 @@
|
|
40
42
|
#define CFI_OFFSET(reg,off)
|
41
43
|
#define CFI_DEF_CFA(reg,off)
|
42
44
|
#define CFI_ENDPROC()
|
45
|
+
#endif
|
46
|
+
|
47
|
+
#ifdef __MINT__
|
48
|
+
#define CALLFUNC(funcname) _ ## funcname
|
49
|
+
#else
|
50
|
+
#define CALLFUNC(funcname) funcname
|
43
51
|
#endif
|
44
52
|
|
45
53
|
.text
|
46
54
|
|
47
|
-
.globl ffi_call_SYSV
|
48
|
-
.type ffi_call_SYSV,@function
|
55
|
+
.globl CALLFUNC(ffi_call_SYSV)
|
56
|
+
.type CALLFUNC(ffi_call_SYSV),@function
|
49
57
|
.align 4
|
50
58
|
|
51
|
-
ffi_call_SYSV:
|
59
|
+
CALLFUNC(ffi_call_SYSV):
|
52
60
|
CFI_STARTPROC()
|
53
61
|
link %fp,#0
|
54
62
|
CFI_OFFSET(14,-8)
|
@@ -63,14 +71,27 @@ ffi_call_SYSV:
|
|
63
71
|
move.l 8(%fp),-(%sp)
|
64
72
|
pea 4(%sp)
|
65
73
|
#if !defined __PIC__
|
66
|
-
jsr ffi_prep_args
|
74
|
+
jsr CALLFUNC(ffi_prep_args)
|
75
|
+
#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
|
76
|
+
move.l _current_shared_library_a5_offset_(%a5),%a0
|
77
|
+
move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0
|
78
|
+
jsr (%a0)
|
79
|
+
#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
|
80
|
+
move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
|
81
|
+
lea (-6,%pc,%a0),%a0
|
82
|
+
move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0
|
83
|
+
jsr (%a0)
|
67
84
|
#else
|
68
|
-
bsr.l ffi_prep_args@PLTPC
|
85
|
+
bsr.l CALLFUNC(ffi_prep_args@PLTPC)
|
69
86
|
#endif
|
70
87
|
addq.l #8,%sp
|
71
88
|
|
72
89
|
| Pass pointer to struct value, if any
|
90
|
+
#ifdef __MINT__
|
91
|
+
move.l %d0,%a1
|
92
|
+
#else
|
73
93
|
move.l %a0,%a1
|
94
|
+
#endif
|
74
95
|
|
75
96
|
| Call the function
|
76
97
|
move.l 24(%fp),%a0
|
@@ -87,7 +108,7 @@ ffi_call_SYSV:
|
|
87
108
|
|
88
109
|
| If the return value pointer is NULL, assume no return value.
|
89
110
|
| NOTE: On the mc68000, tst on an address register is not supported.
|
90
|
-
#if defined(
|
111
|
+
#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
|
91
112
|
cmp.w #0, %a1
|
92
113
|
#else
|
93
114
|
tst.l %a1
|
@@ -109,7 +130,7 @@ retlongint:
|
|
109
130
|
retfloat:
|
110
131
|
btst #2,%d2
|
111
132
|
jbeq retdouble
|
112
|
-
#if defined(__MC68881__)
|
133
|
+
#if defined(__MC68881__) || defined(__HAVE_68881__)
|
113
134
|
fmove.s %fp0,(%a1)
|
114
135
|
#else
|
115
136
|
move.l %d0,(%a1)
|
@@ -119,7 +140,7 @@ retfloat:
|
|
119
140
|
retdouble:
|
120
141
|
btst #3,%d2
|
121
142
|
jbeq retlongdouble
|
122
|
-
#if defined(__MC68881__)
|
143
|
+
#if defined(__MC68881__) || defined(__HAVE_68881__)
|
123
144
|
fmove.d %fp0,(%a1)
|
124
145
|
#else
|
125
146
|
move.l %d0,(%a1)+
|
@@ -130,7 +151,7 @@ retdouble:
|
|
130
151
|
retlongdouble:
|
131
152
|
btst #4,%d2
|
132
153
|
jbeq retpointer
|
133
|
-
#if defined(__MC68881__)
|
154
|
+
#if defined(__MC68881__) || defined(__HAVE_68881__)
|
134
155
|
fmove.x %fp0,(%a1)
|
135
156
|
#else
|
136
157
|
move.l %d0,(%a1)+
|
@@ -142,7 +163,11 @@ retlongdouble:
|
|
142
163
|
retpointer:
|
143
164
|
btst #5,%d2
|
144
165
|
jbeq retstruct1
|
166
|
+
#ifdef __MINT__
|
167
|
+
move.l %d0,(%a1)
|
168
|
+
#else
|
145
169
|
move.l %a0,(%a1)
|
170
|
+
#endif
|
146
171
|
jbra epilogue
|
147
172
|
|
148
173
|
retstruct1:
|
@@ -153,8 +178,28 @@ retstruct1:
|
|
153
178
|
|
154
179
|
retstruct2:
|
155
180
|
btst #7,%d2
|
156
|
-
jbeq
|
181
|
+
jbeq retsint8
|
157
182
|
move.w %d0,(%a1)
|
183
|
+
jbra epilogue
|
184
|
+
|
185
|
+
retsint8:
|
186
|
+
btst #8,%d2
|
187
|
+
jbeq retsint16
|
188
|
+
| NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
|
189
|
+
#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
|
190
|
+
ext.w %d0
|
191
|
+
ext.l %d0
|
192
|
+
#else
|
193
|
+
extb.l %d0
|
194
|
+
#endif
|
195
|
+
move.l %d0,(%a1)
|
196
|
+
jbra epilogue
|
197
|
+
|
198
|
+
retsint16:
|
199
|
+
btst #9,%d2
|
200
|
+
jbeq noretval
|
201
|
+
ext.l %d0
|
202
|
+
move.l %d0,(%a1)
|
158
203
|
|
159
204
|
noretval:
|
160
205
|
epilogue:
|
@@ -162,13 +207,13 @@ epilogue:
|
|
162
207
|
unlk %fp
|
163
208
|
rts
|
164
209
|
CFI_ENDPROC()
|
165
|
-
.size ffi_call_SYSV,.-ffi_call_SYSV
|
210
|
+
.size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
|
166
211
|
|
167
|
-
.globl ffi_closure_SYSV
|
168
|
-
.type ffi_closure_SYSV, @function
|
212
|
+
.globl CALLFUNC(ffi_closure_SYSV)
|
213
|
+
.type CALLFUNC(ffi_closure_SYSV), @function
|
169
214
|
.align 4
|
170
215
|
|
171
|
-
ffi_closure_SYSV:
|
216
|
+
CALLFUNC(ffi_closure_SYSV):
|
172
217
|
CFI_STARTPROC()
|
173
218
|
link %fp,#-12
|
174
219
|
CFI_OFFSET(14,-8)
|
@@ -178,16 +223,27 @@ ffi_closure_SYSV:
|
|
178
223
|
pea -12(%fp)
|
179
224
|
move.l %a0,-(%sp)
|
180
225
|
#if !defined __PIC__
|
181
|
-
jsr ffi_closure_SYSV_inner
|
226
|
+
jsr CALLFUNC(ffi_closure_SYSV_inner)
|
227
|
+
#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
|
228
|
+
move.l _current_shared_library_a5_offset_(%a5),%a0
|
229
|
+
move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
|
230
|
+
jsr (%a0)
|
231
|
+
#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
|
232
|
+
move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
|
233
|
+
lea (-6,%pc,%a0),%a0
|
234
|
+
move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
|
235
|
+
jsr (%a0)
|
182
236
|
#else
|
183
|
-
bsr.l ffi_closure_SYSV_inner@PLTPC
|
237
|
+
bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
|
184
238
|
#endif
|
185
239
|
|
186
240
|
lsr.l #1,%d0
|
187
241
|
jne 1f
|
188
242
|
jcc .Lcls_epilogue
|
243
|
+
| CIF_FLAGS_INT
|
189
244
|
move.l -12(%fp),%d0
|
190
245
|
.Lcls_epilogue:
|
246
|
+
| no CIF_FLAGS_*
|
191
247
|
unlk %fp
|
192
248
|
rts
|
193
249
|
1:
|
@@ -195,11 +251,12 @@ ffi_closure_SYSV:
|
|
195
251
|
lsr.l #2,%d0
|
196
252
|
jne 1f
|
197
253
|
jcs .Lcls_ret_float
|
254
|
+
| CIF_FLAGS_DINT
|
198
255
|
move.l (%a0)+,%d0
|
199
256
|
move.l (%a0),%d1
|
200
257
|
jra .Lcls_epilogue
|
201
258
|
.Lcls_ret_float:
|
202
|
-
#if defined(__MC68881__)
|
259
|
+
#if defined(__MC68881__) || defined(__HAVE_68881__)
|
203
260
|
fmove.s (%a0),%fp0
|
204
261
|
#else
|
205
262
|
move.l (%a0),%d0
|
@@ -209,7 +266,8 @@ ffi_closure_SYSV:
|
|
209
266
|
lsr.l #2,%d0
|
210
267
|
jne 1f
|
211
268
|
jcs .Lcls_ret_ldouble
|
212
|
-
|
269
|
+
| CIF_FLAGS_DOUBLE
|
270
|
+
#if defined(__MC68881__) || defined(__HAVE_68881__)
|
213
271
|
fmove.d (%a0),%fp0
|
214
272
|
#else
|
215
273
|
move.l (%a0)+,%d0
|
@@ -217,7 +275,7 @@ ffi_closure_SYSV:
|
|
217
275
|
#endif
|
218
276
|
jra .Lcls_epilogue
|
219
277
|
.Lcls_ret_ldouble:
|
220
|
-
#if defined(__MC68881__)
|
278
|
+
#if defined(__MC68881__) || defined(__HAVE_68881__)
|
221
279
|
fmove.x (%a0),%fp0
|
222
280
|
#else
|
223
281
|
move.l (%a0)+,%d0
|
@@ -227,26 +285,46 @@ ffi_closure_SYSV:
|
|
227
285
|
jra .Lcls_epilogue
|
228
286
|
1:
|
229
287
|
lsr.l #2,%d0
|
230
|
-
jne
|
288
|
+
jne 1f
|
231
289
|
jcs .Lcls_ret_struct1
|
290
|
+
| CIF_FLAGS_POINTER
|
232
291
|
move.l (%a0),%a0
|
233
292
|
move.l %a0,%d0
|
234
293
|
jra .Lcls_epilogue
|
235
294
|
.Lcls_ret_struct1:
|
236
295
|
move.b (%a0),%d0
|
237
296
|
jra .Lcls_epilogue
|
238
|
-
|
297
|
+
1:
|
298
|
+
lsr.l #2,%d0
|
299
|
+
jne 1f
|
300
|
+
jcs .Lcls_ret_sint8
|
301
|
+
| CIF_FLAGS_STRUCT2
|
239
302
|
move.w (%a0),%d0
|
240
303
|
jra .Lcls_epilogue
|
304
|
+
.Lcls_ret_sint8:
|
305
|
+
move.l (%a0),%d0
|
306
|
+
| NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
|
307
|
+
#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
|
308
|
+
ext.w %d0
|
309
|
+
ext.l %d0
|
310
|
+
#else
|
311
|
+
extb.l %d0
|
312
|
+
#endif
|
313
|
+
jra .Lcls_epilogue
|
314
|
+
1:
|
315
|
+
| CIF_FLAGS_SINT16
|
316
|
+
move.l (%a0),%d0
|
317
|
+
ext.l %d0
|
318
|
+
jra .Lcls_epilogue
|
241
319
|
CFI_ENDPROC()
|
242
320
|
|
243
|
-
.size ffi_closure_SYSV,.-ffi_closure_SYSV
|
321
|
+
.size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
|
244
322
|
|
245
|
-
.globl ffi_closure_struct_SYSV
|
246
|
-
.type ffi_closure_struct_SYSV, @function
|
323
|
+
.globl CALLFUNC(ffi_closure_struct_SYSV)
|
324
|
+
.type CALLFUNC(ffi_closure_struct_SYSV), @function
|
247
325
|
.align 4
|
248
326
|
|
249
|
-
ffi_closure_struct_SYSV:
|
327
|
+
CALLFUNC(ffi_closure_struct_SYSV):
|
250
328
|
CFI_STARTPROC()
|
251
329
|
link %fp,#0
|
252
330
|
CFI_OFFSET(14,-8)
|
@@ -256,14 +334,23 @@ ffi_closure_struct_SYSV:
|
|
256
334
|
move.l %a1,-(%sp)
|
257
335
|
move.l %a0,-(%sp)
|
258
336
|
#if !defined __PIC__
|
259
|
-
jsr ffi_closure_SYSV_inner
|
337
|
+
jsr CALLFUNC(ffi_closure_SYSV_inner)
|
338
|
+
#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
|
339
|
+
move.l _current_shared_library_a5_offset_(%a5),%a0
|
340
|
+
move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
|
341
|
+
jsr (%a0)
|
342
|
+
#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
|
343
|
+
move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
|
344
|
+
lea (-6,%pc,%a0),%a0
|
345
|
+
move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
|
346
|
+
jsr (%a0)
|
260
347
|
#else
|
261
|
-
bsr.l ffi_closure_SYSV_inner@PLTPC
|
348
|
+
bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
|
262
349
|
#endif
|
263
350
|
unlk %fp
|
264
351
|
rts
|
265
352
|
CFI_ENDPROC()
|
266
|
-
.size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV
|
353
|
+
.size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
|
267
354
|
|
268
355
|
#if defined __ELF__ && defined __linux__
|
269
356
|
.section .note.GNU-stack,"",@progbits
|
@@ -0,0 +1,400 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org>
|
3
|
+
*
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
* a copy of this software and associated documentation files (the
|
6
|
+
* ``Software''), to deal in the Software without restriction, including
|
7
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
* the following conditions:
|
11
|
+
*
|
12
|
+
* The above copyright notice and this permission notice shall be included
|
13
|
+
* in all copies or substantial portions of the Software.
|
14
|
+
*
|
15
|
+
* THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
*/
|
23
|
+
|
24
|
+
/*
|
25
|
+
* m88k Foreign Function Interface
|
26
|
+
*
|
27
|
+
* This file attempts to provide all the FFI entry points which can reliably
|
28
|
+
* be implemented in C.
|
29
|
+
*
|
30
|
+
* Only OpenBSD/m88k is currently supported; other platforms (such as
|
31
|
+
* Motorola's SysV/m88k) could be supported with the following tweaks:
|
32
|
+
*
|
33
|
+
* - non-OpenBSD systems use an `outgoing parameter area' as part of the
|
34
|
+
* 88BCS calling convention, which is not supported under OpenBSD from
|
35
|
+
* release 3.6 onwards. Supporting it should be as easy as taking it
|
36
|
+
* into account when adjusting the stack, in the assembly code.
|
37
|
+
*
|
38
|
+
* - the logic deciding whether a function argument gets passed through
|
39
|
+
* registers, or on the stack, has changed several times in OpenBSD in
|
40
|
+
* edge cases (especially for structs larger than 32 bytes being passed
|
41
|
+
* by value). The code below attemps to match the logic used by the
|
42
|
+
* system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend
|
43
|
+
* fixes.
|
44
|
+
*/
|
45
|
+
|
46
|
+
#include <ffi.h>
|
47
|
+
#include <ffi_common.h>
|
48
|
+
|
49
|
+
#include <stdlib.h>
|
50
|
+
#include <unistd.h>
|
51
|
+
|
52
|
+
void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *,
|
53
|
+
void (*fn) ());
|
54
|
+
void *ffi_prep_args (void *, extended_cif *);
|
55
|
+
void ffi_closure_OBSD (ffi_closure *);
|
56
|
+
void ffi_closure_struct_OBSD (ffi_closure *);
|
57
|
+
unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *,
|
58
|
+
char *);
|
59
|
+
void ffi_cacheflush_OBSD (unsigned int, unsigned int);
|
60
|
+
|
61
|
+
#define CIF_FLAGS_INT (1 << 0)
|
62
|
+
#define CIF_FLAGS_DINT (1 << 1)
|
63
|
+
|
64
|
+
/*
|
65
|
+
* Foreign Function Interface API
|
66
|
+
*/
|
67
|
+
|
68
|
+
/* ffi_prep_args is called by the assembly routine once stack space has
|
69
|
+
been allocated for the function's arguments. */
|
70
|
+
|
71
|
+
void *
|
72
|
+
ffi_prep_args (void *stack, extended_cif *ecif)
|
73
|
+
{
|
74
|
+
unsigned int i;
|
75
|
+
void **p_argv;
|
76
|
+
char *argp, *stackp;
|
77
|
+
unsigned int *regp;
|
78
|
+
unsigned int regused;
|
79
|
+
ffi_type **p_arg;
|
80
|
+
void *struct_value_ptr;
|
81
|
+
|
82
|
+
regp = (unsigned int *)stack;
|
83
|
+
stackp = (char *)(regp + 8);
|
84
|
+
regused = 0;
|
85
|
+
|
86
|
+
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
|
87
|
+
&& !ecif->cif->flags)
|
88
|
+
struct_value_ptr = ecif->rvalue;
|
89
|
+
else
|
90
|
+
struct_value_ptr = NULL;
|
91
|
+
|
92
|
+
p_argv = ecif->avalue;
|
93
|
+
|
94
|
+
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++)
|
95
|
+
{
|
96
|
+
size_t z;
|
97
|
+
unsigned short t, a;
|
98
|
+
|
99
|
+
z = (*p_arg)->size;
|
100
|
+
t = (*p_arg)->type;
|
101
|
+
a = (*p_arg)->alignment;
|
102
|
+
|
103
|
+
/*
|
104
|
+
* Figure out whether the argument can be passed through registers
|
105
|
+
* or on the stack.
|
106
|
+
* The rule is that registers can only receive simple types not larger
|
107
|
+
* than 64 bits, or structs the exact size of a register and aligned to
|
108
|
+
* the size of a register.
|
109
|
+
*/
|
110
|
+
if (t == FFI_TYPE_STRUCT)
|
111
|
+
{
|
112
|
+
if (z == sizeof (int) && a == sizeof (int) && regused < 8)
|
113
|
+
argp = (char *)regp;
|
114
|
+
else
|
115
|
+
argp = stackp;
|
116
|
+
}
|
117
|
+
else
|
118
|
+
{
|
119
|
+
if (z > sizeof (int) && regused < 8 - 1)
|
120
|
+
{
|
121
|
+
/* align to an even register pair */
|
122
|
+
if (regused & 1)
|
123
|
+
{
|
124
|
+
regp++;
|
125
|
+
regused++;
|
126
|
+
}
|
127
|
+
}
|
128
|
+
if (regused < 8)
|
129
|
+
argp = (char *)regp;
|
130
|
+
else
|
131
|
+
argp = stackp;
|
132
|
+
}
|
133
|
+
|
134
|
+
/* Enforce proper stack alignment of 64-bit types */
|
135
|
+
if (argp == stackp && a > sizeof (int))
|
136
|
+
{
|
137
|
+
stackp = (char *) FFI_ALIGN(stackp, a);
|
138
|
+
argp = stackp;
|
139
|
+
}
|
140
|
+
|
141
|
+
switch (t)
|
142
|
+
{
|
143
|
+
case FFI_TYPE_SINT8:
|
144
|
+
*(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
|
145
|
+
break;
|
146
|
+
|
147
|
+
case FFI_TYPE_UINT8:
|
148
|
+
*(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
|
149
|
+
break;
|
150
|
+
|
151
|
+
case FFI_TYPE_SINT16:
|
152
|
+
*(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
|
153
|
+
break;
|
154
|
+
|
155
|
+
case FFI_TYPE_UINT16:
|
156
|
+
*(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
|
157
|
+
break;
|
158
|
+
|
159
|
+
case FFI_TYPE_INT:
|
160
|
+
case FFI_TYPE_FLOAT:
|
161
|
+
case FFI_TYPE_UINT32:
|
162
|
+
case FFI_TYPE_SINT32:
|
163
|
+
case FFI_TYPE_POINTER:
|
164
|
+
*(unsigned int *) argp = *(unsigned int *) *p_argv;
|
165
|
+
break;
|
166
|
+
|
167
|
+
case FFI_TYPE_DOUBLE:
|
168
|
+
case FFI_TYPE_UINT64:
|
169
|
+
case FFI_TYPE_SINT64:
|
170
|
+
case FFI_TYPE_STRUCT:
|
171
|
+
memcpy (argp, *p_argv, z);
|
172
|
+
break;
|
173
|
+
|
174
|
+
default:
|
175
|
+
FFI_ASSERT (0);
|
176
|
+
}
|
177
|
+
|
178
|
+
/* Align if necessary. */
|
179
|
+
if ((sizeof (int) - 1) & z)
|
180
|
+
z = FFI_ALIGN(z, sizeof (int));
|
181
|
+
|
182
|
+
p_argv++;
|
183
|
+
|
184
|
+
/* Be careful, once all registers are filled, and about to continue
|
185
|
+
on stack, regp == stackp. Therefore the check for regused as well. */
|
186
|
+
if (argp == (char *)regp && regused < 8)
|
187
|
+
{
|
188
|
+
regp += z / sizeof (int);
|
189
|
+
regused += z / sizeof (int);
|
190
|
+
}
|
191
|
+
else
|
192
|
+
stackp += z;
|
193
|
+
}
|
194
|
+
|
195
|
+
return struct_value_ptr;
|
196
|
+
}
|
197
|
+
|
198
|
+
/* Perform machine dependent cif processing */
|
199
|
+
ffi_status
|
200
|
+
ffi_prep_cif_machdep (ffi_cif *cif)
|
201
|
+
{
|
202
|
+
/* Set the return type flag */
|
203
|
+
switch (cif->rtype->type)
|
204
|
+
{
|
205
|
+
case FFI_TYPE_VOID:
|
206
|
+
cif->flags = 0;
|
207
|
+
break;
|
208
|
+
|
209
|
+
case FFI_TYPE_STRUCT:
|
210
|
+
if (cif->rtype->size == sizeof (int) &&
|
211
|
+
cif->rtype->alignment == sizeof (int))
|
212
|
+
cif->flags = CIF_FLAGS_INT;
|
213
|
+
else
|
214
|
+
cif->flags = 0;
|
215
|
+
break;
|
216
|
+
|
217
|
+
case FFI_TYPE_DOUBLE:
|
218
|
+
case FFI_TYPE_SINT64:
|
219
|
+
case FFI_TYPE_UINT64:
|
220
|
+
cif->flags = CIF_FLAGS_DINT;
|
221
|
+
break;
|
222
|
+
|
223
|
+
default:
|
224
|
+
cif->flags = CIF_FLAGS_INT;
|
225
|
+
break;
|
226
|
+
}
|
227
|
+
|
228
|
+
return FFI_OK;
|
229
|
+
}
|
230
|
+
|
231
|
+
void
|
232
|
+
ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
|
233
|
+
{
|
234
|
+
extended_cif ecif;
|
235
|
+
|
236
|
+
ecif.cif = cif;
|
237
|
+
ecif.avalue = avalue;
|
238
|
+
|
239
|
+
/* If the return value is a struct and we don't have a return value
|
240
|
+
address then we need to make one. */
|
241
|
+
|
242
|
+
if (rvalue == NULL
|
243
|
+
&& cif->rtype->type == FFI_TYPE_STRUCT
|
244
|
+
&& (cif->rtype->size != sizeof (int)
|
245
|
+
|| cif->rtype->alignment != sizeof (int)))
|
246
|
+
ecif.rvalue = alloca (cif->rtype->size);
|
247
|
+
else
|
248
|
+
ecif.rvalue = rvalue;
|
249
|
+
|
250
|
+
switch (cif->abi)
|
251
|
+
{
|
252
|
+
case FFI_OBSD:
|
253
|
+
ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn);
|
254
|
+
break;
|
255
|
+
|
256
|
+
default:
|
257
|
+
FFI_ASSERT (0);
|
258
|
+
break;
|
259
|
+
}
|
260
|
+
}
|
261
|
+
|
262
|
+
/*
|
263
|
+
* Closure API
|
264
|
+
*/
|
265
|
+
|
266
|
+
static void
|
267
|
+
ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp,
|
268
|
+
char *stackp)
|
269
|
+
{
|
270
|
+
unsigned int i;
|
271
|
+
void **p_argv;
|
272
|
+
char *argp;
|
273
|
+
unsigned int regused;
|
274
|
+
ffi_type **p_arg;
|
275
|
+
|
276
|
+
regused = 0;
|
277
|
+
|
278
|
+
p_argv = avalue;
|
279
|
+
|
280
|
+
for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
|
281
|
+
{
|
282
|
+
size_t z;
|
283
|
+
unsigned short t, a;
|
284
|
+
|
285
|
+
z = (*p_arg)->size;
|
286
|
+
t = (*p_arg)->type;
|
287
|
+
a = (*p_arg)->alignment;
|
288
|
+
|
289
|
+
/*
|
290
|
+
* Figure out whether the argument has been passed through registers
|
291
|
+
* or on the stack.
|
292
|
+
* The rule is that registers can only receive simple types not larger
|
293
|
+
* than 64 bits, or structs the exact size of a register and aligned to
|
294
|
+
* the size of a register.
|
295
|
+
*/
|
296
|
+
if (t == FFI_TYPE_STRUCT)
|
297
|
+
{
|
298
|
+
if (z == sizeof (int) && a == sizeof (int) && regused < 8)
|
299
|
+
argp = (char *)regp;
|
300
|
+
else
|
301
|
+
argp = stackp;
|
302
|
+
}
|
303
|
+
else
|
304
|
+
{
|
305
|
+
if (z > sizeof (int) && regused < 8 - 1)
|
306
|
+
{
|
307
|
+
/* align to an even register pair */
|
308
|
+
if (regused & 1)
|
309
|
+
{
|
310
|
+
regp++;
|
311
|
+
regused++;
|
312
|
+
}
|
313
|
+
}
|
314
|
+
if (regused < 8)
|
315
|
+
argp = (char *)regp;
|
316
|
+
else
|
317
|
+
argp = stackp;
|
318
|
+
}
|
319
|
+
|
320
|
+
/* Enforce proper stack alignment of 64-bit types */
|
321
|
+
if (argp == stackp && a > sizeof (int))
|
322
|
+
{
|
323
|
+
stackp = (char *) FFI_ALIGN(stackp, a);
|
324
|
+
argp = stackp;
|
325
|
+
}
|
326
|
+
|
327
|
+
if (z < sizeof (int) && t != FFI_TYPE_STRUCT)
|
328
|
+
*p_argv = (void *) (argp + sizeof (int) - z);
|
329
|
+
else
|
330
|
+
*p_argv = (void *) argp;
|
331
|
+
|
332
|
+
/* Align if necessary */
|
333
|
+
if ((sizeof (int) - 1) & z)
|
334
|
+
z = FFI_ALIGN(z, sizeof (int));
|
335
|
+
|
336
|
+
p_argv++;
|
337
|
+
|
338
|
+
/* Be careful, once all registers are exhausted, and about to fetch from
|
339
|
+
stack, regp == stackp. Therefore the check for regused as well. */
|
340
|
+
if (argp == (char *)regp && regused < 8)
|
341
|
+
{
|
342
|
+
regp += z / sizeof (int);
|
343
|
+
regused += z / sizeof (int);
|
344
|
+
}
|
345
|
+
else
|
346
|
+
stackp += z;
|
347
|
+
}
|
348
|
+
}
|
349
|
+
|
350
|
+
unsigned int
|
351
|
+
ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp,
|
352
|
+
char *stackp)
|
353
|
+
{
|
354
|
+
ffi_cif *cif;
|
355
|
+
void **arg_area;
|
356
|
+
|
357
|
+
cif = closure->cif;
|
358
|
+
arg_area = (void**) alloca (cif->nargs * sizeof (void *));
|
359
|
+
|
360
|
+
ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp);
|
361
|
+
|
362
|
+
(closure->fun) (cif, resp, arg_area, closure->user_data);
|
363
|
+
|
364
|
+
return cif->flags;
|
365
|
+
}
|
366
|
+
|
367
|
+
ffi_status
|
368
|
+
ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif,
|
369
|
+
void (*fun)(ffi_cif*,void*,void**,void*),
|
370
|
+
void *user_data, void *codeloc)
|
371
|
+
{
|
372
|
+
unsigned int *tramp = (unsigned int *) codeloc;
|
373
|
+
void *fn;
|
374
|
+
|
375
|
+
FFI_ASSERT (cif->abi == FFI_OBSD);
|
376
|
+
|
377
|
+
if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags)
|
378
|
+
fn = &ffi_closure_struct_OBSD;
|
379
|
+
else
|
380
|
+
fn = &ffi_closure_OBSD;
|
381
|
+
|
382
|
+
/* or.u %r10, %r0, %hi16(fn) */
|
383
|
+
tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16);
|
384
|
+
/* or.u %r13, %r0, %hi16(closure) */
|
385
|
+
tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16);
|
386
|
+
/* or %r10, %r10, %lo16(fn) */
|
387
|
+
tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff);
|
388
|
+
/* jmp.n %r10 */
|
389
|
+
tramp[3] = 0xf400c40a;
|
390
|
+
/* or %r13, %r13, %lo16(closure) */
|
391
|
+
tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff);
|
392
|
+
|
393
|
+
ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE);
|
394
|
+
|
395
|
+
closure->cif = cif;
|
396
|
+
closure->user_data = user_data;
|
397
|
+
closure->fun = fun;
|
398
|
+
|
399
|
+
return FFI_OK;
|
400
|
+
}
|