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