ffi 1.0.0 → 1.17.1
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 +7 -0
- checksums.yaml.gz.sig +4 -0
- data/CHANGELOG.md +465 -0
- data/COPYING +49 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -11
- data/LICENSE.SPECS +22 -0
- data/README.md +137 -0
- data/Rakefile +165 -148
- data/ext/ffi_c/AbstractMemory.c +716 -97
- data/ext/ffi_c/AbstractMemory.h +38 -17
- data/ext/ffi_c/ArrayType.c +102 -33
- data/ext/ffi_c/ArrayType.h +20 -18
- data/ext/ffi_c/Buffer.c +229 -54
- data/ext/ffi_c/Call.c +211 -100
- data/ext/ffi_c/Call.h +46 -28
- data/ext/ffi_c/ClosurePool.c +110 -81
- data/ext/ffi_c/ClosurePool.h +31 -1
- data/ext/ffi_c/DynamicLibrary.c +216 -54
- data/ext/ffi_c/DynamicLibrary.h +76 -0
- data/ext/ffi_c/Function.c +527 -164
- data/ext/ffi_c/Function.h +24 -20
- data/ext/ffi_c/FunctionInfo.c +151 -50
- data/ext/ffi_c/LastError.c +112 -28
- data/ext/ffi_c/LastError.h +29 -0
- data/ext/ffi_c/LongDouble.c +65 -0
- data/ext/ffi_c/LongDouble.h +47 -0
- data/ext/ffi_c/MappedType.c +107 -42
- data/ext/ffi_c/MappedType.h +20 -20
- data/ext/ffi_c/MemoryPointer.c +108 -46
- data/ext/ffi_c/MemoryPointer.h +33 -4
- data/ext/ffi_c/MethodHandle.c +71 -67
- data/ext/ffi_c/MethodHandle.h +26 -23
- data/ext/ffi_c/Platform.c +42 -25
- data/ext/ffi_c/Platform.h +32 -3
- data/ext/ffi_c/Pointer.c +324 -51
- data/ext/ffi_c/Pointer.h +29 -18
- data/ext/ffi_c/Struct.c +434 -161
- data/ext/ffi_c/Struct.h +47 -27
- data/ext/ffi_c/StructByValue.c +74 -37
- data/ext/ffi_c/StructByValue.h +20 -18
- data/ext/ffi_c/StructLayout.c +358 -87
- data/ext/ffi_c/Thread.c +129 -0
- data/ext/ffi_c/Thread.h +76 -0
- data/ext/ffi_c/Type.c +241 -76
- data/ext/ffi_c/Type.h +27 -11
- data/ext/ffi_c/Types.c +54 -34
- data/ext/ffi_c/Types.h +24 -24
- data/ext/ffi_c/Variadic.c +151 -55
- data/ext/ffi_c/compat.h +48 -38
- data/ext/ffi_c/extconf.rb +106 -34
- data/ext/ffi_c/ffi.c +35 -26
- 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 +84 -0
- data/ext/ffi_c/libffi/.ci/ar-lib +270 -0
- data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
- data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
- data/ext/ffi_c/libffi/.ci/build.sh +124 -0
- data/ext/ffi_c/libffi/.ci/compile +351 -0
- data/ext/ffi_c/libffi/.ci/install.sh +78 -0
- data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/moxie-sim.exp +60 -0
- data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
- data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/site.exp +29 -0
- data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
- data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
- data/ext/ffi_c/libffi/.gitattributes +4 -0
- data/ext/ffi_c/libffi/.github/issue_template.md +10 -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 +46 -0
- data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6528 -3180
- data/ext/ffi_c/libffi/LICENSE +3 -3
- data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
- data/ext/ffi_c/libffi/Makefile.am +132 -162
- data/ext/ffi_c/libffi/Makefile.in +1339 -1003
- data/ext/ffi_c/libffi/README.md +531 -0
- data/ext/ffi_c/libffi/acinclude.m4 +289 -4
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/compile +227 -21
- data/ext/ffi_c/libffi/config.guess +1034 -778
- data/ext/ffi_c/libffi/config.sub +1394 -1204
- data/ext/ffi_c/libffi/configure +14327 -8503
- data/ext/ffi_c/libffi/configure.ac +294 -247
- data/ext/ffi_c/libffi/configure.host +330 -4
- data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
- data/ext/ffi_c/libffi/doc/Makefile.in +818 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +572 -67
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +53 -46
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +312 -0
- data/ext/ffi_c/libffi/include/Makefile.am +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +219 -79
- data/ext/ffi_c/libffi/include/ffi.h.in +230 -111
- data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +78 -16
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +402 -184
- data/ext/ffi_c/libffi/libffi.map.in +81 -0
- data/ext/ffi_c/libffi/libffi.pc.in +3 -2
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
- data/ext/ffi_c/libffi/libtool-ldflags +106 -0
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +5752 -2722
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
- data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +198 -0
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +158 -0
- data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +119 -0
- data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +49 -0
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +267 -0
- data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
- data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
- data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
- data/ext/ffi_c/libffi/make_sunver.pl +333 -0
- data/ext/ffi_c/libffi/man/Makefile.am +2 -2
- data/ext/ffi_c/libffi/man/Makefile.in +174 -57
- 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/missing +155 -300
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
- data/ext/ffi_c/libffi/msvcc.sh +353 -0
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +1142 -0
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
- data/ext/ffi_c/libffi/src/aarch64/internal.h +100 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +695 -0
- data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -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 +162 -246
- data/ext/ffi_c/libffi/src/arc/arcompact.S +210 -0
- data/ext/ffi_c/libffi/src/arc/ffi.c +443 -0
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +67 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +806 -194
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +43 -3
- data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +381 -231
- data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
- data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +8 -3
- 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 +574 -100
- data/ext/ffi_c/libffi/src/cris/ffi.c +11 -8
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
- data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
- data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
- data/ext/ffi_c/libffi/src/debug.c +8 -3
- data/ext/ffi_c/libffi/src/dlmalloc.c +89 -17
- data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +8 -7
- data/ext/ffi_c/libffi/src/ia64/ffi.c +48 -12
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +10 -4
- data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
- data/ext/ffi_c/libffi/src/java_raw_api.c +24 -6
- data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
- data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
- data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
- data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
- 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 +32 -15
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/m68k/ffi.c +97 -13
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/m68k/sysv.S +148 -25
- 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/src/metag/ffitarget.h +53 -0
- 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 +392 -104
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +40 -24
- data/ext/ffi_c/libffi/src/mips/n32.S +325 -93
- data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
- data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
- data/ext/ffi_c/libffi/src/moxie/ffi.c +310 -0
- 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 +341 -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/ffi.c +68 -111
- data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +34 -17
- data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
- data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
- data/ext/ffi_c/libffi/src/powerpc/aix.S +250 -8
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +255 -4
- data/ext/ffi_c/libffi/src/powerpc/asm.h +3 -3
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +211 -78
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +356 -102
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +108 -1375
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +746 -210
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +126 -48
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
- data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +141 -32
- data/ext/ffi_c/libffi/src/raw_api.c +18 -5
- data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
- data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
- data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
- data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +13 -3
- 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 +8 -3
- data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/sparc/ffi.c +334 -491
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -5
- 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/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/types.c +48 -19
- 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/wasm32/ffi.c +947 -0
- data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
- data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +690 -540
- data/ext/ffi_c/libffi/src/x86/ffi64.c +450 -126
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +86 -42
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
- data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +1199 -381
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +587 -298
- data/ext/ffi_c/libffi/src/x86/win64.S +251 -457
- data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
- data/ext/ffi_c/libffi/stamp-h.in +1 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
- data/ext/ffi_c/libffi/testsuite/Makefile.in +251 -117
- 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 +682 -0
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -10
- 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/err_bad_typedef.c +4 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +88 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
- 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/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_ll1.c +6 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
- 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 +9 -10
- 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/struct10.c +57 -0
- 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/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/uninitialized.c +61 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
- 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 +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +24 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +21 -9
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +13 -3
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +34 -11
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +7 -2
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +22 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +8 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +2 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +57 -56
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
- 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.call → libffi.closures}/nested_struct2.c +15 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
- 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.call → libffi.closures}/stret_large.c +7 -7
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +7 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
- 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 -10
- 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/ext/ffi_c/libffi.bsd.mk +14 -8
- data/ext/ffi_c/libffi.darwin.mk +56 -26
- data/ext/ffi_c/libffi.gnu.mk +9 -6
- data/ext/ffi_c/libffi.mk +13 -8
- data/ext/ffi_c/libffi.vc.mk +26 -0
- data/ext/ffi_c/libffi.vc64.mk +26 -0
- data/ext/ffi_c/rbffi.h +34 -6
- data/ext/ffi_c/{endian.h → rbffi_endian.h} +21 -2
- data/ffi.gemspec +42 -0
- data/lib/ffi/abstract_memory.rb +44 -0
- data/lib/ffi/autopointer.rb +111 -52
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +67 -0
- data/lib/ffi/dynamic_library.rb +118 -0
- data/lib/ffi/enum.rb +203 -22
- data/lib/ffi/errno.rb +27 -12
- data/lib/ffi/ffi.rb +88 -11
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/io.rb +35 -14
- data/lib/ffi/library.rb +382 -96
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +64 -35
- data/lib/ffi/memorypointer.rb +1 -33
- data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
- data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
- data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
- data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
- data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
- data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
- data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
- data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
- data/lib/ffi/platform/arm-linux/types.conf +132 -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/i386-cygwin/types.conf +3 -0
- data/lib/ffi/platform/i386-darwin/types.conf +100 -0
- data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
- data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
- data/lib/ffi/platform/i386-gnu/types.conf +107 -0
- data/lib/ffi/platform/i386-linux/types.conf +103 -0
- data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
- data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
- data/lib/ffi/platform/i386-solaris/types.conf +122 -0
- data/lib/ffi/platform/i386-windows/types.conf +52 -0
- data/lib/ffi/platform/ia64-linux/types.conf +104 -0
- data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
- data/lib/ffi/platform/mips-linux/types.conf +102 -0
- data/lib/ffi/platform/mips64-linux/types.conf +104 -0
- data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
- data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
- data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
- data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
- data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
- data/lib/ffi/platform/powerpc-linux/types.conf +130 -0
- data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
- data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
- data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
- data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
- data/lib/ffi/platform/s390-linux/types.conf +102 -0
- data/lib/ffi/platform/s390x-linux/types.conf +102 -0
- data/lib/ffi/platform/sparc-linux/types.conf +102 -0
- data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
- data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
- data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
- data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
- data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
- data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
- data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
- data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
- data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
- data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
- data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
- data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
- data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
- data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
- data/lib/ffi/platform.rb +110 -34
- data/lib/ffi/pointer.rb +117 -90
- data/lib/ffi/struct.rb +101 -70
- data/lib/ffi/struct_by_reference.rb +72 -0
- data/lib/ffi/struct_layout.rb +96 -0
- data/lib/ffi/struct_layout_builder.rb +90 -21
- data/lib/ffi/tools/const_generator.rb +86 -31
- data/lib/ffi/tools/generator.rb +49 -2
- data/lib/ffi/tools/generator_task.rb +13 -16
- data/lib/ffi/tools/struct_generator.rb +6 -5
- data/lib/ffi/tools/types_generator.rb +25 -11
- data/lib/ffi/types.rb +105 -36
- data/lib/ffi/union.rb +23 -12
- data/lib/ffi/variadic.rb +44 -29
- data/lib/ffi/version.rb +3 -0
- data/lib/ffi.rb +25 -9
- data/rakelib/ffi_gem_helper.rb +65 -0
- data/samples/getlogin.rb +8 -0
- data/samples/getpid.rb +8 -0
- data/samples/gettimeofday.rb +18 -0
- data/samples/hello.rb +8 -0
- data/samples/hello_ractor.rb +11 -0
- data/samples/inotify.rb +60 -0
- data/samples/pty.rb +75 -0
- data/samples/qsort.rb +20 -0
- data/samples/qsort_ractor.rb +28 -0
- data/sig/ffi/abstract_memory.rbs +165 -0
- data/sig/ffi/auto_pointer.rbs +26 -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 +547 -248
- metadata.gz.sig +0 -0
- data/History.txt +0 -109
- data/README.rdoc +0 -70
- data/ext/ffi_c/DataConverter.c +0 -62
- data/ext/ffi_c/StructByReference.c +0 -150
- data/ext/ffi_c/StructByReference.h +0 -50
- data/ext/ffi_c/libffi/ChangeLog.libffi +0 -658
- data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
- data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
- data/ext/ffi_c/libffi/README +0 -306
- data/ext/ffi_c/libffi/aclocal.m4 +0 -8998
- data/ext/ffi_c/libffi/depcomp +0 -584
- data/ext/ffi_c/libffi/doc/libffi.info +0 -533
- data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
- data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7360
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -368
- 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 -92
- data/ext/ffi_c/libffi/mdate-sh +0 -201
- 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 -877
- 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
- data/gen/Rakefile +0 -14
- data/spec/ffi/async_callback_spec.rb +0 -23
- data/spec/ffi/bool_spec.rb +0 -24
- data/spec/ffi/buffer_spec.rb +0 -202
- data/spec/ffi/callback_spec.rb +0 -653
- data/spec/ffi/custom_param_type.rb +0 -31
- data/spec/ffi/custom_type_spec.rb +0 -73
- data/spec/ffi/enum_spec.rb +0 -183
- data/spec/ffi/errno_spec.rb +0 -13
- data/spec/ffi/ffi_spec.rb +0 -24
- data/spec/ffi/function_spec.rb +0 -73
- data/spec/ffi/library_spec.rb +0 -174
- data/spec/ffi/managed_struct_spec.rb +0 -56
- data/spec/ffi/number_spec.rb +0 -231
- data/spec/ffi/pointer_spec.rb +0 -210
- data/spec/ffi/rbx/attach_function_spec.rb +0 -28
- data/spec/ffi/rbx/memory_pointer_spec.rb +0 -109
- data/spec/ffi/rbx/spec_helper.rb +0 -1
- data/spec/ffi/rbx/struct_spec.rb +0 -13
- data/spec/ffi/spec_helper.rb +0 -21
- data/spec/ffi/string_spec.rb +0 -103
- data/spec/ffi/strptr_spec.rb +0 -36
- data/spec/ffi/struct_callback_spec.rb +0 -64
- data/spec/ffi/struct_initialize_spec.rb +0 -30
- data/spec/ffi/struct_packed_spec.rb +0 -46
- data/spec/ffi/struct_spec.rb +0 -638
- data/spec/ffi/typedef_spec.rb +0 -62
- data/spec/ffi/union_spec.rb +0 -60
- data/spec/ffi/variadic_spec.rb +0 -84
- data/spec/spec.opts +0 -4
- data/tasks/ann.rake +0 -80
- data/tasks/extension.rake +0 -25
- data/tasks/gem.rake +0 -200
- data/tasks/git.rake +0 -41
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -50
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -301
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
- /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
- /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
@@ -1,6 +1,7 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
ffi.c - Copyright (c)
|
3
|
-
Copyright (c) 2008
|
2
|
+
ffi.c - Copyright (c) 2011 Anthony Green
|
3
|
+
Copyright (c) 2008 David Daney
|
4
|
+
Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc.
|
4
5
|
|
5
6
|
MIPS Foreign Function Interface
|
6
7
|
|
@@ -28,7 +29,9 @@
|
|
28
29
|
#include <ffi.h>
|
29
30
|
#include <ffi_common.h>
|
30
31
|
|
32
|
+
#include <stdint.h>
|
31
33
|
#include <stdlib.h>
|
34
|
+
#include <stdio.h>
|
32
35
|
|
33
36
|
#ifdef __GNUC__
|
34
37
|
# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
|
@@ -37,7 +40,13 @@
|
|
37
40
|
#endif
|
38
41
|
|
39
42
|
#ifndef USE__BUILTIN___CLEAR_CACHE
|
40
|
-
#
|
43
|
+
# if defined(__FreeBSD__)
|
44
|
+
# include <machine/sysarch.h>
|
45
|
+
# elif defined(__OpenBSD__)
|
46
|
+
# include <mips64/sysarch.h>
|
47
|
+
# else
|
48
|
+
# include <sys/cachectl.h>
|
49
|
+
# endif
|
41
50
|
#endif
|
42
51
|
|
43
52
|
#ifdef FFI_DEBUG
|
@@ -69,22 +78,39 @@ static void ffi_prep_args(char *stack,
|
|
69
78
|
{
|
70
79
|
int i;
|
71
80
|
void **p_argv;
|
72
|
-
char *argp;
|
81
|
+
char *argp, *argp_f;
|
73
82
|
ffi_type **p_arg;
|
74
83
|
|
84
|
+
memset(stack, 0, bytes);
|
85
|
+
|
75
86
|
#ifdef FFI_MIPS_N32
|
87
|
+
int soft_float = (ecif->cif->abi == FFI_N32_SOFT_FLOAT
|
88
|
+
|| ecif->cif->abi == FFI_N64_SOFT_FLOAT);
|
76
89
|
/* If more than 8 double words are used, the remainder go
|
77
90
|
on the stack. We reorder stuff on the stack here to
|
78
91
|
support this easily. */
|
79
|
-
if
|
80
|
-
|
92
|
+
/* if ret is _Complex long double, args reg shift2, and a0 should holds pointer to rvalue */
|
93
|
+
if (ecif->cif->rtype->type == FFI_TYPE_COMPLEX && ecif->cif->rtype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
|
94
|
+
{
|
95
|
+
if (bytes + 16 > 8 * sizeof(ffi_arg))
|
96
|
+
argp = &stack[bytes - (8 * sizeof(ffi_arg))];
|
97
|
+
else
|
98
|
+
argp = stack;
|
99
|
+
* (unsigned long *) argp = (unsigned long) ecif->rvalue;
|
100
|
+
argp += 16;
|
101
|
+
}
|
81
102
|
else
|
82
|
-
|
103
|
+
{
|
104
|
+
if (bytes > 8 * sizeof(ffi_arg))
|
105
|
+
argp = &stack[bytes - (8 * sizeof(ffi_arg))];
|
106
|
+
else
|
107
|
+
argp = stack;
|
108
|
+
}
|
83
109
|
#else
|
84
110
|
argp = stack;
|
85
111
|
#endif
|
86
112
|
|
87
|
-
|
113
|
+
argp_f = argp;
|
88
114
|
|
89
115
|
#ifdef FFI_MIPS_N32
|
90
116
|
if ( ecif->cif->rstruct_flag != 0 )
|
@@ -111,7 +137,7 @@ static void ffi_prep_args(char *stack,
|
|
111
137
|
|
112
138
|
if ((a - 1) & (unsigned long) argp)
|
113
139
|
{
|
114
|
-
argp = (char *)
|
140
|
+
argp = (char *) FFI_ALIGN(argp, a);
|
115
141
|
FIX_ARGP;
|
116
142
|
}
|
117
143
|
|
@@ -125,7 +151,7 @@ static void ffi_prep_args(char *stack,
|
|
125
151
|
if (type == FFI_TYPE_POINTER)
|
126
152
|
type = (ecif->cif->abi == FFI_N64
|
127
153
|
|| ecif->cif->abi == FFI_N64_SOFT_FLOAT)
|
128
|
-
? FFI_TYPE_SINT64 :
|
154
|
+
? FFI_TYPE_SINT64 : FFI_TYPE_UINT32;
|
129
155
|
|
130
156
|
if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT
|
131
157
|
|| ecif->cif->abi == FFI_N64_SOFT_FLOAT))
|
@@ -165,9 +191,35 @@ static void ffi_prep_args(char *stack,
|
|
165
191
|
break;
|
166
192
|
|
167
193
|
case FFI_TYPE_UINT32:
|
194
|
+
#ifdef FFI_MIPS_N32
|
195
|
+
/* The N32 ABI requires that 32-bit integers
|
196
|
+
be sign-extended to 64-bits, regardless of
|
197
|
+
whether they are signed or unsigned. */
|
198
|
+
*(ffi_arg *)argp = *(SINT32 *)(* p_argv);
|
199
|
+
#else
|
168
200
|
*(ffi_arg *)argp = *(UINT32 *)(* p_argv);
|
201
|
+
#endif
|
169
202
|
break;
|
170
203
|
|
204
|
+
#ifdef FFI_MIPS_N32
|
205
|
+
case FFI_TYPE_COMPLEX:
|
206
|
+
/* expand from 4+4 to 8+8 if pass with fpr reg */
|
207
|
+
/* argp will wind back to stack when we process all of reg args */
|
208
|
+
/* all var_args passed with gpr, should be expand */
|
209
|
+
if(!soft_float
|
210
|
+
&& (*p_arg)->elements[0]->type == FFI_TYPE_FLOAT
|
211
|
+
&& argp>=argp_f
|
212
|
+
&& i < ecif->cif->mips_nfixedargs)
|
213
|
+
{
|
214
|
+
*(float *) argp = *(float *)(* p_argv);
|
215
|
+
argp += z;
|
216
|
+
char *tmp = (void *) (*p_argv);
|
217
|
+
*(float *) argp = *(float *)(tmp+4);
|
218
|
+
}
|
219
|
+
else
|
220
|
+
memcpy(argp, *p_argv, (*p_arg)->size);
|
221
|
+
break;
|
222
|
+
#endif
|
171
223
|
/* This can only happen with 64bit slots. */
|
172
224
|
case FFI_TYPE_FLOAT:
|
173
225
|
*(float *) argp = *(float *)(* p_argv);
|
@@ -220,6 +272,24 @@ static void ffi_prep_args(char *stack,
|
|
220
272
|
passed in an integer register". This code traverses structure
|
221
273
|
definitions and generates the appropriate flags. */
|
222
274
|
|
275
|
+
static int
|
276
|
+
calc_n32_struct_flags_element(unsigned *flags, ffi_type *e,
|
277
|
+
unsigned *loc, unsigned *arg_reg)
|
278
|
+
{
|
279
|
+
/* Align this object. */
|
280
|
+
*loc = FFI_ALIGN(*loc, e->alignment);
|
281
|
+
if (e->type == FFI_TYPE_DOUBLE)
|
282
|
+
{
|
283
|
+
/* Already aligned to FFI_SIZEOF_ARG. */
|
284
|
+
*arg_reg = *loc / FFI_SIZEOF_ARG;
|
285
|
+
if (*arg_reg > 7)
|
286
|
+
return 1;
|
287
|
+
*flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
|
288
|
+
}
|
289
|
+
*loc += e->size;
|
290
|
+
return 0;
|
291
|
+
}
|
292
|
+
|
223
293
|
static unsigned
|
224
294
|
calc_n32_struct_flags(int soft_float, ffi_type *arg,
|
225
295
|
unsigned *loc, unsigned *arg_reg)
|
@@ -234,23 +304,20 @@ calc_n32_struct_flags(int soft_float, ffi_type *arg,
|
|
234
304
|
|
235
305
|
while ((e = arg->elements[index]))
|
236
306
|
{
|
237
|
-
|
238
|
-
*loc = ALIGN(*loc, e->alignment);
|
239
|
-
if (e->type == FFI_TYPE_DOUBLE)
|
307
|
+
if (e->type == FFI_TYPE_COMPLEX)
|
240
308
|
{
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
|
246
|
-
*loc += e->size;
|
309
|
+
if (calc_n32_struct_flags_element(&flags, e->elements[0], loc, arg_reg))
|
310
|
+
break;
|
311
|
+
if (calc_n32_struct_flags_element(&flags, e->elements[0], loc, arg_reg))
|
312
|
+
break;
|
247
313
|
}
|
248
314
|
else
|
249
|
-
|
315
|
+
if (calc_n32_struct_flags_element(&flags, e, loc, arg_reg))
|
316
|
+
break;
|
250
317
|
index++;
|
251
318
|
}
|
252
319
|
/* Next Argument register at alignment of FFI_SIZEOF_ARG. */
|
253
|
-
*arg_reg =
|
320
|
+
*arg_reg = FFI_ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
|
254
321
|
|
255
322
|
return flags;
|
256
323
|
}
|
@@ -258,7 +325,7 @@ calc_n32_struct_flags(int soft_float, ffi_type *arg,
|
|
258
325
|
static unsigned
|
259
326
|
calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
|
260
327
|
{
|
261
|
-
unsigned flags
|
328
|
+
unsigned flags;
|
262
329
|
unsigned small = FFI_TYPE_SMALLSTRUCT;
|
263
330
|
ffi_type *e;
|
264
331
|
|
@@ -277,51 +344,67 @@ calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
|
|
277
344
|
|
278
345
|
e = arg->elements[0];
|
279
346
|
|
280
|
-
if (e->type ==
|
281
|
-
flags = FFI_TYPE_DOUBLE;
|
282
|
-
else if (e->type == FFI_TYPE_FLOAT)
|
283
|
-
flags = FFI_TYPE_FLOAT;
|
284
|
-
|
285
|
-
if (flags && (e = arg->elements[1]))
|
347
|
+
if (e->type == FFI_TYPE_COMPLEX)
|
286
348
|
{
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS;
|
291
|
-
else
|
349
|
+
int type = e->elements[0]->type;
|
350
|
+
|
351
|
+
if (type != FFI_TYPE_DOUBLE && type != FFI_TYPE_FLOAT)
|
292
352
|
return small;
|
293
353
|
|
294
|
-
if (
|
354
|
+
if (arg->elements[1])
|
295
355
|
{
|
296
|
-
/*
|
297
|
-
|
356
|
+
/* Two floating point fields with more fields!
|
357
|
+
This must be passed the old way. */
|
298
358
|
return small;
|
299
359
|
}
|
300
|
-
|
301
|
-
|
360
|
+
|
361
|
+
flags = (type << FFI_FLAG_BITS) + type;
|
302
362
|
}
|
303
363
|
else
|
304
|
-
|
305
|
-
|
364
|
+
{
|
365
|
+
if (e->type != FFI_TYPE_DOUBLE && e->type != FFI_TYPE_FLOAT)
|
366
|
+
return small;
|
367
|
+
|
368
|
+
flags = e->type;
|
369
|
+
|
370
|
+
if (arg->elements[1])
|
371
|
+
{
|
372
|
+
e = arg->elements[1];
|
373
|
+
if (e->type != FFI_TYPE_DOUBLE && e->type != FFI_TYPE_FLOAT)
|
374
|
+
return small;
|
306
375
|
|
376
|
+
if (arg->elements[2])
|
377
|
+
{
|
378
|
+
/* There are three arguments and the first two are
|
379
|
+
floats! This must be passed the old way. */
|
380
|
+
return small;
|
381
|
+
}
|
382
|
+
|
383
|
+
flags += e->type << FFI_FLAG_BITS;
|
384
|
+
}
|
385
|
+
}
|
386
|
+
|
387
|
+
if (soft_float)
|
388
|
+
flags += FFI_TYPE_STRUCT_SOFT;
|
307
389
|
return flags;
|
308
390
|
}
|
309
391
|
|
310
392
|
#endif
|
311
393
|
|
312
394
|
/* Perform machine dependent cif processing */
|
313
|
-
ffi_status
|
395
|
+
static ffi_status ffi_prep_cif_machdep_int(ffi_cif *cif, unsigned nfixedargs)
|
314
396
|
{
|
315
397
|
cif->flags = 0;
|
398
|
+
cif->mips_nfixedargs = nfixedargs;
|
316
399
|
|
317
400
|
#ifdef FFI_MIPS_O32
|
318
401
|
/* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT
|
319
402
|
* does not have special handling for floating point args.
|
320
403
|
*/
|
321
404
|
|
322
|
-
if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32)
|
405
|
+
if (cif->rtype->type != FFI_TYPE_STRUCT && cif->rtype->type != FFI_TYPE_COMPLEX && cif->abi == FFI_O32)
|
323
406
|
{
|
324
|
-
if (cif->nargs > 0)
|
407
|
+
if (cif->nargs > 0 && cif->nargs == nfixedargs)
|
325
408
|
{
|
326
409
|
switch ((cif->arg_types)[0]->type)
|
327
410
|
{
|
@@ -387,7 +470,10 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
387
470
|
case FFI_TYPE_STRUCT:
|
388
471
|
case FFI_TYPE_FLOAT:
|
389
472
|
case FFI_TYPE_DOUBLE:
|
473
|
+
case FFI_TYPE_COMPLEX:
|
390
474
|
cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
|
475
|
+
if (cif->rtype->type == FFI_TYPE_COMPLEX)
|
476
|
+
cif->flags += ((*cif->rtype->elements[0]).type) << (FFI_FLAG_BITS * 4);
|
391
477
|
break;
|
392
478
|
|
393
479
|
case FFI_TYPE_SINT64:
|
@@ -405,7 +491,6 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
405
491
|
#ifdef FFI_MIPS_N32
|
406
492
|
/* Set the flags necessary for N32 processing */
|
407
493
|
{
|
408
|
-
int type;
|
409
494
|
unsigned arg_reg = 0;
|
410
495
|
unsigned loc = 0;
|
411
496
|
unsigned count = (cif->nargs < 8) ? cif->nargs : 8;
|
@@ -437,34 +522,21 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
437
522
|
|
438
523
|
while (count-- > 0 && arg_reg < 8)
|
439
524
|
{
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
switch (type)
|
444
|
-
{
|
445
|
-
case FFI_TYPE_FLOAT:
|
446
|
-
type = FFI_TYPE_UINT32;
|
447
|
-
break;
|
448
|
-
case FFI_TYPE_DOUBLE:
|
449
|
-
type = FFI_TYPE_UINT64;
|
450
|
-
break;
|
451
|
-
default:
|
452
|
-
break;
|
453
|
-
}
|
454
|
-
}
|
455
|
-
switch (type)
|
525
|
+
ffi_type *t = cif->arg_types[index];
|
526
|
+
|
527
|
+
switch (t->type)
|
456
528
|
{
|
457
529
|
case FFI_TYPE_FLOAT:
|
458
530
|
case FFI_TYPE_DOUBLE:
|
459
|
-
|
460
|
-
|
531
|
+
if (!soft_float && index < nfixedargs)
|
532
|
+
cif->flags += t->type << (arg_reg * FFI_FLAG_BITS);
|
461
533
|
arg_reg++;
|
462
534
|
break;
|
463
535
|
case FFI_TYPE_LONGDOUBLE:
|
464
536
|
/* Align it. */
|
465
|
-
arg_reg =
|
537
|
+
arg_reg = FFI_ALIGN(arg_reg, 2);
|
466
538
|
/* Treat it as two adjacent doubles. */
|
467
|
-
if (soft_float)
|
539
|
+
if (soft_float || index >= nfixedargs)
|
468
540
|
{
|
469
541
|
arg_reg += 2;
|
470
542
|
}
|
@@ -473,17 +545,71 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
473
545
|
cif->flags +=
|
474
546
|
(FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
|
475
547
|
arg_reg++;
|
548
|
+
if (arg_reg >= 8)
|
549
|
+
continue;
|
476
550
|
cif->flags +=
|
477
551
|
(FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
|
478
552
|
arg_reg++;
|
479
553
|
}
|
480
554
|
break;
|
481
555
|
|
556
|
+
case FFI_TYPE_COMPLEX:
|
557
|
+
switch (t->elements[0]->type)
|
558
|
+
{
|
559
|
+
case FFI_TYPE_LONGDOUBLE:
|
560
|
+
arg_reg = FFI_ALIGN(arg_reg, 2);
|
561
|
+
if (soft_float || index >= nfixedargs)
|
562
|
+
{
|
563
|
+
arg_reg += 2;
|
564
|
+
}
|
565
|
+
else
|
566
|
+
{
|
567
|
+
cif->flags +=
|
568
|
+
(FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
|
569
|
+
arg_reg++;
|
570
|
+
if (arg_reg >= 8)
|
571
|
+
continue;
|
572
|
+
cif->flags +=
|
573
|
+
(FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
|
574
|
+
arg_reg++;
|
575
|
+
if (arg_reg >= 8)
|
576
|
+
continue;
|
577
|
+
}
|
578
|
+
/* passthrough */
|
579
|
+
case FFI_TYPE_FLOAT:
|
580
|
+
// one fpr can only holds one arg even it is single
|
581
|
+
cif->bytes += 16;
|
582
|
+
/* passthrough */
|
583
|
+
case FFI_TYPE_SINT32:
|
584
|
+
case FFI_TYPE_UINT32:
|
585
|
+
case FFI_TYPE_DOUBLE:
|
586
|
+
if (soft_float || index >= nfixedargs)
|
587
|
+
{
|
588
|
+
arg_reg += 2;
|
589
|
+
}
|
590
|
+
else
|
591
|
+
{
|
592
|
+
uint32_t type = t->elements[0]->type != FFI_TYPE_LONGDOUBLE? t->elements[0]->type: FFI_TYPE_DOUBLE;
|
593
|
+
cif->flags +=
|
594
|
+
(type << (arg_reg * FFI_FLAG_BITS));
|
595
|
+
arg_reg++;
|
596
|
+
if (arg_reg >= 8)
|
597
|
+
continue;
|
598
|
+
cif->flags +=
|
599
|
+
(type << (arg_reg * FFI_FLAG_BITS));
|
600
|
+
arg_reg++;
|
601
|
+
}
|
602
|
+
break;
|
603
|
+
default:
|
604
|
+
arg_reg += 2;
|
605
|
+
break;
|
606
|
+
}
|
607
|
+
break;
|
608
|
+
|
482
609
|
case FFI_TYPE_STRUCT:
|
483
610
|
loc = arg_reg * FFI_SIZEOF_ARG;
|
484
|
-
cif->flags += calc_n32_struct_flags(soft_float,
|
485
|
-
|
486
|
-
&loc, &arg_reg);
|
611
|
+
cif->flags += calc_n32_struct_flags(soft_float || index >= nfixedargs,
|
612
|
+
t, &loc, &arg_reg);
|
487
613
|
break;
|
488
614
|
|
489
615
|
default:
|
@@ -523,7 +649,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
523
649
|
if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32)
|
524
650
|
cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
|
525
651
|
else
|
526
|
-
cif->flags +=
|
652
|
+
cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
|
527
653
|
break;
|
528
654
|
|
529
655
|
case FFI_TYPE_FLOAT:
|
@@ -535,7 +661,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
535
661
|
/* else fall through */
|
536
662
|
case FFI_TYPE_DOUBLE:
|
537
663
|
if (soft_float)
|
538
|
-
cif->flags +=
|
664
|
+
cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
|
539
665
|
else
|
540
666
|
cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
|
541
667
|
break;
|
@@ -545,8 +671,9 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
545
671
|
two doubles. */
|
546
672
|
if (soft_float)
|
547
673
|
{
|
548
|
-
|
549
|
-
|
674
|
+
/* if ret is long double, the ret is given by v0 and a0, no idea why
|
675
|
+
* Let's us VOID | VOID | LONGDOUBLE for it*/
|
676
|
+
cif->flags += FFI_TYPE_LONGDOUBLE << (FFI_FLAG_BITS * 8);
|
550
677
|
}
|
551
678
|
else
|
552
679
|
{
|
@@ -556,27 +683,79 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
|
556
683
|
<< (4 + (FFI_FLAG_BITS * 8));
|
557
684
|
}
|
558
685
|
break;
|
686
|
+
case FFI_TYPE_COMPLEX:
|
687
|
+
{
|
688
|
+
int type = cif->rtype->elements[0]->type;
|
689
|
+
|
690
|
+
cif->flags += (FFI_TYPE_COMPLEX << (FFI_FLAG_BITS * 8));
|
691
|
+
if (soft_float || (type != FFI_TYPE_FLOAT && type != FFI_TYPE_DOUBLE && type != FFI_TYPE_LONGDOUBLE))
|
692
|
+
{
|
693
|
+
switch (type)
|
694
|
+
{
|
695
|
+
case FFI_TYPE_DOUBLE:
|
696
|
+
case FFI_TYPE_SINT64:
|
697
|
+
case FFI_TYPE_UINT64:
|
698
|
+
case FFI_TYPE_INT:
|
699
|
+
type = FFI_TYPE_SMALLSTRUCT2;
|
700
|
+
break;
|
701
|
+
case FFI_TYPE_LONGDOUBLE:
|
702
|
+
type = FFI_TYPE_LONGDOUBLE;
|
703
|
+
break;
|
704
|
+
case FFI_TYPE_FLOAT:
|
705
|
+
default:
|
706
|
+
type = FFI_TYPE_SMALLSTRUCT;
|
707
|
+
}
|
708
|
+
cif->flags += type << (4 + (FFI_FLAG_BITS * 8));
|
709
|
+
}
|
710
|
+
else
|
711
|
+
{
|
712
|
+
//cif->flags += (type + (type << FFI_FLAG_BITS))
|
713
|
+
// << (4 + (FFI_FLAG_BITS * 8));
|
714
|
+
cif->flags += type << (4 + (FFI_FLAG_BITS * 8));
|
715
|
+
}
|
716
|
+
break;
|
717
|
+
}
|
718
|
+
case FFI_TYPE_UINT32:
|
719
|
+
/* In the N32 or N64 ABI unsigned 32-bit integer should be
|
720
|
+
*sign*-extended. */
|
721
|
+
cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
|
722
|
+
break;
|
723
|
+
case FFI_TYPE_SINT64:
|
724
|
+
cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
|
725
|
+
break;
|
559
726
|
default:
|
560
|
-
cif->flags +=
|
727
|
+
cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
|
561
728
|
break;
|
562
729
|
}
|
563
730
|
}
|
564
731
|
#endif
|
565
|
-
|
566
732
|
return FFI_OK;
|
567
733
|
}
|
568
734
|
|
735
|
+
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
736
|
+
{
|
737
|
+
return ffi_prep_cif_machdep_int(cif, cif->nargs);
|
738
|
+
}
|
739
|
+
|
740
|
+
ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
|
741
|
+
unsigned nfixedargs,
|
742
|
+
unsigned ntotalargs MAYBE_UNUSED)
|
743
|
+
{
|
744
|
+
return ffi_prep_cif_machdep_int(cif, nfixedargs);
|
745
|
+
}
|
746
|
+
|
569
747
|
/* Low level routine for calling O32 functions */
|
570
748
|
extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int),
|
571
749
|
extended_cif *, unsigned,
|
572
|
-
unsigned, unsigned *, void (*)(void));
|
750
|
+
unsigned, unsigned *, void (*)(void), void *closure);
|
573
751
|
|
574
752
|
/* Low level routine for calling N32 functions */
|
575
753
|
extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int),
|
576
754
|
extended_cif *, unsigned,
|
577
|
-
unsigned, void *, void (*)(void));
|
755
|
+
unsigned, void *, void (*)(void), void *closure);
|
578
756
|
|
579
|
-
void
|
757
|
+
void ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue,
|
758
|
+
void **avalue, void *closure)
|
580
759
|
{
|
581
760
|
extended_cif ecif;
|
582
761
|
|
@@ -587,7 +766,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
587
766
|
/* value address then we need to make one */
|
588
767
|
|
589
768
|
if ((rvalue == NULL) &&
|
590
|
-
(cif->rtype->type == FFI_TYPE_STRUCT))
|
769
|
+
(cif->rtype->type == FFI_TYPE_STRUCT || cif->rtype->type == FFI_TYPE_COMPLEX))
|
591
770
|
ecif.rvalue = alloca(cif->rtype->size);
|
592
771
|
else
|
593
772
|
ecif.rvalue = rvalue;
|
@@ -598,7 +777,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
598
777
|
case FFI_O32:
|
599
778
|
case FFI_O32_SOFT_FLOAT:
|
600
779
|
ffi_call_O32(ffi_prep_args, &ecif, cif->bytes,
|
601
|
-
cif->flags, ecif.rvalue, fn);
|
780
|
+
cif->flags, ecif.rvalue, fn, closure);
|
602
781
|
break;
|
603
782
|
#endif
|
604
783
|
|
@@ -630,7 +809,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
630
809
|
#endif
|
631
810
|
}
|
632
811
|
ffi_call_N32(ffi_prep_args, &ecif, cif->bytes,
|
633
|
-
cif->flags, rvalue_copy, fn);
|
812
|
+
cif->flags, rvalue_copy, fn, closure);
|
634
813
|
if (copy_rvalue)
|
635
814
|
memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size);
|
636
815
|
}
|
@@ -643,11 +822,27 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
643
822
|
}
|
644
823
|
}
|
645
824
|
|
825
|
+
void
|
826
|
+
ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
827
|
+
{
|
828
|
+
ffi_call_int (cif, fn, rvalue, avalue, NULL);
|
829
|
+
}
|
830
|
+
|
831
|
+
void
|
832
|
+
ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
833
|
+
void **avalue, void *closure)
|
834
|
+
{
|
835
|
+
ffi_call_int (cif, fn, rvalue, avalue, closure);
|
836
|
+
}
|
837
|
+
|
838
|
+
|
646
839
|
#if FFI_CLOSURES
|
647
840
|
#if defined(FFI_MIPS_O32)
|
648
841
|
extern void ffi_closure_O32(void);
|
842
|
+
extern void ffi_go_closure_O32(void);
|
649
843
|
#else
|
650
844
|
extern void ffi_closure_N32(void);
|
845
|
+
extern void ffi_go_closure_N32(void);
|
651
846
|
#endif /* FFI_MIPS_O32 */
|
652
847
|
|
653
848
|
ffi_status
|
@@ -662,10 +857,19 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
|
662
857
|
char *clear_location = (char *) codeloc;
|
663
858
|
|
664
859
|
#if defined(FFI_MIPS_O32)
|
665
|
-
|
860
|
+
if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
|
861
|
+
return FFI_BAD_ABI;
|
666
862
|
fn = ffi_closure_O32;
|
667
|
-
#else
|
668
|
-
|
863
|
+
#else
|
864
|
+
#if _MIPS_SIM ==_ABIN32
|
865
|
+
if (cif->abi != FFI_N32
|
866
|
+
&& cif->abi != FFI_N32_SOFT_FLOAT)
|
867
|
+
return FFI_BAD_ABI;
|
868
|
+
#else
|
869
|
+
if (cif->abi != FFI_N64
|
870
|
+
&& cif->abi != FFI_N64_SOFT_FLOAT)
|
871
|
+
return FFI_BAD_ABI;
|
872
|
+
#endif
|
669
873
|
fn = ffi_closure_N32;
|
670
874
|
#endif /* FFI_MIPS_O32 */
|
671
875
|
|
@@ -677,7 +881,11 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
|
677
881
|
/* lui $12,high(codeloc) */
|
678
882
|
tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16);
|
679
883
|
/* jr $25 */
|
884
|
+
#if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
|
680
885
|
tramp[3] = 0x03200008;
|
886
|
+
#else
|
887
|
+
tramp[3] = 0x03200009;
|
888
|
+
#endif
|
681
889
|
/* ori $12,low(codeloc) */
|
682
890
|
tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff);
|
683
891
|
#else
|
@@ -705,7 +913,11 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
|
705
913
|
/* ori $25,low(fn) */
|
706
914
|
tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff);
|
707
915
|
/* jr $25 */
|
916
|
+
#if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
|
708
917
|
tramp[11] = 0x03200008;
|
918
|
+
#else
|
919
|
+
tramp[11] = 0x03200009;
|
920
|
+
#endif
|
709
921
|
/* ori $12,low(codeloc) */
|
710
922
|
tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff);
|
711
923
|
|
@@ -715,11 +927,13 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
|
715
927
|
closure->fun = fun;
|
716
928
|
closure->user_data = user_data;
|
717
929
|
|
930
|
+
#if !defined(__FreeBSD__)
|
718
931
|
#ifdef USE__BUILTIN___CLEAR_CACHE
|
719
932
|
__builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);
|
720
933
|
#else
|
721
934
|
cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE);
|
722
935
|
#endif
|
936
|
+
#endif /* ! __FreeBSD__ */
|
723
937
|
return FFI_OK;
|
724
938
|
}
|
725
939
|
|
@@ -741,26 +955,32 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
|
741
955
|
* Based on the similar routine for sparc.
|
742
956
|
*/
|
743
957
|
int
|
744
|
-
ffi_closure_mips_inner_O32 (
|
958
|
+
ffi_closure_mips_inner_O32 (ffi_cif *cif,
|
959
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
960
|
+
void *user_data,
|
745
961
|
void *rvalue, ffi_arg *ar,
|
746
962
|
double *fpr)
|
747
963
|
{
|
748
|
-
ffi_cif *cif;
|
749
964
|
void **avaluep;
|
750
965
|
ffi_arg *avalue;
|
751
966
|
ffi_type **arg_types;
|
752
967
|
int i, avn, argn, seen_int;
|
753
968
|
|
754
|
-
cif = closure->cif;
|
755
969
|
avalue = alloca (cif->nargs * sizeof (ffi_arg));
|
756
970
|
avaluep = alloca (cif->nargs * sizeof (ffi_arg));
|
757
971
|
|
758
|
-
seen_int = (cif->abi == FFI_O32_SOFT_FLOAT);
|
972
|
+
seen_int = (cif->abi == FFI_O32_SOFT_FLOAT) || (cif->mips_nfixedargs != cif->nargs);
|
759
973
|
argn = 0;
|
760
974
|
|
761
975
|
if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT)
|
762
976
|
{
|
763
|
-
rvalue = (void *)(
|
977
|
+
rvalue = (void *)(uintptr_t)ar[0];
|
978
|
+
argn = 1;
|
979
|
+
seen_int = 1;
|
980
|
+
}
|
981
|
+
if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_COMPLEX)
|
982
|
+
{
|
983
|
+
rvalue = fpr;
|
764
984
|
argn = 1;
|
765
985
|
}
|
766
986
|
|
@@ -770,6 +990,8 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
|
|
770
990
|
|
771
991
|
while (i < avn)
|
772
992
|
{
|
993
|
+
if (arg_types[i]->alignment == 8 && (argn & 0x1))
|
994
|
+
argn++;
|
773
995
|
if (i < 2 && !seen_int &&
|
774
996
|
(arg_types[i]->type == FFI_TYPE_FLOAT ||
|
775
997
|
arg_types[i]->type == FFI_TYPE_DOUBLE ||
|
@@ -784,8 +1006,6 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
|
|
784
1006
|
}
|
785
1007
|
else
|
786
1008
|
{
|
787
|
-
if (arg_types[i]->alignment == 8 && (argn & 0x1))
|
788
|
-
argn++;
|
789
1009
|
switch (arg_types[i]->type)
|
790
1010
|
{
|
791
1011
|
case FFI_TYPE_SINT8:
|
@@ -814,12 +1034,12 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
|
|
814
1034
|
}
|
815
1035
|
seen_int = 1;
|
816
1036
|
}
|
817
|
-
argn +=
|
1037
|
+
argn += FFI_ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
|
818
1038
|
i++;
|
819
1039
|
}
|
820
1040
|
|
821
1041
|
/* Invoke the closure. */
|
822
|
-
|
1042
|
+
fun(cif, rvalue, avaluep, user_data);
|
823
1043
|
|
824
1044
|
if (cif->abi == FFI_O32_SOFT_FLOAT)
|
825
1045
|
{
|
@@ -835,6 +1055,9 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
|
|
835
1055
|
}
|
836
1056
|
else
|
837
1057
|
{
|
1058
|
+
if (cif->rtype->type == FFI_TYPE_COMPLEX) {
|
1059
|
+
__asm__ volatile ("move $v1, %0" : : "r"(cif->rtype->size));
|
1060
|
+
}
|
838
1061
|
return cif->rtype->type;
|
839
1062
|
}
|
840
1063
|
}
|
@@ -855,7 +1078,7 @@ copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type,
|
|
855
1078
|
char *argp;
|
856
1079
|
char *fpp;
|
857
1080
|
|
858
|
-
o =
|
1081
|
+
o = FFI_ALIGN(offset, elt_type->alignment);
|
859
1082
|
arg_offset += o - offset;
|
860
1083
|
offset = o;
|
861
1084
|
argn += arg_offset / sizeof(ffi_arg);
|
@@ -895,11 +1118,12 @@ copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type,
|
|
895
1118
|
*
|
896
1119
|
*/
|
897
1120
|
int
|
898
|
-
ffi_closure_mips_inner_N32 (
|
1121
|
+
ffi_closure_mips_inner_N32 (ffi_cif *cif,
|
1122
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
1123
|
+
void *user_data,
|
899
1124
|
void *rvalue, ffi_arg *ar,
|
900
1125
|
ffi_arg *fpr)
|
901
1126
|
{
|
902
|
-
ffi_cif *cif;
|
903
1127
|
void **avaluep;
|
904
1128
|
ffi_arg *avalue;
|
905
1129
|
ffi_type **arg_types;
|
@@ -907,7 +1131,6 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
|
|
907
1131
|
int soft_float;
|
908
1132
|
ffi_arg *argp;
|
909
1133
|
|
910
|
-
cif = closure->cif;
|
911
1134
|
soft_float = cif->abi == FFI_N64_SOFT_FLOAT
|
912
1135
|
|| cif->abi == FFI_N32_SOFT_FLOAT;
|
913
1136
|
avalue = alloca (cif->nargs * sizeof (ffi_arg));
|
@@ -924,6 +1147,8 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
|
|
924
1147
|
#endif
|
925
1148
|
argn = 1;
|
926
1149
|
}
|
1150
|
+
if (cif->rtype->type == FFI_TYPE_COMPLEX && cif->rtype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
|
1151
|
+
argn = 2;
|
927
1152
|
|
928
1153
|
i = 0;
|
929
1154
|
avn = cif->nargs;
|
@@ -935,10 +1160,10 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
|
|
935
1160
|
|| arg_types[i]->type == FFI_TYPE_DOUBLE
|
936
1161
|
|| arg_types[i]->type == FFI_TYPE_LONGDOUBLE)
|
937
1162
|
{
|
938
|
-
argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn;
|
939
|
-
if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((
|
1163
|
+
argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
|
1164
|
+
if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((uintptr_t)argp & (arg_types[i]->alignment-1)))
|
940
1165
|
{
|
941
|
-
argp=(ffi_arg*)
|
1166
|
+
argp=(ffi_arg*)FFI_ALIGN(argp,arg_types[i]->alignment);
|
942
1167
|
argn++;
|
943
1168
|
}
|
944
1169
|
#if defined(__MIPSEB__) || defined(_MIPSEB)
|
@@ -948,22 +1173,47 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
|
|
948
1173
|
#endif
|
949
1174
|
avaluep[i] = (char *) argp;
|
950
1175
|
}
|
1176
|
+
else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
|
1177
|
+
{
|
1178
|
+
argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
|
1179
|
+
avaluep[i] = (char *) argp;
|
1180
|
+
}
|
1181
|
+
else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_LONGDOUBLE)
|
1182
|
+
{
|
1183
|
+
/* align long double */
|
1184
|
+
argn += ((argn & 0x1)? 1 : 0);
|
1185
|
+
argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
|
1186
|
+
avaluep[i] = (char *) argp;
|
1187
|
+
}
|
1188
|
+
else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT)
|
1189
|
+
{
|
1190
|
+
if (argn >= 8 || i >= cif->mips_nfixedargs || soft_float)
|
1191
|
+
argp = ar + argn;
|
1192
|
+
else
|
1193
|
+
{
|
1194
|
+
argp = fpr + argn;
|
1195
|
+
/* the normal args for function holds 8bytes, while here we convert it to ptr */
|
1196
|
+
uint32_t *tmp = (uint32_t *)argp;
|
1197
|
+
tmp[1] = tmp[2];
|
1198
|
+
}
|
1199
|
+
avaluep[i] = (char *) argp;
|
1200
|
+
}
|
951
1201
|
else
|
952
1202
|
{
|
953
1203
|
unsigned type = arg_types[i]->type;
|
954
1204
|
|
955
1205
|
if (arg_types[i]->alignment > sizeof(ffi_arg))
|
956
|
-
argn =
|
1206
|
+
argn = FFI_ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg));
|
957
1207
|
|
958
1208
|
argp = ar + argn;
|
959
1209
|
|
960
1210
|
/* The size of a pointer depends on the ABI */
|
961
1211
|
if (type == FFI_TYPE_POINTER)
|
962
1212
|
type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT)
|
963
|
-
? FFI_TYPE_SINT64 :
|
1213
|
+
? FFI_TYPE_SINT64 : FFI_TYPE_UINT32;
|
964
1214
|
|
965
1215
|
if (soft_float && type == FFI_TYPE_FLOAT)
|
966
|
-
type =
|
1216
|
+
type = FFI_TYPE_SINT32;
|
967
1217
|
|
968
1218
|
switch (type)
|
969
1219
|
{
|
@@ -1004,7 +1254,7 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
|
|
1004
1254
|
it was passed in registers. */
|
1005
1255
|
avaluep[i] = alloca(arg_types[i]->size);
|
1006
1256
|
copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i],
|
1007
|
-
argn, 0, ar, fpr, soft_float);
|
1257
|
+
argn, 0, ar, fpr, i >= cif->mips_nfixedargs || soft_float);
|
1008
1258
|
|
1009
1259
|
break;
|
1010
1260
|
}
|
@@ -1014,16 +1264,54 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
|
|
1014
1264
|
break;
|
1015
1265
|
}
|
1016
1266
|
}
|
1017
|
-
argn +=
|
1267
|
+
argn += FFI_ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg);
|
1018
1268
|
i++;
|
1019
1269
|
}
|
1020
1270
|
|
1021
1271
|
/* Invoke the closure. */
|
1022
|
-
|
1272
|
+
fun (cif, rvalue, avaluep, user_data);
|
1023
1273
|
|
1024
1274
|
return cif->flags >> (FFI_FLAG_BITS * 8);
|
1025
1275
|
}
|
1026
1276
|
|
1027
1277
|
#endif /* FFI_MIPS_N32 */
|
1028
1278
|
|
1279
|
+
#if defined(FFI_MIPS_O32)
|
1280
|
+
extern void ffi_closure_O32(void);
|
1281
|
+
extern void ffi_go_closure_O32(void);
|
1282
|
+
#else
|
1283
|
+
extern void ffi_closure_N32(void);
|
1284
|
+
extern void ffi_go_closure_N32(void);
|
1285
|
+
#endif /* FFI_MIPS_O32 */
|
1286
|
+
|
1287
|
+
ffi_status
|
1288
|
+
ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
|
1289
|
+
void (*fun)(ffi_cif*,void*,void**,void*))
|
1290
|
+
{
|
1291
|
+
void * fn;
|
1292
|
+
|
1293
|
+
#if defined(FFI_MIPS_O32)
|
1294
|
+
if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
|
1295
|
+
return FFI_BAD_ABI;
|
1296
|
+
fn = ffi_go_closure_O32;
|
1297
|
+
#else
|
1298
|
+
#if _MIPS_SIM ==_ABIN32
|
1299
|
+
if (cif->abi != FFI_N32
|
1300
|
+
&& cif->abi != FFI_N32_SOFT_FLOAT)
|
1301
|
+
return FFI_BAD_ABI;
|
1302
|
+
#else
|
1303
|
+
if (cif->abi != FFI_N64
|
1304
|
+
&& cif->abi != FFI_N64_SOFT_FLOAT)
|
1305
|
+
return FFI_BAD_ABI;
|
1306
|
+
#endif
|
1307
|
+
fn = ffi_go_closure_N32;
|
1308
|
+
#endif /* FFI_MIPS_O32 */
|
1309
|
+
|
1310
|
+
closure->tramp = (void *)fn;
|
1311
|
+
closure->cif = cif;
|
1312
|
+
closure->fun = fun;
|
1313
|
+
|
1314
|
+
return FFI_OK;
|
1315
|
+
}
|
1316
|
+
|
1029
1317
|
#endif /* FFI_CLOSURES */
|