ffi 1.15.5 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +118 -0
- data/Gemfile +10 -3
- data/README.md +4 -3
- data/Rakefile +25 -10
- data/ext/ffi_c/AbstractMemory.c +99 -74
- data/ext/ffi_c/AbstractMemory.h +3 -2
- data/ext/ffi_c/ArrayType.c +51 -15
- data/ext/ffi_c/ArrayType.h +1 -0
- data/ext/ffi_c/Buffer.c +90 -33
- data/ext/ffi_c/Call.c +29 -12
- data/ext/ffi_c/Call.h +3 -2
- data/ext/ffi_c/DynamicLibrary.c +90 -27
- data/ext/ffi_c/Function.c +244 -98
- data/ext/ffi_c/Function.h +1 -0
- data/ext/ffi_c/FunctionInfo.c +81 -25
- data/ext/ffi_c/LastError.c +29 -11
- data/ext/ffi_c/MappedType.c +66 -23
- data/ext/ffi_c/MappedType.h +0 -2
- data/ext/ffi_c/MemoryPointer.c +36 -9
- data/ext/ffi_c/MethodHandle.c +3 -1
- data/ext/ffi_c/Pointer.c +82 -40
- data/ext/ffi_c/Pointer.h +1 -0
- data/ext/ffi_c/Struct.c +166 -84
- data/ext/ffi_c/Struct.h +7 -4
- data/ext/ffi_c/StructByValue.c +48 -16
- data/ext/ffi_c/StructLayout.c +130 -61
- data/ext/ffi_c/Type.c +120 -51
- data/ext/ffi_c/Type.h +3 -1
- data/ext/ffi_c/Types.c +8 -2
- data/ext/ffi_c/Types.h +0 -1
- data/ext/ffi_c/Variadic.c +71 -26
- data/ext/ffi_c/compat.h +22 -22
- data/ext/ffi_c/extconf.rb +19 -2
- data/ext/ffi_c/ffi.c +4 -0
- data/ext/ffi_c/libffi/.allow-ai-service +0 -0
- data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
- data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
- data/ext/ffi_c/libffi/.appveyor.yml +27 -9
- data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
- data/ext/ffi_c/libffi/.ci/build.sh +124 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
- data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
- data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
- data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
- data/ext/ffi_c/libffi/.gitignore +10 -2
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +12 -5
- data/ext/ffi_c/libffi/Makefile.in +118 -51
- data/ext/ffi_c/libffi/README.md +150 -105
- data/ext/ffi_c/libffi/acinclude.m4 +10 -112
- data/ext/ffi_c/libffi/compile +348 -0
- data/ext/ffi_c/libffi/config.guess +623 -556
- data/ext/ffi_c/libffi/config.sub +75 -34
- data/ext/ffi_c/libffi/configure +4571 -3830
- data/ext/ffi_c/libffi/configure.ac +64 -28
- data/ext/ffi_c/libffi/configure.host +26 -7
- data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
- data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
- data/ext/ffi_c/libffi/include/Makefile.am +1 -1
- data/ext/ffi_c/libffi/include/Makefile.in +10 -9
- data/ext/ffi_c/libffi/include/ffi.h.in +55 -60
- data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +33 -2
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +92 -69
- data/ext/ffi_c/libffi/libffi.map.in +5 -0
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +518 -333
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
- data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
- data/ext/ffi_c/libffi/man/Makefile.in +9 -6
- data/ext/ffi_c/libffi/missing +1 -1
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +2 -2
- data/ext/ffi_c/libffi/msvcc.sh +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +172 -55
- data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +331 -87
- data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
- data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
- data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
- data/ext/ffi_c/libffi/src/closures.c +136 -50
- data/ext/ffi_c/libffi/src/debug.c +2 -2
- data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
- data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
- data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
- data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
- data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
- data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
- data/ext/ffi_c/libffi/src/mips/ffi.c +250 -67
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +193 -33
- data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
- data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
- data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
- data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
- data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
- data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
- data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
- data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +23 -1
- data/ext/ffi_c/libffi/src/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/types.c +4 -6
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
- data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
- data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +44 -1
- data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
- data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
- data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
- data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -114
- data/ext/ffi_c/libffi/testsuite/Makefile.in +89 -121
- data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
- data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
- data/ext/ffi_c/libffi.bsd.mk +2 -2
- data/ext/ffi_c/libffi.darwin.mk +2 -2
- data/ext/ffi_c/libffi.gnu.mk +2 -2
- data/ext/ffi_c/rbffi.h +1 -1
- data/ffi.gemspec +3 -3
- data/lib/ffi/autopointer.rb +8 -31
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +2 -2
- data/lib/ffi/dynamic_library.rb +118 -0
- data/lib/ffi/enum.rb +18 -12
- data/lib/ffi/ffi.rb +3 -0
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/io.rb +2 -2
- data/lib/ffi/library.rb +72 -88
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +1 -1
- data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
- data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
- data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
- data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
- data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
- data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
- data/lib/ffi/platform.rb +15 -13
- data/lib/ffi/pointer.rb +6 -6
- data/lib/ffi/struct.rb +6 -5
- data/lib/ffi/struct_layout.rb +3 -3
- data/lib/ffi/struct_layout_builder.rb +9 -9
- data/lib/ffi/types.rb +65 -37
- data/lib/ffi/variadic.rb +19 -8
- data/lib/ffi/version.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data/sig/ffi/abstract_memory.rbs +165 -0
- data/sig/ffi/auto_pointer.rbs +27 -0
- data/sig/ffi/buffer.rbs +18 -0
- data/sig/ffi/data_converter.rbs +10 -0
- data/sig/ffi/dynamic_library.rbs +9 -0
- data/sig/ffi/enum.rbs +38 -0
- data/sig/ffi/function.rbs +39 -0
- data/sig/ffi/library.rbs +42 -0
- data/sig/ffi/native_type.rbs +86 -0
- data/sig/ffi/pointer.rbs +42 -0
- data/sig/ffi/struct.rbs +76 -0
- data/sig/ffi/struct_by_reference.rbs +11 -0
- data/sig/ffi/struct_by_value.rbs +7 -0
- data/sig/ffi/struct_layout.rbs +9 -0
- data/sig/ffi/struct_layout_builder.rbs +5 -0
- data/sig/ffi/type.rbs +39 -0
- data/sig/ffi.rbs +26 -0
- data.tar.gz.sig +0 -0
- metadata +122 -28
- metadata.gz.sig +1 -0
- data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
- data/ext/ffi_c/libffi/.travis/build.sh +0 -142
- data/ext/ffi_c/libffi/.travis.yml +0 -83
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
- /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
- /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
- /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
@@ -114,6 +114,16 @@ loadregs:
|
|
114
114
|
|
115
115
|
REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6.
|
116
116
|
|
117
|
+
# when retval is _Complex long double, $f12/$a0, $f13/$a1 will be skipped
|
118
|
+
# no idea why, but gcc does it.
|
119
|
+
SRL t4, t6, 8*FFI_FLAG_BITS
|
120
|
+
move t8, t6
|
121
|
+
bne t4, FFI_TYPE_COMPLEX_LDLD, loadregs1
|
122
|
+
|
123
|
+
SLL t8, t6, 2*FFI_FLAG_BITS
|
124
|
+
|
125
|
+
|
126
|
+
loadregs1:
|
117
127
|
#ifdef __mips_soft_float
|
118
128
|
REG_L a0, 0*FFI_SIZEOF_ARG(t9)
|
119
129
|
REG_L a1, 1*FFI_SIZEOF_ARG(t9)
|
@@ -124,7 +134,7 @@ loadregs:
|
|
124
134
|
REG_L a6, 6*FFI_SIZEOF_ARG(t9)
|
125
135
|
REG_L a7, 7*FFI_SIZEOF_ARG(t9)
|
126
136
|
#else
|
127
|
-
and t4,
|
137
|
+
and t4, t8, ((1<<FFI_FLAG_BITS)-1)
|
128
138
|
REG_L a0, 0*FFI_SIZEOF_ARG(t9)
|
129
139
|
beqz t4, arg1_next
|
130
140
|
bne t4, FFI_TYPE_FLOAT, arg1_doublep
|
@@ -134,7 +144,7 @@ arg1_doublep:
|
|
134
144
|
l.d $f12, 0*FFI_SIZEOF_ARG(t9)
|
135
145
|
arg1_next:
|
136
146
|
|
137
|
-
SRL t4,
|
147
|
+
SRL t4, t8, 1*FFI_FLAG_BITS
|
138
148
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
139
149
|
REG_L a1, 1*FFI_SIZEOF_ARG(t9)
|
140
150
|
beqz t4, arg2_next
|
@@ -145,7 +155,7 @@ arg2_doublep:
|
|
145
155
|
l.d $f13, 1*FFI_SIZEOF_ARG(t9)
|
146
156
|
arg2_next:
|
147
157
|
|
148
|
-
SRL t4,
|
158
|
+
SRL t4, t8, 2*FFI_FLAG_BITS
|
149
159
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
150
160
|
REG_L a2, 2*FFI_SIZEOF_ARG(t9)
|
151
161
|
beqz t4, arg3_next
|
@@ -156,7 +166,7 @@ arg3_doublep:
|
|
156
166
|
l.d $f14, 2*FFI_SIZEOF_ARG(t9)
|
157
167
|
arg3_next:
|
158
168
|
|
159
|
-
SRL t4,
|
169
|
+
SRL t4, t8, 3*FFI_FLAG_BITS
|
160
170
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
161
171
|
REG_L a3, 3*FFI_SIZEOF_ARG(t9)
|
162
172
|
beqz t4, arg4_next
|
@@ -167,7 +177,7 @@ arg4_doublep:
|
|
167
177
|
l.d $f15, 3*FFI_SIZEOF_ARG(t9)
|
168
178
|
arg4_next:
|
169
179
|
|
170
|
-
SRL t4,
|
180
|
+
SRL t4, t8, 4*FFI_FLAG_BITS
|
171
181
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
172
182
|
REG_L a4, 4*FFI_SIZEOF_ARG(t9)
|
173
183
|
beqz t4, arg5_next
|
@@ -178,7 +188,7 @@ arg5_doublep:
|
|
178
188
|
l.d $f16, 4*FFI_SIZEOF_ARG(t9)
|
179
189
|
arg5_next:
|
180
190
|
|
181
|
-
SRL t4,
|
191
|
+
SRL t4, t8, 5*FFI_FLAG_BITS
|
182
192
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
183
193
|
REG_L a5, 5*FFI_SIZEOF_ARG(t9)
|
184
194
|
beqz t4, arg6_next
|
@@ -189,7 +199,7 @@ arg6_doublep:
|
|
189
199
|
l.d $f17, 5*FFI_SIZEOF_ARG(t9)
|
190
200
|
arg6_next:
|
191
201
|
|
192
|
-
SRL t4,
|
202
|
+
SRL t4, t8, 6*FFI_FLAG_BITS
|
193
203
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
194
204
|
REG_L a6, 6*FFI_SIZEOF_ARG(t9)
|
195
205
|
beqz t4, arg7_next
|
@@ -200,7 +210,7 @@ arg7_doublep:
|
|
200
210
|
l.d $f18, 6*FFI_SIZEOF_ARG(t9)
|
201
211
|
arg7_next:
|
202
212
|
|
203
|
-
SRL t4,
|
213
|
+
SRL t4, t8, 7*FFI_FLAG_BITS
|
204
214
|
and t4, ((1<<FFI_FLAG_BITS)-1)
|
205
215
|
REG_L a7, 7*FFI_SIZEOF_ARG(t9)
|
206
216
|
beqz t4, arg8_next
|
@@ -212,7 +222,7 @@ arg8_doublep:
|
|
212
222
|
arg8_next:
|
213
223
|
#endif
|
214
224
|
|
215
|
-
callit:
|
225
|
+
callit:
|
216
226
|
# Load the function pointer
|
217
227
|
REG_L t9, 5*FFI_SIZEOF_ARG($fp)
|
218
228
|
|
@@ -226,12 +236,54 @@ callit:
|
|
226
236
|
# Shift the return type flag over
|
227
237
|
SRL t6, 8*FFI_FLAG_BITS
|
228
238
|
|
229
|
-
|
230
|
-
|
231
|
-
|
239
|
+
bne t6, FFI_TYPE_UINT64, retsint32
|
240
|
+
|
241
|
+
retuint64:
|
232
242
|
jal t9
|
233
243
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
234
|
-
|
244
|
+
sd v0, 0(t4)
|
245
|
+
b epilogue
|
246
|
+
|
247
|
+
retsint32:
|
248
|
+
bne t6, FFI_TYPE_SINT32, retuint16
|
249
|
+
jal t9
|
250
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
251
|
+
sll v0, v0, 0
|
252
|
+
sd v0, 0(t4)
|
253
|
+
b epilogue
|
254
|
+
|
255
|
+
retuint16:
|
256
|
+
bne t6, FFI_TYPE_UINT16, retsint16
|
257
|
+
jal t9
|
258
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
259
|
+
andi v0, v0, 0xffff
|
260
|
+
sd v0, 0(t4)
|
261
|
+
b epilogue
|
262
|
+
|
263
|
+
retsint16:
|
264
|
+
bne t6, FFI_TYPE_SINT16, retuint8
|
265
|
+
jal t9
|
266
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
267
|
+
dsll v0, v0, 48
|
268
|
+
dsra v0, v0, 48
|
269
|
+
sd v0, 0(t4)
|
270
|
+
b epilogue
|
271
|
+
|
272
|
+
retuint8:
|
273
|
+
bne t6, FFI_TYPE_UINT8, retsint8
|
274
|
+
jal t9
|
275
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
276
|
+
andi v0, v0, 0xff
|
277
|
+
sd v0, 0(t4)
|
278
|
+
b epilogue
|
279
|
+
|
280
|
+
retsint8:
|
281
|
+
bne t6, FFI_TYPE_SINT8, retfloat
|
282
|
+
jal t9
|
283
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
284
|
+
sd v0, 0(t4)
|
285
|
+
dsll v0, v0, 56
|
286
|
+
dsra v0, v0, 56
|
235
287
|
b epilogue
|
236
288
|
|
237
289
|
retfloat:
|
@@ -249,7 +301,7 @@ retdouble:
|
|
249
301
|
s.d $f0, 0(t4)
|
250
302
|
b epilogue
|
251
303
|
|
252
|
-
retstruct_d:
|
304
|
+
retstruct_d:
|
253
305
|
bne t6, FFI_TYPE_STRUCT_D, retstruct_f
|
254
306
|
jal t9
|
255
307
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
@@ -263,16 +315,37 @@ retstruct_f:
|
|
263
315
|
s.s $f0, 0(t4)
|
264
316
|
b epilogue
|
265
317
|
|
266
|
-
retstruct_d_d:
|
267
|
-
bne t6, FFI_TYPE_STRUCT_DD,
|
318
|
+
retstruct_d_d:
|
319
|
+
bne t6, FFI_TYPE_STRUCT_DD, retcomplex_d_d
|
268
320
|
jal t9
|
269
321
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
270
322
|
s.d $f0, 0(t4)
|
271
323
|
s.d $f2, 8(t4)
|
272
324
|
b epilogue
|
325
|
+
|
326
|
+
retcomplex_d_d:
|
327
|
+
bne t6, FFI_TYPE_COMPLEX_DD, retcomplex_ld_ld
|
328
|
+
jal t9
|
329
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
330
|
+
s.d $f0, 0(t4)
|
331
|
+
s.d $f2, 8(t4)
|
332
|
+
b epilogue
|
333
|
+
|
334
|
+
retcomplex_ld_ld:
|
335
|
+
bne t6, FFI_TYPE_COMPLEX_LDLD, retstruct_f_f
|
336
|
+
jal t9
|
337
|
+
b epilogue
|
273
338
|
|
274
|
-
retstruct_f_f:
|
275
|
-
bne t6, FFI_TYPE_STRUCT_FF,
|
339
|
+
retstruct_f_f:
|
340
|
+
bne t6, FFI_TYPE_STRUCT_FF, retcomplex_f_f
|
341
|
+
jal t9
|
342
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
343
|
+
s.s $f0, 0(t4)
|
344
|
+
s.s $f2, 4(t4)
|
345
|
+
b epilogue
|
346
|
+
|
347
|
+
retcomplex_f_f:
|
348
|
+
bne t6, FFI_TYPE_COMPLEX_FF, retstruct_d_f
|
276
349
|
jal t9
|
277
350
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
278
351
|
s.s $f0, 0(t4)
|
@@ -315,7 +388,7 @@ retstruct_d_d_soft:
|
|
315
388
|
jal t9
|
316
389
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
317
390
|
sd v0, 0(t4)
|
318
|
-
sd
|
391
|
+
sd a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
|
319
392
|
b epilogue
|
320
393
|
|
321
394
|
retstruct_f_f_soft:
|
@@ -339,7 +412,7 @@ retstruct_f_d_soft:
|
|
339
412
|
jal t9
|
340
413
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
341
414
|
sw v0, 0(t4)
|
342
|
-
sd
|
415
|
+
sd a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
|
343
416
|
b epilogue
|
344
417
|
|
345
418
|
retstruct_small:
|
@@ -350,14 +423,37 @@ retstruct_small:
|
|
350
423
|
b epilogue
|
351
424
|
|
352
425
|
retstruct_small2:
|
353
|
-
bne t6, FFI_TYPE_STRUCT_SMALL2,
|
426
|
+
bne t6, FFI_TYPE_STRUCT_SMALL2, retlongdouble_soft
|
354
427
|
jal t9
|
355
428
|
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
356
429
|
REG_S v0, 0(t4)
|
357
430
|
REG_S v1, 8(t4)
|
358
431
|
b epilogue
|
359
432
|
|
360
|
-
|
433
|
+
retlongdouble_soft:
|
434
|
+
bne t6, FFI_TYPE_LONGDOUBLE, retcomplex_small
|
435
|
+
jal t9
|
436
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
437
|
+
REG_S v0, 0(t4)
|
438
|
+
REG_S a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
|
439
|
+
b epilogue
|
440
|
+
|
441
|
+
retcomplex_small:
|
442
|
+
bne t6, FFI_TYPE_COMPLEX_SMALL, retcomplex_small2
|
443
|
+
jal t9
|
444
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
445
|
+
REG_S v0, 0(t4)
|
446
|
+
b epilogue
|
447
|
+
|
448
|
+
retcomplex_small2:
|
449
|
+
bne t6, FFI_TYPE_COMPLEX_SMALL2, retstruct
|
450
|
+
jal t9
|
451
|
+
REG_L t4, 4*FFI_SIZEOF_ARG($fp)
|
452
|
+
REG_S v0, 0(t4)
|
453
|
+
REG_S v1, 8(t4)
|
454
|
+
b epilogue
|
455
|
+
|
456
|
+
retstruct:
|
361
457
|
noretval:
|
362
458
|
jal t9
|
363
459
|
|
@@ -403,7 +499,7 @@ epilogue:
|
|
403
499
|
*/
|
404
500
|
|
405
501
|
#define SIZEOF_FRAME2 (20 * FFI_SIZEOF_ARG)
|
406
|
-
|
502
|
+
|
407
503
|
#define A7_OFF2 (19 * FFI_SIZEOF_ARG)
|
408
504
|
#define A6_OFF2 (18 * FFI_SIZEOF_ARG)
|
409
505
|
#define A5_OFF2 (17 * FFI_SIZEOF_ARG)
|
@@ -451,8 +547,13 @@ ffi_go_closure_N32:
|
|
451
547
|
|
452
548
|
# Call ffi_closure_mips_inner_N32 to do the real work.
|
453
549
|
LA t9, ffi_closure_mips_inner_N32
|
550
|
+
#if _MIPS_SIM==_ABIN32
|
551
|
+
lw a0, 4($15) # cif
|
552
|
+
lw a1, 8($15) # fun
|
553
|
+
#else
|
454
554
|
REG_L a0, 8($15) # cif
|
455
555
|
REG_L a1, 16($15) # fun
|
556
|
+
#endif
|
456
557
|
move a2, t7 # userdata=closure
|
457
558
|
ADDU a3, $sp, V0_OFF2 # rvalue
|
458
559
|
ADDU a4, $sp, A0_OFF2 # ar
|
@@ -485,10 +586,17 @@ ffi_closure_N32:
|
|
485
586
|
|
486
587
|
# Call ffi_closure_mips_inner_N32 to do the real work.
|
487
588
|
LA t9, ffi_closure_mips_inner_N32
|
589
|
+
#if _MIPS_SIM==_ABIN32
|
590
|
+
lw a0, 20($12) # cif
|
591
|
+
lw a1, 24($12) # fun
|
592
|
+
lw a2, 28($12) # user_data
|
593
|
+
#else
|
488
594
|
REG_L a0, 56($12) # cif
|
489
595
|
REG_L a1, 64($12) # fun
|
490
596
|
REG_L a2, 72($12) # user_data
|
597
|
+
#endif
|
491
598
|
ADDU a3, $sp, V0_OFF2
|
599
|
+
# FIXME: a4 does work, while if ret is _Complex long double, it will overwrite Fn_OFF2
|
492
600
|
ADDU a4, $sp, A0_OFF2
|
493
601
|
ADDU a5, $sp, F12_OFF2
|
494
602
|
|
@@ -512,14 +620,35 @@ $do_closure:
|
|
512
620
|
|
513
621
|
jalr t9
|
514
622
|
|
623
|
+
cls_retuint64:
|
515
624
|
# Return flags are in v0
|
516
|
-
bne v0,
|
625
|
+
bne v0, FFI_TYPE_UINT64, cls_retsint32
|
626
|
+
ld v0, V0_OFF2($sp)
|
627
|
+
b cls_epilogue
|
628
|
+
|
629
|
+
cls_retsint32:
|
630
|
+
bne v0, FFI_TYPE_SINT32, cls_retsint16
|
517
631
|
lw v0, V0_OFF2($sp)
|
518
632
|
b cls_epilogue
|
519
633
|
|
520
|
-
|
521
|
-
bne v0,
|
522
|
-
|
634
|
+
cls_retsint16:
|
635
|
+
bne v0, FFI_TYPE_SINT16, cls_retuint16
|
636
|
+
lh v0, V0_OFF2($sp)
|
637
|
+
b cls_epilogue
|
638
|
+
|
639
|
+
cls_retuint16:
|
640
|
+
bne v0, FFI_TYPE_UINT16, cls_retsint8
|
641
|
+
lhu v0, V0_OFF2($sp)
|
642
|
+
b cls_epilogue
|
643
|
+
|
644
|
+
cls_retsint8:
|
645
|
+
bne v0, FFI_TYPE_SINT8, cls_retuint8
|
646
|
+
lb v0, V0_OFF2($sp)
|
647
|
+
b cls_epilogue
|
648
|
+
|
649
|
+
cls_retuint8:
|
650
|
+
bne v0, FFI_TYPE_UINT8, cls_retfloat
|
651
|
+
lbu v0, V0_OFF2($sp)
|
523
652
|
b cls_epilogue
|
524
653
|
|
525
654
|
cls_retfloat:
|
@@ -544,17 +673,29 @@ cls_retstruct_f:
|
|
544
673
|
b cls_epilogue
|
545
674
|
|
546
675
|
cls_retstruct_d_d:
|
547
|
-
bne v0, FFI_TYPE_STRUCT_DD,
|
676
|
+
bne v0, FFI_TYPE_STRUCT_DD, cls_retcomplex_d_d
|
677
|
+
l.d $f0, V0_OFF2($sp)
|
678
|
+
l.d $f2, V1_OFF2($sp)
|
679
|
+
b cls_epilogue
|
680
|
+
|
681
|
+
cls_retcomplex_d_d:
|
682
|
+
bne v0, FFI_TYPE_COMPLEX_DD, cls_retcomplex_f_f
|
548
683
|
l.d $f0, V0_OFF2($sp)
|
549
684
|
l.d $f2, V1_OFF2($sp)
|
550
685
|
b cls_epilogue
|
551
686
|
|
552
|
-
cls_retstruct_f_f:
|
553
|
-
bne v0, FFI_TYPE_STRUCT_FF,
|
687
|
+
cls_retstruct_f_f:
|
688
|
+
bne v0, FFI_TYPE_STRUCT_FF, cls_retcomplex_f_f
|
554
689
|
l.s $f0, V0_OFF2($sp)
|
555
690
|
l.s $f2, V1_OFF2($sp)
|
556
691
|
b cls_epilogue
|
557
692
|
|
693
|
+
cls_retcomplex_f_f:
|
694
|
+
bne v0, FFI_TYPE_COMPLEX_FF, cls_retstruct_d_f
|
695
|
+
l.s $f0, V0_OFF2($sp)
|
696
|
+
l.s $f2, (V0_OFF2+4)($sp)
|
697
|
+
b cls_epilogue
|
698
|
+
|
558
699
|
cls_retstruct_d_f:
|
559
700
|
bne v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
|
560
701
|
l.d $f0, V0_OFF2($sp)
|
@@ -562,12 +703,31 @@ cls_retstruct_d_f:
|
|
562
703
|
b cls_epilogue
|
563
704
|
|
564
705
|
cls_retstruct_f_d:
|
565
|
-
bne v0, FFI_TYPE_STRUCT_FD,
|
706
|
+
bne v0, FFI_TYPE_STRUCT_FD, cls_retcomplex_ld_ld
|
566
707
|
l.s $f0, V0_OFF2($sp)
|
567
708
|
l.d $f2, V1_OFF2($sp)
|
568
709
|
b cls_epilogue
|
710
|
+
#else
|
711
|
+
cls_longdouble_soft:
|
712
|
+
bne v0, FFI_TYPE_LONGDOUBLE, cls_retcomplex_ld_ld
|
713
|
+
REG_L v0, V0_OFF2($sp)
|
714
|
+
REG_L a0, V1_OFF2($sp) # not typo, it is a0, I have no idea, gcc does do it
|
715
|
+
b cls_epilogue
|
569
716
|
#endif
|
570
|
-
|
717
|
+
|
718
|
+
cls_retcomplex_ld_ld:
|
719
|
+
bne v0, FFI_TYPE_COMPLEX_LDLD, cls_retstruct_small2
|
720
|
+
REG_L t8, A0_OFF2($sp)
|
721
|
+
REG_L t9, 16($sp)
|
722
|
+
REG_S t9, 0(t8)
|
723
|
+
REG_L t9, 24($sp)
|
724
|
+
REG_S t9, 8(t8)
|
725
|
+
REG_L t9, 32($sp)
|
726
|
+
REG_S t9, 16(t8)
|
727
|
+
REG_L t9, 40($sp)
|
728
|
+
REG_S t9, 24(t8)
|
729
|
+
b cls_epilogue
|
730
|
+
|
571
731
|
cls_retstruct_small2:
|
572
732
|
REG_L v0, V0_OFF2($sp)
|
573
733
|
REG_L v1, V1_OFF2($sp)
|
@@ -582,7 +742,7 @@ cls_epilogue:
|
|
582
742
|
.end ffi_closure_N32
|
583
743
|
|
584
744
|
#ifdef __GNUC__
|
585
|
-
.section .eh_frame,
|
745
|
+
.section .eh_frame,EH_FRAME_FLAGS,@progbits
|
586
746
|
.Lframe1:
|
587
747
|
.4byte .LECIE1-.LSCIE1 # length
|
588
748
|
.LSCIE1:
|
@@ -133,6 +133,7 @@ pass_f_d:
|
|
133
133
|
# bne t0, FFI_ARGS_F_D, call_it
|
134
134
|
l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args
|
135
135
|
l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float
|
136
|
+
|
136
137
|
#endif
|
137
138
|
|
138
139
|
call_it:
|
@@ -146,7 +147,8 @@ call_it:
|
|
146
147
|
REG_L t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
147
148
|
beqz t1, noretval
|
148
149
|
|
149
|
-
|
150
|
+
and t1, t2, ((1<<4)-1)
|
151
|
+
bne t1, FFI_TYPE_INT, retlonglong
|
150
152
|
jalr t9
|
151
153
|
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
152
154
|
REG_S v0, 0(t0)
|
@@ -154,7 +156,7 @@ call_it:
|
|
154
156
|
|
155
157
|
retlonglong:
|
156
158
|
# Really any 64-bit int, signed or not.
|
157
|
-
bne
|
159
|
+
bne t1, FFI_TYPE_UINT64, retfloat
|
158
160
|
jalr t9
|
159
161
|
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
160
162
|
REG_S v1, 4(t0)
|
@@ -162,7 +164,7 @@ retlonglong:
|
|
162
164
|
b epilogue
|
163
165
|
|
164
166
|
retfloat:
|
165
|
-
bne
|
167
|
+
bne t1, FFI_TYPE_FLOAT, retdouble
|
166
168
|
jalr t9
|
167
169
|
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
168
170
|
#ifndef __mips_soft_float
|
@@ -173,7 +175,7 @@ retfloat:
|
|
173
175
|
b epilogue
|
174
176
|
|
175
177
|
retdouble:
|
176
|
-
bne
|
178
|
+
bne t1, FFI_TYPE_DOUBLE, retcomplex
|
177
179
|
jalr t9
|
178
180
|
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
179
181
|
#ifndef __mips_soft_float
|
@@ -184,6 +186,48 @@ retdouble:
|
|
184
186
|
#endif
|
185
187
|
b epilogue
|
186
188
|
|
189
|
+
retcomplex:
|
190
|
+
# mask out the complex elements type.
|
191
|
+
# the struct of flags (bits):
|
192
|
+
# 0-1: arg0
|
193
|
+
# 2-3: arg1
|
194
|
+
# 4-7: return type
|
195
|
+
# 8-11: rtype elements type: for complex
|
196
|
+
# Note here: t2 is flags>>4
|
197
|
+
bne t1, FFI_TYPE_COMPLEX, noretval
|
198
|
+
jalr t9
|
199
|
+
REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
|
200
|
+
REG_L t1, A3_OFF($fp) # load the flags word
|
201
|
+
SRL t1, t1, 8
|
202
|
+
li t3, 3
|
203
|
+
beq t1, t3, 3f # double
|
204
|
+
li t3, 2
|
205
|
+
beq t1, t3, 2f # float
|
206
|
+
# FIXME: long double
|
207
|
+
slti t3, t1, 5
|
208
|
+
beqz t3, 5f # (u)int8/16/32/64
|
209
|
+
2:
|
210
|
+
#ifndef __mips_soft_float
|
211
|
+
s.s $f0, 0(t0)
|
212
|
+
s.s $f2, 4(t0)
|
213
|
+
#else
|
214
|
+
# FIXME: do nothing can pass all of the testsuite
|
215
|
+
#endif
|
216
|
+
b epilogue
|
217
|
+
3:
|
218
|
+
#ifndef __mips_soft_float
|
219
|
+
s.d $f0, 0(t0)
|
220
|
+
s.d $f2, 8(t0)
|
221
|
+
#else
|
222
|
+
# FIXME: do nothing can pass all of the testsuite
|
223
|
+
#endif
|
224
|
+
b epilogue
|
225
|
+
|
226
|
+
5:
|
227
|
+
REG_S v1, 4(t0)
|
228
|
+
REG_S v0, 0(t0)
|
229
|
+
b epilogue
|
230
|
+
|
187
231
|
noretval:
|
188
232
|
jalr t9
|
189
233
|
|
@@ -378,6 +422,19 @@ $do_closure:
|
|
378
422
|
li $9, FFI_TYPE_DOUBLE
|
379
423
|
l.d $f0, V0_OFF2($fp)
|
380
424
|
beq $8, $9, closure_done
|
425
|
+
|
426
|
+
li $9, FFI_TYPE_COMPLEX
|
427
|
+
bne $8, $9, 1f
|
428
|
+
|
429
|
+
li $9, 8
|
430
|
+
l.s $f0, V0_OFF2($fp)
|
431
|
+
l.s $f2, V1_OFF2($fp)
|
432
|
+
beq $3, $9, closure_done
|
433
|
+
|
434
|
+
li $9, 16
|
435
|
+
l.d $f0, V0_OFF2($fp)
|
436
|
+
l.d $f2, (V0_OFF2+8)($fp)
|
437
|
+
beq $3, $9, closure_done
|
381
438
|
#endif
|
382
439
|
1:
|
383
440
|
REG_L $3, V1_OFF2($fp)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
ffi.c - Copyright (C) 2012, 2013, 2018 Anthony Green
|
3
|
-
|
4
|
-
Moxie Foreign Function Interface
|
2
|
+
ffi.c - Copyright (C) 2012, 2013, 2018, 2021, 2022 Anthony Green
|
3
|
+
|
4
|
+
Moxie Foreign Function Interface
|
5
5
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining
|
7
7
|
a copy of this software and associated documentation files (the
|
@@ -54,14 +54,14 @@ void *ffi_prep_args(char *stack, extended_cif *ecif)
|
|
54
54
|
i--, p_arg++)
|
55
55
|
{
|
56
56
|
size_t z;
|
57
|
-
|
57
|
+
|
58
58
|
z = (*p_arg)->size;
|
59
59
|
|
60
60
|
if ((*p_arg)->type == FFI_TYPE_STRUCT)
|
61
61
|
{
|
62
62
|
z = sizeof(void*);
|
63
63
|
*(void **) argp = *p_argv;
|
64
|
-
}
|
64
|
+
}
|
65
65
|
else if (z < sizeof(int))
|
66
66
|
{
|
67
67
|
z = sizeof(int);
|
@@ -70,19 +70,19 @@ void *ffi_prep_args(char *stack, extended_cif *ecif)
|
|
70
70
|
case FFI_TYPE_SINT8:
|
71
71
|
*(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
|
72
72
|
break;
|
73
|
-
|
73
|
+
|
74
74
|
case FFI_TYPE_UINT8:
|
75
75
|
*(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
|
76
76
|
break;
|
77
|
-
|
77
|
+
|
78
78
|
case FFI_TYPE_SINT16:
|
79
79
|
*(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
|
80
80
|
break;
|
81
|
-
|
81
|
+
|
82
82
|
case FFI_TYPE_UINT16:
|
83
83
|
*(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
|
84
84
|
break;
|
85
|
-
|
85
|
+
|
86
86
|
default:
|
87
87
|
FFI_ASSERT(0);
|
88
88
|
}
|
@@ -116,26 +116,28 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
116
116
|
return FFI_OK;
|
117
117
|
}
|
118
118
|
|
119
|
-
extern void ffi_call_EABI(void *(*)(char *, extended_cif *),
|
120
|
-
extended_cif *,
|
121
|
-
unsigned, unsigned,
|
122
|
-
unsigned *,
|
119
|
+
extern void ffi_call_EABI(void *(*)(char *, extended_cif *),
|
120
|
+
extended_cif *,
|
121
|
+
unsigned, unsigned,
|
122
|
+
unsigned *,
|
123
123
|
void (*fn)(void));
|
124
124
|
|
125
|
-
void ffi_call(ffi_cif *cif,
|
126
|
-
void (*fn)(void),
|
127
|
-
void *rvalue,
|
125
|
+
void ffi_call(ffi_cif *cif,
|
126
|
+
void (*fn)(void),
|
127
|
+
void *rvalue,
|
128
128
|
void **avalue)
|
129
129
|
{
|
130
130
|
extended_cif ecif;
|
131
|
+
ffi_type **arg_types = cif->arg_types;
|
132
|
+
int i, nargs = cif->nargs;
|
131
133
|
|
132
134
|
ecif.cif = cif;
|
133
135
|
ecif.avalue = avalue;
|
134
|
-
|
136
|
+
|
135
137
|
/* If the return value is a struct and we don't have a return */
|
136
138
|
/* value address then we need to make one */
|
137
139
|
|
138
|
-
if ((rvalue == NULL) &&
|
140
|
+
if ((rvalue == NULL) &&
|
139
141
|
(cif->rtype->type == FFI_TYPE_STRUCT))
|
140
142
|
{
|
141
143
|
ecif.rvalue = alloca(cif->rtype->size);
|
@@ -143,10 +145,24 @@ void ffi_call(ffi_cif *cif,
|
|
143
145
|
else
|
144
146
|
ecif.rvalue = rvalue;
|
145
147
|
|
146
|
-
|
148
|
+
/* If we have any large structure arguments, make a copy so we are passing
|
149
|
+
by value. */
|
150
|
+
for (i = 0; i < nargs; i++)
|
151
|
+
{
|
152
|
+
ffi_type *at = arg_types[i];
|
153
|
+
int size = at->size;
|
154
|
+
if (at->type == FFI_TYPE_STRUCT) /* && size > 4) All struct args?? */
|
155
|
+
{
|
156
|
+
char *argcopy = alloca (size);
|
157
|
+
memcpy (argcopy, avalue[i], size);
|
158
|
+
avalue[i] = argcopy;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
switch (cif->abi)
|
147
163
|
{
|
148
164
|
case FFI_EABI:
|
149
|
-
ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes,
|
165
|
+
ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes,
|
150
166
|
cif->flags, ecif.rvalue, fn);
|
151
167
|
break;
|
152
168
|
default:
|
@@ -172,7 +188,7 @@ void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
|
|
172
188
|
void *struct_rvalue = (void *) arg1;
|
173
189
|
|
174
190
|
/* 6 words reserved for register args + 3 words from jsr */
|
175
|
-
char *stack_args = frame_pointer + 9*4;
|
191
|
+
char *stack_args = frame_pointer + 9*4;
|
176
192
|
|
177
193
|
/* Lay the register arguments down in a continuous chunk of memory. */
|
178
194
|
unsigned register_args[6] =
|
@@ -211,7 +227,16 @@ void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
|
|
211
227
|
avalue[i] = ptr;
|
212
228
|
break;
|
213
229
|
case FFI_TYPE_STRUCT:
|
214
|
-
|
230
|
+
{
|
231
|
+
if (arg_types[i]->size > 4)
|
232
|
+
{
|
233
|
+
void *copy = alloca(arg_types[i]->size);
|
234
|
+
memcpy(copy, *(void**)ptr, arg_types[i]->size);
|
235
|
+
avalue[i] = copy;
|
236
|
+
}
|
237
|
+
else
|
238
|
+
avalue[i] = *(void**)ptr;
|
239
|
+
}
|
215
240
|
break;
|
216
241
|
default:
|
217
242
|
/* This is an 8-byte value. */
|