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) 1998, 2007, 2008 Red Hat, Inc.
|
2
|
+
ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc.
|
3
3
|
Copyright (c) 2000 Hewlett Packard Company
|
4
|
+
Copyright (c) 2011 Anthony Green
|
4
5
|
|
5
6
|
IA64 Foreign Function Interface
|
6
7
|
|
@@ -37,7 +38,11 @@
|
|
37
38
|
/* A 64-bit pointer value. In LP64 mode, this is effectively a plain
|
38
39
|
pointer. In ILP32 mode, it's a pointer that's been extended to
|
39
40
|
64 bits by "addp4". */
|
41
|
+
#ifdef __hpux
|
42
|
+
typedef void *PTR64;
|
43
|
+
#else // some other unix
|
40
44
|
typedef void *PTR64 __attribute__((mode(DI)));
|
45
|
+
#endif
|
41
46
|
|
42
47
|
/* Memory image of fp register contents. This is the implementation
|
43
48
|
specific format used by ldf.fill/stf.spill. All we care about is
|
@@ -75,14 +80,22 @@ endian_adjust (void *addr, size_t len)
|
|
75
80
|
point types without type conversions. Type conversion to long double breaks
|
76
81
|
the denorm support. */
|
77
82
|
|
83
|
+
#ifdef __hpux
|
84
|
+
#define stf_spill(addr, value)
|
85
|
+
#else
|
78
86
|
#define stf_spill(addr, value) \
|
79
87
|
asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value));
|
88
|
+
#endif
|
80
89
|
|
81
90
|
/* Load a value from ADDR, which is in the current cpu implementation's
|
82
91
|
fp spill format. As above, this must also be a macro. */
|
83
92
|
|
93
|
+
#ifdef __hpux
|
94
|
+
#define ldf_fill(result, addr)
|
95
|
+
#else
|
84
96
|
#define ldf_fill(result, addr) \
|
85
97
|
asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr));
|
98
|
+
#endif
|
86
99
|
|
87
100
|
/* Return the size of the C type associated with with TYPE. Which will
|
88
101
|
be one of the FFI_IA64_TYPE_HFA_* values. */
|
@@ -219,13 +232,13 @@ hfa_element_type (ffi_type *type, int nested)
|
|
219
232
|
|
220
233
|
/* Perform machine dependent cif processing. */
|
221
234
|
|
222
|
-
ffi_status
|
223
|
-
|
235
|
+
static ffi_status
|
236
|
+
ffi_prep_cif_machdep_core(ffi_cif *cif)
|
224
237
|
{
|
225
238
|
int flags;
|
226
239
|
|
227
240
|
/* Adjust cif->bytes to include space for the bits of the ia64_args frame
|
228
|
-
that
|
241
|
+
that precedes the integer register portion. The estimate that the
|
229
242
|
generic bits did for the argument space required is good enough for the
|
230
243
|
integer component. */
|
231
244
|
cif->bytes += offsetof(struct ia64_args, gp_regs[0]);
|
@@ -270,6 +283,22 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
|
270
283
|
return FFI_OK;
|
271
284
|
}
|
272
285
|
|
286
|
+
ffi_status
|
287
|
+
ffi_prep_cif_machdep(ffi_cif *cif)
|
288
|
+
{
|
289
|
+
cif->nfixedargs = cif->nargs;
|
290
|
+
return ffi_prep_cif_machdep_core(cif);
|
291
|
+
}
|
292
|
+
|
293
|
+
ffi_status
|
294
|
+
ffi_prep_cif_machdep_var(ffi_cif *cif,
|
295
|
+
unsigned int nfixedargs,
|
296
|
+
unsigned int ntotalargs MAYBE_UNUSED)
|
297
|
+
{
|
298
|
+
cif->nfixedargs = nfixedargs;
|
299
|
+
return ffi_prep_cif_machdep_core(cif);
|
300
|
+
}
|
301
|
+
|
273
302
|
extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64);
|
274
303
|
|
275
304
|
void
|
@@ -324,13 +353,17 @@ ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
324
353
|
case FFI_TYPE_FLOAT:
|
325
354
|
if (gpcount < 8 && fpcount < 8)
|
326
355
|
stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]);
|
327
|
-
|
356
|
+
{
|
357
|
+
UINT32 tmp;
|
358
|
+
memcpy (&tmp, avalue[i], sizeof (UINT32));
|
359
|
+
stack->gp_regs[gpcount++] = tmp;
|
360
|
+
}
|
328
361
|
break;
|
329
362
|
|
330
363
|
case FFI_TYPE_DOUBLE:
|
331
364
|
if (gpcount < 8 && fpcount < 8)
|
332
365
|
stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]);
|
333
|
-
stack->gp_regs[gpcount++]
|
366
|
+
memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64));
|
334
367
|
break;
|
335
368
|
|
336
369
|
case FFI_TYPE_LONGDOUBLE:
|
@@ -396,7 +429,7 @@ ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
396
429
|
the closure (in the "trampoline" area), but we replace the gp
|
397
430
|
pointer with a pointer to the closure itself. We also add the real
|
398
431
|
gp pointer to the closure. This allows the function entry code to
|
399
|
-
both retrieve the user data, and to
|
432
|
+
both retrieve the user data, and to restore the correct gp pointer. */
|
400
433
|
|
401
434
|
extern void ffi_closure_unix ();
|
402
435
|
|
@@ -425,7 +458,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
425
458
|
struct ffi_ia64_trampoline_struct *tramp;
|
426
459
|
struct ia64_fd *fd;
|
427
460
|
|
428
|
-
|
461
|
+
if (cif->abi != FFI_UNIX)
|
462
|
+
return FFI_BAD_ABI;
|
429
463
|
|
430
464
|
tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp;
|
431
465
|
fd = (struct ia64_fd *)(void *)ffi_closure_unix;
|
@@ -448,10 +482,11 @@ ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
|
|
448
482
|
ffi_cif *cif;
|
449
483
|
void **avalue;
|
450
484
|
ffi_type **p_arg;
|
451
|
-
long i, avn, gpcount, fpcount;
|
485
|
+
long i, avn, gpcount, fpcount, nfixedargs;
|
452
486
|
|
453
487
|
cif = closure->cif;
|
454
488
|
avn = cif->nargs;
|
489
|
+
nfixedargs = cif->nfixedargs;
|
455
490
|
avalue = alloca (avn * sizeof (void *));
|
456
491
|
|
457
492
|
/* If the structure return value is passed in memory get that location
|
@@ -462,6 +497,7 @@ ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
|
|
462
497
|
gpcount = fpcount = 0;
|
463
498
|
for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
|
464
499
|
{
|
500
|
+
int named = i < nfixedargs;
|
465
501
|
switch ((*p_arg)->type)
|
466
502
|
{
|
467
503
|
case FFI_TYPE_SINT8:
|
@@ -485,7 +521,7 @@ ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
|
|
485
521
|
break;
|
486
522
|
|
487
523
|
case FFI_TYPE_FLOAT:
|
488
|
-
if (gpcount < 8 && fpcount < 8)
|
524
|
+
if (named && gpcount < 8 && fpcount < 8)
|
489
525
|
{
|
490
526
|
fpreg *addr = &stack->fp_regs[fpcount++];
|
491
527
|
float result;
|
@@ -499,7 +535,7 @@ ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
|
|
499
535
|
break;
|
500
536
|
|
501
537
|
case FFI_TYPE_DOUBLE:
|
502
|
-
if (gpcount < 8 && fpcount < 8)
|
538
|
+
if (named && gpcount < 8 && fpcount < 8)
|
503
539
|
{
|
504
540
|
fpreg *addr = &stack->fp_regs[fpcount++];
|
505
541
|
double result;
|
@@ -515,7 +551,7 @@ ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
|
|
515
551
|
case FFI_TYPE_LONGDOUBLE:
|
516
552
|
if (gpcount & 1)
|
517
553
|
gpcount++;
|
518
|
-
if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8)
|
554
|
+
if (LDBL_MANT_DIG == 64 && named && gpcount < 8 && fpcount < 8)
|
519
555
|
{
|
520
556
|
fpreg *addr = &stack->fp_regs[fpcount++];
|
521
557
|
__float80 result;
|
@@ -1,5 +1,6 @@
|
|
1
1
|
/* -----------------------------------------------------------------*-C-*-
|
2
|
-
ffitarget.h - Copyright (c)
|
2
|
+
ffitarget.h - Copyright (c) 2012 Anthony Green
|
3
|
+
Copyright (c) 1996-2003 Red Hat, Inc.
|
3
4
|
Target configuration macros for IA-64.
|
4
5
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining
|
@@ -27,6 +28,10 @@
|
|
27
28
|
#ifndef LIBFFI_TARGET_H
|
28
29
|
#define LIBFFI_TARGET_H
|
29
30
|
|
31
|
+
#ifndef LIBFFI_H
|
32
|
+
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
33
|
+
#endif
|
34
|
+
|
30
35
|
#ifndef LIBFFI_ASM
|
31
36
|
typedef unsigned long long ffi_arg;
|
32
37
|
typedef signed long long ffi_sarg;
|
@@ -34,8 +39,8 @@ typedef signed long long ffi_sarg;
|
|
34
39
|
typedef enum ffi_abi {
|
35
40
|
FFI_FIRST_ABI = 0,
|
36
41
|
FFI_UNIX, /* Linux and all Unix variants use the same conventions */
|
37
|
-
|
38
|
-
|
42
|
+
FFI_LAST_ABI,
|
43
|
+
FFI_DEFAULT_ABI = FFI_UNIX
|
39
44
|
} ffi_abi;
|
40
45
|
#endif
|
41
46
|
|
@@ -45,6 +50,7 @@ typedef enum ffi_abi {
|
|
45
50
|
#define FFI_TRAMPOLINE_SIZE 24 /* Really the following struct, which */
|
46
51
|
/* can be interpreted as a C function */
|
47
52
|
/* descriptor: */
|
53
|
+
#define FFI_TARGET_SPECIFIC_VARIADIC 1
|
54
|
+
#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs
|
48
55
|
|
49
56
|
#endif
|
50
|
-
|
@@ -36,6 +36,12 @@
|
|
36
36
|
|
37
37
|
.pred.safe_across_calls p1-p5,p16-p63
|
38
38
|
.text
|
39
|
+
/* HPUX assembler needs to see these symbols, otherwise compilation
|
40
|
+
fails */
|
41
|
+
#ifdef __hpux
|
42
|
+
.global memcpy
|
43
|
+
.global ffi_closure_unix_inner
|
44
|
+
#endif
|
39
45
|
|
40
46
|
/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue,
|
41
47
|
void (*fn)(void), int flags);
|
@@ -104,7 +110,12 @@ ffi_call_unix:
|
|
104
110
|
mov ar.pfs = loc0
|
105
111
|
addl r18 = @ltoffx(.Lst_table), gp
|
106
112
|
;;
|
113
|
+
/* default assembler on HP-UX does not support LDXMOV */
|
114
|
+
#ifdef __hpux
|
115
|
+
ld8 r18 = [r18]
|
116
|
+
#else
|
107
117
|
ld8.mov r18 = [r18], .Lst_table
|
118
|
+
#endif
|
108
119
|
mov b0 = loc1
|
109
120
|
;;
|
110
121
|
shladd r18 = r16, 3, r18
|
@@ -175,7 +186,6 @@ ffi_call_unix:
|
|
175
186
|
;;
|
176
187
|
|
177
188
|
.Lst_small_struct:
|
178
|
-
add sp = -16, sp
|
179
189
|
cmp.lt p6, p0 = 8, in3
|
180
190
|
cmp.lt p7, p0 = 16, in3
|
181
191
|
cmp.lt p8, p0 = 24, in3
|
@@ -191,6 +201,12 @@ ffi_call_unix:
|
|
191
201
|
(p8) st8 [r18] = r11
|
192
202
|
mov out1 = sp
|
193
203
|
mov out2 = in3
|
204
|
+
;;
|
205
|
+
// ia64 software calling convention requires
|
206
|
+
// top 16 bytes of stack to be scratch space
|
207
|
+
// PLT resolver uses that scratch space at
|
208
|
+
// 'memcpy' symbol reolution time
|
209
|
+
add sp = -16, sp
|
194
210
|
br.call.sptk.many b0 = memcpy#
|
195
211
|
;;
|
196
212
|
mov ar.pfs = loc0
|
@@ -352,7 +368,11 @@ ffi_closure_unix:
|
|
352
368
|
addl r18 = @ltoffx(.Lld_table), gp
|
353
369
|
mov ar.pfs = loc0
|
354
370
|
;;
|
355
|
-
|
371
|
+
#ifdef __hpux
|
372
|
+
ld8 r18 = [r18]
|
373
|
+
#else
|
374
|
+
ld8.mov r18 = [r18], .Lst_table
|
375
|
+
#endif
|
356
376
|
mov b0 = loc1
|
357
377
|
;;
|
358
378
|
shladd r18 = r16, 3, r18
|
@@ -510,8 +530,11 @@ ffi_closure_unix:
|
|
510
530
|
;;
|
511
531
|
|
512
532
|
.endp ffi_closure_unix
|
513
|
-
|
533
|
+
#ifdef __hpux
|
534
|
+
.rodata
|
535
|
+
#else
|
514
536
|
.section .rodata
|
537
|
+
#endif
|
515
538
|
.align 8
|
516
539
|
.Lst_table:
|
517
540
|
data8 @pcrel(.Lst_void) // FFI_TYPE_VOID
|
@@ -529,6 +552,7 @@ ffi_closure_unix:
|
|
529
552
|
data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64
|
530
553
|
data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT
|
531
554
|
data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER
|
555
|
+
data8 @pcrel(.Lst_void) // FFI_TYPE_COMPLEX (not implemented)
|
532
556
|
data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT
|
533
557
|
data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT
|
534
558
|
data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE
|
@@ -550,6 +574,7 @@ ffi_closure_unix:
|
|
550
574
|
data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64
|
551
575
|
data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT
|
552
576
|
data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER
|
577
|
+
data8 @pcrel(.Lld_void) // FFI_TYPE_COMPLEX (not implemented)
|
553
578
|
data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT
|
554
579
|
data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT
|
555
580
|
data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE
|
@@ -39,7 +39,7 @@
|
|
39
39
|
#include <ffi_common.h>
|
40
40
|
#include <stdlib.h>
|
41
41
|
|
42
|
-
#if !defined(NO_JAVA_RAW_API)
|
42
|
+
#if !defined(NO_JAVA_RAW_API)
|
43
43
|
|
44
44
|
size_t
|
45
45
|
ffi_java_raw_size (ffi_cif *cif)
|
@@ -60,6 +60,9 @@ ffi_java_raw_size (ffi_cif *cif)
|
|
60
60
|
case FFI_TYPE_STRUCT:
|
61
61
|
/* No structure parameters in Java. */
|
62
62
|
abort();
|
63
|
+
case FFI_TYPE_COMPLEX:
|
64
|
+
/* Not supported yet. */
|
65
|
+
abort();
|
63
66
|
default:
|
64
67
|
result += FFI_SIZEOF_JAVA_RAW;
|
65
68
|
}
|
@@ -104,10 +107,14 @@ ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args)
|
|
104
107
|
*args = (void*) &(raw++)->ptr;
|
105
108
|
break;
|
106
109
|
|
110
|
+
case FFI_TYPE_COMPLEX:
|
111
|
+
/* Not supported yet. */
|
112
|
+
abort();
|
113
|
+
|
107
114
|
default:
|
108
115
|
*args = raw;
|
109
116
|
raw +=
|
110
|
-
|
117
|
+
FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
|
111
118
|
}
|
112
119
|
}
|
113
120
|
|
@@ -126,13 +133,16 @@ ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args)
|
|
126
133
|
*args = (void*) raw;
|
127
134
|
raw += 2;
|
128
135
|
break;
|
136
|
+
case FFI_TYPE_COMPLEX:
|
137
|
+
/* Not supported yet. */
|
138
|
+
abort();
|
129
139
|
default:
|
130
140
|
*args = (void*) raw++;
|
131
141
|
}
|
132
142
|
#else /* FFI_SIZEOF_JAVA_RAW != 8 */
|
133
143
|
*args = (void*) raw;
|
134
144
|
raw +=
|
135
|
-
|
145
|
+
FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
|
136
146
|
#endif /* FFI_SIZEOF_JAVA_RAW == 8 */
|
137
147
|
}
|
138
148
|
|
@@ -224,7 +234,7 @@ ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw)
|
|
224
234
|
#else
|
225
235
|
memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
|
226
236
|
raw +=
|
227
|
-
|
237
|
+
FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
|
228
238
|
#endif
|
229
239
|
}
|
230
240
|
}
|
@@ -254,6 +264,10 @@ ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
|
|
254
264
|
*(SINT64 *)rvalue <<= 32;
|
255
265
|
break;
|
256
266
|
|
267
|
+
case FFI_TYPE_COMPLEX:
|
268
|
+
/* Not supported yet. */
|
269
|
+
abort();
|
270
|
+
|
257
271
|
default:
|
258
272
|
break;
|
259
273
|
}
|
@@ -279,6 +293,10 @@ ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
|
|
279
293
|
*(SINT64 *)rvalue >>= 32;
|
280
294
|
break;
|
281
295
|
|
296
|
+
case FFI_TYPE_COMPLEX:
|
297
|
+
/* Not supported yet. */
|
298
|
+
abort();
|
299
|
+
|
282
300
|
default:
|
283
301
|
break;
|
284
302
|
}
|
@@ -311,7 +329,7 @@ ffi_java_translate_args (ffi_cif *cif, void *rvalue,
|
|
311
329
|
ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
|
312
330
|
|
313
331
|
ffi_java_ptrarray_to_raw (cif, avalue, raw);
|
314
|
-
(*cl->fun) (cif, rvalue, raw, cl->user_data);
|
332
|
+
(*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data);
|
315
333
|
ffi_java_raw_to_rvalue (cif, rvalue);
|
316
334
|
}
|
317
335
|
|
@@ -353,4 +371,4 @@ ffi_prep_java_raw_closure (ffi_java_raw_closure* cl,
|
|
353
371
|
|
354
372
|
#endif /* FFI_CLOSURES */
|
355
373
|
#endif /* !FFI_NATIVE_RAW_API */
|
356
|
-
#endif /* !
|
374
|
+
#endif /* !NO_JAVA_RAW_API */
|
@@ -0,0 +1,273 @@
|
|
1
|
+
/* Copyright (c) 2020 Kalray
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
``Software''), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
17
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
18
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
19
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
20
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
21
|
+
|
22
|
+
#if defined(__kvx__)
|
23
|
+
#include <stdio.h>
|
24
|
+
#include <stdlib.h>
|
25
|
+
#include <stdint.h>
|
26
|
+
#include <fficonfig.h>
|
27
|
+
#include <ffi.h>
|
28
|
+
#include "ffi_common.h"
|
29
|
+
#include "asm.h"
|
30
|
+
|
31
|
+
#define ALIGN(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1)
|
32
|
+
#define ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
33
|
+
#define KVX_ABI_STACK_ALIGNMENT (32)
|
34
|
+
#define KVX_ABI_STACK_ARG_ALIGNMENT (8)
|
35
|
+
#define max(a,b) ((a) > (b) ? (a) : (b))
|
36
|
+
|
37
|
+
#ifdef FFI_DEBUG
|
38
|
+
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while(0)
|
39
|
+
#else
|
40
|
+
#define DEBUG_PRINT(...)
|
41
|
+
#endif
|
42
|
+
|
43
|
+
struct ret_value {
|
44
|
+
unsigned long int r0;
|
45
|
+
unsigned long int r1;
|
46
|
+
unsigned long int r2;
|
47
|
+
unsigned long int r3;
|
48
|
+
};
|
49
|
+
|
50
|
+
extern struct ret_value ffi_call_SYSV(unsigned total_size,
|
51
|
+
unsigned size,
|
52
|
+
extended_cif *ecif,
|
53
|
+
unsigned *rvalue_addr,
|
54
|
+
void *fn,
|
55
|
+
unsigned int_ext_method);
|
56
|
+
|
57
|
+
/* Perform machine dependent cif processing */
|
58
|
+
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
59
|
+
{
|
60
|
+
cif->flags = cif->rtype->size;
|
61
|
+
return FFI_OK;
|
62
|
+
}
|
63
|
+
|
64
|
+
/* ffi_prep_args is called by the assembly routine once stack space
|
65
|
+
has been allocated for the function's arguments */
|
66
|
+
|
67
|
+
void *ffi_prep_args(char *stack, unsigned int arg_slots_size, extended_cif *ecif)
|
68
|
+
{
|
69
|
+
char *stacktemp = stack;
|
70
|
+
char *current_arg_passed_by_value = stack + arg_slots_size;
|
71
|
+
int i, s;
|
72
|
+
ffi_type **arg;
|
73
|
+
int count = 0;
|
74
|
+
ffi_cif *cif = ecif->cif;
|
75
|
+
void **argv = ecif->avalue;
|
76
|
+
|
77
|
+
arg = cif->arg_types;
|
78
|
+
|
79
|
+
DEBUG_PRINT("stack: %p\n", stack);
|
80
|
+
DEBUG_PRINT("arg_slots_size: %u\n", arg_slots_size);
|
81
|
+
DEBUG_PRINT("current_arg_passed_by_value: %p\n", current_arg_passed_by_value);
|
82
|
+
DEBUG_PRINT("ecif: %p\n", ecif);
|
83
|
+
DEBUG_PRINT("ecif->avalue: %p\n", ecif->avalue);
|
84
|
+
|
85
|
+
for (i = 0; i < cif->nargs; i++) {
|
86
|
+
|
87
|
+
s = KVX_ABI_SLOT_SIZE;
|
88
|
+
switch((*arg)->type) {
|
89
|
+
case FFI_TYPE_SINT8:
|
90
|
+
case FFI_TYPE_UINT8:
|
91
|
+
case FFI_TYPE_SINT16:
|
92
|
+
case FFI_TYPE_UINT16:
|
93
|
+
case FFI_TYPE_SINT32:
|
94
|
+
case FFI_TYPE_UINT32:
|
95
|
+
case FFI_TYPE_FLOAT:
|
96
|
+
case FFI_TYPE_DOUBLE:
|
97
|
+
case FFI_TYPE_UINT64:
|
98
|
+
case FFI_TYPE_SINT64:
|
99
|
+
case FFI_TYPE_POINTER:
|
100
|
+
DEBUG_PRINT("INT64/32/16/8/FLOAT/DOUBLE or POINTER @%p\n", stack);
|
101
|
+
*(uint64_t *) stack = *(uint64_t *)(* argv);
|
102
|
+
break;
|
103
|
+
|
104
|
+
case FFI_TYPE_COMPLEX:
|
105
|
+
if ((*arg)->size == 8)
|
106
|
+
*(_Complex float *) stack = *(_Complex float *)(* argv);
|
107
|
+
else if ((*arg)->size == 16) {
|
108
|
+
*(_Complex double *) stack = *(_Complex double *)(* argv);
|
109
|
+
s = 16;
|
110
|
+
} else
|
111
|
+
abort();
|
112
|
+
break;
|
113
|
+
case FFI_TYPE_STRUCT: {
|
114
|
+
char *value;
|
115
|
+
unsigned int written_size = 0;
|
116
|
+
DEBUG_PRINT("struct by value @%p\n", stack);
|
117
|
+
if ((*arg)->size > KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) {
|
118
|
+
DEBUG_PRINT("big struct\n");
|
119
|
+
*(uint64_t *) stack = (uintptr_t)current_arg_passed_by_value;
|
120
|
+
value = current_arg_passed_by_value;
|
121
|
+
current_arg_passed_by_value += (*arg)->size;
|
122
|
+
written_size = KVX_ABI_SLOT_SIZE;
|
123
|
+
} else {
|
124
|
+
value = stack;
|
125
|
+
written_size = (*arg)->size;
|
126
|
+
}
|
127
|
+
memcpy(value, *argv, (*arg)->size);
|
128
|
+
s = ALIGN(written_size, KVX_ABI_STACK_ARG_ALIGNMENT);
|
129
|
+
break;
|
130
|
+
}
|
131
|
+
default:
|
132
|
+
printf("Error: unsupported arg type %d\n", (*arg)->type);
|
133
|
+
abort();
|
134
|
+
break;
|
135
|
+
|
136
|
+
}
|
137
|
+
stack += s;
|
138
|
+
count += s;
|
139
|
+
argv++;
|
140
|
+
arg++;
|
141
|
+
}
|
142
|
+
#ifdef FFI_DEBUG
|
143
|
+
FFI_ASSERT(((intptr_t)(stacktemp + REG_ARGS_SIZE) & (KVX_ABI_STACK_ALIGNMENT-1)) == 0);
|
144
|
+
#endif
|
145
|
+
return stacktemp + REG_ARGS_SIZE;
|
146
|
+
}
|
147
|
+
|
148
|
+
/* Perform machine dependent cif processing when we have a variadic function */
|
149
|
+
|
150
|
+
ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs,
|
151
|
+
unsigned int ntotalargs)
|
152
|
+
{
|
153
|
+
cif->flags = cif->rtype->size;
|
154
|
+
return FFI_OK;
|
155
|
+
}
|
156
|
+
|
157
|
+
static unsigned long handle_small_int_ext(kvx_intext_method *int_ext_method,
|
158
|
+
const ffi_type *rtype)
|
159
|
+
{
|
160
|
+
switch (rtype->type) {
|
161
|
+
case FFI_TYPE_SINT8:
|
162
|
+
*int_ext_method = KVX_RET_SXBD;
|
163
|
+
return KVX_REGISTER_SIZE;
|
164
|
+
|
165
|
+
case FFI_TYPE_SINT16:
|
166
|
+
*int_ext_method = KVX_RET_SXHD;
|
167
|
+
return KVX_REGISTER_SIZE;
|
168
|
+
|
169
|
+
case FFI_TYPE_SINT32:
|
170
|
+
*int_ext_method = KVX_RET_SXWD;
|
171
|
+
return KVX_REGISTER_SIZE;
|
172
|
+
|
173
|
+
case FFI_TYPE_UINT8:
|
174
|
+
*int_ext_method = KVX_RET_ZXBD;
|
175
|
+
return KVX_REGISTER_SIZE;
|
176
|
+
|
177
|
+
case FFI_TYPE_UINT16:
|
178
|
+
*int_ext_method = KVX_RET_ZXHD;
|
179
|
+
return KVX_REGISTER_SIZE;
|
180
|
+
|
181
|
+
case FFI_TYPE_UINT32:
|
182
|
+
*int_ext_method = KVX_RET_ZXWD;
|
183
|
+
return KVX_REGISTER_SIZE;
|
184
|
+
|
185
|
+
default:
|
186
|
+
*int_ext_method = KVX_RET_NONE;
|
187
|
+
return rtype->size;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
192
|
+
{
|
193
|
+
int i;
|
194
|
+
unsigned long int slot_fitting_args_size = 0;
|
195
|
+
unsigned long int total_size = 0;
|
196
|
+
unsigned long int big_struct_size = 0;
|
197
|
+
kvx_intext_method int_extension_method;
|
198
|
+
ffi_type **arg;
|
199
|
+
struct ret_value local_rvalue = {0};
|
200
|
+
size_t wb_size;
|
201
|
+
|
202
|
+
|
203
|
+
/* Calculate size to allocate on stack */
|
204
|
+
for (i = 0, arg = cif->arg_types; i < cif->nargs; i++, arg++) {
|
205
|
+
DEBUG_PRINT("argument %d, type %d, size %lu\n", i, (*arg)->type, (*arg)->size);
|
206
|
+
if (((*arg)->type == FFI_TYPE_STRUCT) || ((*arg)->type == FFI_TYPE_COMPLEX)) {
|
207
|
+
if ((*arg)->size <= KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) {
|
208
|
+
slot_fitting_args_size += ALIGN((*arg)->size, KVX_ABI_SLOT_SIZE);
|
209
|
+
} else {
|
210
|
+
slot_fitting_args_size += KVX_ABI_SLOT_SIZE; /* aggregate passed by reference */
|
211
|
+
big_struct_size += ALIGN((*arg)->size, KVX_ABI_SLOT_SIZE);
|
212
|
+
}
|
213
|
+
} else if ((*arg)->size <= KVX_ABI_SLOT_SIZE) {
|
214
|
+
slot_fitting_args_size += KVX_ABI_SLOT_SIZE;
|
215
|
+
} else {
|
216
|
+
printf("Error: unsupported arg size %ld arg type %d\n", (*arg)->size, (*arg)->type);
|
217
|
+
abort(); /* should never happen? */
|
218
|
+
}
|
219
|
+
}
|
220
|
+
|
221
|
+
extended_cif ecif;
|
222
|
+
ecif.cif = cif;
|
223
|
+
ecif.avalue = avalue;
|
224
|
+
ecif.rvalue = rvalue;
|
225
|
+
|
226
|
+
/* This implementation allocates anyway for all register based args */
|
227
|
+
slot_fitting_args_size = max(slot_fitting_args_size, REG_ARGS_SIZE);
|
228
|
+
total_size = slot_fitting_args_size + big_struct_size;
|
229
|
+
total_size = ALIGN(total_size, KVX_ABI_STACK_ALIGNMENT);
|
230
|
+
|
231
|
+
/* wb_size: write back size, the size we will need to write back to user
|
232
|
+
* provided buffer. In theory it should always be cif->flags which is
|
233
|
+
* cif->rtype->size. But libffi API mandates that for integral types
|
234
|
+
* of size <= system register size, then we *MUST* write back
|
235
|
+
* the size of system register size.
|
236
|
+
* in our case, if size <= 8 bytes we must write back 8 bytes.
|
237
|
+
* floats, complex and structs are not affected, only integrals.
|
238
|
+
*/
|
239
|
+
wb_size = handle_small_int_ext(&int_extension_method, cif->rtype);
|
240
|
+
|
241
|
+
switch (cif->abi) {
|
242
|
+
case FFI_SYSV:
|
243
|
+
DEBUG_PRINT("total_size: %lu\n", total_size);
|
244
|
+
DEBUG_PRINT("slot fitting args size: %lu\n", slot_fitting_args_size);
|
245
|
+
DEBUG_PRINT("rvalue: %p\n", rvalue);
|
246
|
+
DEBUG_PRINT("fn: %p\n", fn);
|
247
|
+
DEBUG_PRINT("rsize: %u\n", cif->flags);
|
248
|
+
DEBUG_PRINT("wb_size: %u\n", wb_size);
|
249
|
+
DEBUG_PRINT("int_extension_method: %u\n", int_extension_method);
|
250
|
+
local_rvalue = ffi_call_SYSV(total_size, slot_fitting_args_size,
|
251
|
+
&ecif, rvalue, fn, int_extension_method);
|
252
|
+
if ((cif->flags <= KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE)
|
253
|
+
&& (cif->rtype->type != FFI_TYPE_VOID))
|
254
|
+
memcpy(rvalue, &local_rvalue, wb_size);
|
255
|
+
break;
|
256
|
+
default:
|
257
|
+
abort();
|
258
|
+
break;
|
259
|
+
}
|
260
|
+
}
|
261
|
+
|
262
|
+
/* Closures not supported yet */
|
263
|
+
ffi_status
|
264
|
+
ffi_prep_closure_loc (ffi_closure* closure,
|
265
|
+
ffi_cif* cif,
|
266
|
+
void (*fun)(ffi_cif*,void*,void**,void*),
|
267
|
+
void *user_data,
|
268
|
+
void *codeloc)
|
269
|
+
{
|
270
|
+
return FFI_BAD_ABI;
|
271
|
+
}
|
272
|
+
|
273
|
+
#endif /* (__kvx__) */
|