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,10 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
ffi64.c - Copyright (c)
|
3
|
-
Copyright (c)
|
4
|
-
|
5
|
-
|
2
|
+
ffi64.c - Copyright (c) 2011, 2018, 2022 Anthony Green
|
3
|
+
Copyright (c) 2013 The Written Word, Inc.
|
4
|
+
Copyright (c) 2008, 2010 Red Hat, Inc.
|
5
|
+
Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
|
6
|
+
|
7
|
+
x86-64 Foreign Function Interface
|
6
8
|
|
7
9
|
Permission is hereby granted, free of charge, to any person obtaining
|
8
10
|
a copy of this software and associated documentation files (the
|
@@ -30,29 +32,54 @@
|
|
30
32
|
|
31
33
|
#include <stdlib.h>
|
32
34
|
#include <stdarg.h>
|
35
|
+
#include <stdint.h>
|
36
|
+
#include <tramp.h>
|
37
|
+
#include "internal64.h"
|
33
38
|
|
34
39
|
#ifdef __x86_64__
|
35
40
|
|
36
41
|
#define MAX_GPR_REGS 6
|
37
42
|
#define MAX_SSE_REGS 8
|
38
43
|
|
44
|
+
#if defined(__INTEL_COMPILER)
|
45
|
+
#include "xmmintrin.h"
|
46
|
+
#define UINT128 __m128
|
47
|
+
#else
|
48
|
+
#if defined(__SUNPRO_C)
|
49
|
+
#include <sunmedia_types.h>
|
50
|
+
#define UINT128 __m128i
|
51
|
+
#else
|
52
|
+
#define UINT128 __int128_t
|
53
|
+
#endif
|
54
|
+
#endif
|
55
|
+
|
56
|
+
union big_int_union
|
57
|
+
{
|
58
|
+
UINT32 i32;
|
59
|
+
UINT64 i64;
|
60
|
+
UINT128 i128;
|
61
|
+
};
|
62
|
+
|
39
63
|
struct register_args
|
40
64
|
{
|
41
65
|
/* Registers for argument passing. */
|
42
66
|
UINT64 gpr[MAX_GPR_REGS];
|
43
|
-
|
67
|
+
union big_int_union sse[MAX_SSE_REGS];
|
68
|
+
UINT64 rax; /* ssecount */
|
69
|
+
UINT64 r10; /* static chain */
|
44
70
|
};
|
45
71
|
|
46
72
|
extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
|
47
|
-
void *raddr, void (*fnaddr)(void)
|
73
|
+
void *raddr, void (*fnaddr)(void)) FFI_HIDDEN;
|
48
74
|
|
49
75
|
/* All reference to register classes here is identical to the code in
|
50
76
|
gcc/config/i386/i386.c. Do *not* change one without the other. */
|
51
77
|
|
52
78
|
/* Register class used for passing given 64bit part of the argument.
|
53
|
-
These represent classes as documented by the PS ABI, with the
|
54
|
-
of SSESF, SSEDF classes, that are basically SSE class,
|
55
|
-
use SF or DFmode move instead of DImode to avoid
|
79
|
+
These represent classes as documented by the PS ABI, with the
|
80
|
+
exception of SSESF, SSEDF classes, that are basically SSE class,
|
81
|
+
just gcc will use SF or DFmode move instead of DImode to avoid
|
82
|
+
reformatting penalties.
|
56
83
|
|
57
84
|
Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
|
58
85
|
whenever possible (upper half does contain padding). */
|
@@ -130,7 +157,7 @@ merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
|
|
130
157
|
|
131
158
|
See the x86-64 PS ABI for details.
|
132
159
|
*/
|
133
|
-
static
|
160
|
+
static size_t
|
134
161
|
classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
135
162
|
size_t byte_offset)
|
136
163
|
{
|
@@ -145,8 +172,9 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
145
172
|
case FFI_TYPE_UINT64:
|
146
173
|
case FFI_TYPE_SINT64:
|
147
174
|
case FFI_TYPE_POINTER:
|
175
|
+
do_integer:
|
148
176
|
{
|
149
|
-
|
177
|
+
size_t size = byte_offset + type->size;
|
150
178
|
|
151
179
|
if (size <= 4)
|
152
180
|
{
|
@@ -166,7 +194,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
166
194
|
}
|
167
195
|
else if (size <= 16)
|
168
196
|
{
|
169
|
-
classes[0] = classes[1] =
|
197
|
+
classes[0] = classes[1] = X86_64_INTEGER_CLASS;
|
170
198
|
return 2;
|
171
199
|
}
|
172
200
|
else
|
@@ -181,16 +209,19 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
181
209
|
case FFI_TYPE_DOUBLE:
|
182
210
|
classes[0] = X86_64_SSEDF_CLASS;
|
183
211
|
return 1;
|
212
|
+
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
184
213
|
case FFI_TYPE_LONGDOUBLE:
|
185
214
|
classes[0] = X86_64_X87_CLASS;
|
186
215
|
classes[1] = X86_64_X87UP_CLASS;
|
187
216
|
return 2;
|
217
|
+
#endif
|
188
218
|
case FFI_TYPE_STRUCT:
|
189
219
|
{
|
190
|
-
const
|
191
|
-
|
192
|
-
|
193
|
-
|
220
|
+
const size_t UNITS_PER_WORD = 8;
|
221
|
+
size_t words = (type->size + byte_offset + UNITS_PER_WORD - 1)
|
222
|
+
/ UNITS_PER_WORD;
|
223
|
+
ffi_type **ptr;
|
224
|
+
unsigned int i;
|
194
225
|
enum x86_64_reg_class subclasses[MAX_CLASSES];
|
195
226
|
|
196
227
|
/* If the struct is larger than 32 bytes, pass it on the stack. */
|
@@ -204,6 +235,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
204
235
|
signalize memory class, so handle it as special case. */
|
205
236
|
if (!words)
|
206
237
|
{
|
238
|
+
case FFI_TYPE_VOID:
|
207
239
|
classes[0] = X86_64_NO_CLASS;
|
208
240
|
return 1;
|
209
241
|
}
|
@@ -211,16 +243,17 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
211
243
|
/* Merge the fields of structure. */
|
212
244
|
for (ptr = type->elements; *ptr != NULL; ptr++)
|
213
245
|
{
|
214
|
-
|
246
|
+
size_t num, pos;
|
215
247
|
|
216
|
-
byte_offset =
|
248
|
+
byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment);
|
217
249
|
|
218
250
|
num = classify_argument (*ptr, subclasses, byte_offset % 8);
|
219
251
|
if (num == 0)
|
220
252
|
return 0;
|
221
|
-
|
253
|
+
pos = byte_offset / 8;
|
254
|
+
for (i = 0; i < num && (i + pos) < words; i++)
|
222
255
|
{
|
223
|
-
|
256
|
+
size_t pos = byte_offset / 8;
|
224
257
|
classes[i + pos] =
|
225
258
|
merge_classes (subclasses[i], classes[i + pos]);
|
226
259
|
}
|
@@ -252,7 +285,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
252
285
|
|
253
286
|
/* The X86_64_SSEUP_CLASS should be always preceded by
|
254
287
|
X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
|
255
|
-
if (classes[i] == X86_64_SSEUP_CLASS
|
288
|
+
if (i > 1 && classes[i] == X86_64_SSEUP_CLASS
|
256
289
|
&& classes[i - 1] != X86_64_SSE_CLASS
|
257
290
|
&& classes[i - 1] != X86_64_SSEUP_CLASS)
|
258
291
|
{
|
@@ -263,7 +296,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
263
296
|
|
264
297
|
/* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
|
265
298
|
everything should be passed in memory. */
|
266
|
-
if (classes[i] == X86_64_X87UP_CLASS
|
299
|
+
if (i > 1 && classes[i] == X86_64_X87UP_CLASS
|
267
300
|
&& (classes[i - 1] != X86_64_X87_CLASS))
|
268
301
|
{
|
269
302
|
/* The first one should never be X86_64_X87UP_CLASS. */
|
@@ -273,22 +306,55 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
273
306
|
}
|
274
307
|
return words;
|
275
308
|
}
|
276
|
-
|
277
|
-
|
278
|
-
|
309
|
+
case FFI_TYPE_COMPLEX:
|
310
|
+
{
|
311
|
+
ffi_type *inner = type->elements[0];
|
312
|
+
switch (inner->type)
|
313
|
+
{
|
314
|
+
case FFI_TYPE_INT:
|
315
|
+
case FFI_TYPE_UINT8:
|
316
|
+
case FFI_TYPE_SINT8:
|
317
|
+
case FFI_TYPE_UINT16:
|
318
|
+
case FFI_TYPE_SINT16:
|
319
|
+
case FFI_TYPE_UINT32:
|
320
|
+
case FFI_TYPE_SINT32:
|
321
|
+
case FFI_TYPE_UINT64:
|
322
|
+
case FFI_TYPE_SINT64:
|
323
|
+
goto do_integer;
|
324
|
+
|
325
|
+
case FFI_TYPE_FLOAT:
|
326
|
+
classes[0] = X86_64_SSE_CLASS;
|
327
|
+
if (byte_offset % 8)
|
328
|
+
{
|
329
|
+
classes[1] = X86_64_SSESF_CLASS;
|
330
|
+
return 2;
|
331
|
+
}
|
332
|
+
return 1;
|
333
|
+
case FFI_TYPE_DOUBLE:
|
334
|
+
classes[0] = classes[1] = X86_64_SSEDF_CLASS;
|
335
|
+
return 2;
|
336
|
+
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
337
|
+
case FFI_TYPE_LONGDOUBLE:
|
338
|
+
classes[0] = X86_64_COMPLEX_X87_CLASS;
|
339
|
+
return 1;
|
340
|
+
#endif
|
341
|
+
}
|
342
|
+
}
|
279
343
|
}
|
280
|
-
|
344
|
+
abort();
|
281
345
|
}
|
282
346
|
|
283
347
|
/* Examine the argument and return set number of register required in each
|
284
348
|
class. Return zero iff parameter should be passed in memory, otherwise
|
285
349
|
the number of registers. */
|
286
350
|
|
287
|
-
static
|
351
|
+
static size_t
|
288
352
|
examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
|
289
353
|
_Bool in_return, int *pngpr, int *pnsse)
|
290
354
|
{
|
291
|
-
|
355
|
+
size_t n;
|
356
|
+
unsigned int i;
|
357
|
+
int ngpr, nsse;
|
292
358
|
|
293
359
|
n = classify_argument (type, classes, 0);
|
294
360
|
if (n == 0)
|
@@ -326,18 +392,74 @@ examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
|
|
326
392
|
|
327
393
|
/* Perform machine dependent cif processing. */
|
328
394
|
|
329
|
-
|
395
|
+
#ifndef __ILP32__
|
396
|
+
extern ffi_status
|
397
|
+
ffi_prep_cif_machdep_efi64(ffi_cif *cif);
|
398
|
+
#endif
|
399
|
+
|
400
|
+
ffi_status FFI_HIDDEN
|
330
401
|
ffi_prep_cif_machdep (ffi_cif *cif)
|
331
402
|
{
|
332
|
-
int gprcount, ssecount, i, avn,
|
403
|
+
int gprcount, ssecount, i, avn, ngpr, nsse;
|
404
|
+
unsigned flags;
|
333
405
|
enum x86_64_reg_class classes[MAX_CLASSES];
|
334
|
-
size_t bytes;
|
406
|
+
size_t bytes, n, rtype_size;
|
407
|
+
ffi_type *rtype;
|
408
|
+
|
409
|
+
#ifndef __ILP32__
|
410
|
+
if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
|
411
|
+
return ffi_prep_cif_machdep_efi64(cif);
|
412
|
+
#endif
|
413
|
+
if (cif->abi != FFI_UNIX64)
|
414
|
+
return FFI_BAD_ABI;
|
335
415
|
|
336
416
|
gprcount = ssecount = 0;
|
337
417
|
|
338
|
-
|
339
|
-
|
418
|
+
rtype = cif->rtype;
|
419
|
+
rtype_size = rtype->size;
|
420
|
+
switch (rtype->type)
|
340
421
|
{
|
422
|
+
case FFI_TYPE_VOID:
|
423
|
+
flags = UNIX64_RET_VOID;
|
424
|
+
break;
|
425
|
+
case FFI_TYPE_UINT8:
|
426
|
+
flags = UNIX64_RET_UINT8;
|
427
|
+
break;
|
428
|
+
case FFI_TYPE_SINT8:
|
429
|
+
flags = UNIX64_RET_SINT8;
|
430
|
+
break;
|
431
|
+
case FFI_TYPE_UINT16:
|
432
|
+
flags = UNIX64_RET_UINT16;
|
433
|
+
break;
|
434
|
+
case FFI_TYPE_SINT16:
|
435
|
+
flags = UNIX64_RET_SINT16;
|
436
|
+
break;
|
437
|
+
case FFI_TYPE_UINT32:
|
438
|
+
flags = UNIX64_RET_UINT32;
|
439
|
+
break;
|
440
|
+
case FFI_TYPE_INT:
|
441
|
+
case FFI_TYPE_SINT32:
|
442
|
+
flags = UNIX64_RET_SINT32;
|
443
|
+
break;
|
444
|
+
case FFI_TYPE_UINT64:
|
445
|
+
case FFI_TYPE_SINT64:
|
446
|
+
flags = UNIX64_RET_INT64;
|
447
|
+
break;
|
448
|
+
case FFI_TYPE_POINTER:
|
449
|
+
flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64);
|
450
|
+
break;
|
451
|
+
case FFI_TYPE_FLOAT:
|
452
|
+
flags = UNIX64_RET_XMM32;
|
453
|
+
break;
|
454
|
+
case FFI_TYPE_DOUBLE:
|
455
|
+
flags = UNIX64_RET_XMM64;
|
456
|
+
break;
|
457
|
+
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
458
|
+
case FFI_TYPE_LONGDOUBLE:
|
459
|
+
flags = UNIX64_RET_X87;
|
460
|
+
break;
|
461
|
+
#endif
|
462
|
+
case FFI_TYPE_STRUCT:
|
341
463
|
n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
|
342
464
|
if (n == 0)
|
343
465
|
{
|
@@ -345,22 +467,62 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
345
467
|
memory is the first argument. Allocate a register for it. */
|
346
468
|
gprcount++;
|
347
469
|
/* We don't have to do anything in asm for the return. */
|
348
|
-
flags =
|
470
|
+
flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM;
|
349
471
|
}
|
350
|
-
else
|
472
|
+
else
|
351
473
|
{
|
352
|
-
/* Mark which registers the result appears in. */
|
353
474
|
_Bool sse0 = SSE_CLASS_P (classes[0]);
|
354
|
-
|
355
|
-
if (
|
356
|
-
flags
|
357
|
-
else if (
|
358
|
-
flags
|
359
|
-
else
|
360
|
-
|
361
|
-
|
362
|
-
|
475
|
+
|
476
|
+
if (rtype_size == 4 && sse0)
|
477
|
+
flags = UNIX64_RET_XMM32;
|
478
|
+
else if (rtype_size == 8)
|
479
|
+
flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64;
|
480
|
+
else
|
481
|
+
{
|
482
|
+
_Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
|
483
|
+
if (sse0 && sse1)
|
484
|
+
flags = UNIX64_RET_ST_XMM0_XMM1;
|
485
|
+
else if (sse0)
|
486
|
+
flags = UNIX64_RET_ST_XMM0_RAX;
|
487
|
+
else if (sse1)
|
488
|
+
flags = UNIX64_RET_ST_RAX_XMM0;
|
489
|
+
else
|
490
|
+
flags = UNIX64_RET_ST_RAX_RDX;
|
491
|
+
flags |= rtype_size << UNIX64_SIZE_SHIFT;
|
492
|
+
}
|
493
|
+
}
|
494
|
+
break;
|
495
|
+
case FFI_TYPE_COMPLEX:
|
496
|
+
switch (rtype->elements[0]->type)
|
497
|
+
{
|
498
|
+
case FFI_TYPE_UINT8:
|
499
|
+
case FFI_TYPE_SINT8:
|
500
|
+
case FFI_TYPE_UINT16:
|
501
|
+
case FFI_TYPE_SINT16:
|
502
|
+
case FFI_TYPE_INT:
|
503
|
+
case FFI_TYPE_UINT32:
|
504
|
+
case FFI_TYPE_SINT32:
|
505
|
+
case FFI_TYPE_UINT64:
|
506
|
+
case FFI_TYPE_SINT64:
|
507
|
+
flags = UNIX64_RET_ST_RAX_RDX | ((unsigned) rtype_size << UNIX64_SIZE_SHIFT);
|
508
|
+
break;
|
509
|
+
case FFI_TYPE_FLOAT:
|
510
|
+
flags = UNIX64_RET_XMM64;
|
511
|
+
break;
|
512
|
+
case FFI_TYPE_DOUBLE:
|
513
|
+
flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT);
|
514
|
+
break;
|
515
|
+
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
516
|
+
case FFI_TYPE_LONGDOUBLE:
|
517
|
+
flags = UNIX64_RET_X87_2;
|
518
|
+
break;
|
519
|
+
#endif
|
520
|
+
default:
|
521
|
+
return FFI_BAD_TYPEDEF;
|
363
522
|
}
|
523
|
+
break;
|
524
|
+
default:
|
525
|
+
return FFI_BAD_TYPEDEF;
|
364
526
|
}
|
365
527
|
|
366
528
|
/* Go over all arguments and determine the way they should be passed.
|
@@ -377,7 +539,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
377
539
|
if (align < 8)
|
378
540
|
align = 8;
|
379
541
|
|
380
|
-
bytes =
|
542
|
+
bytes = FFI_ALIGN (bytes, align);
|
381
543
|
bytes += cif->arg_types[i]->size;
|
382
544
|
}
|
383
545
|
else
|
@@ -387,53 +549,58 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
387
549
|
}
|
388
550
|
}
|
389
551
|
if (ssecount)
|
390
|
-
flags |=
|
552
|
+
flags |= UNIX64_FLAG_XMM_ARGS;
|
553
|
+
|
391
554
|
cif->flags = flags;
|
392
|
-
cif->bytes = bytes;
|
555
|
+
cif->bytes = (unsigned) FFI_ALIGN (bytes, 8);
|
393
556
|
|
394
557
|
return FFI_OK;
|
395
558
|
}
|
396
559
|
|
397
|
-
void
|
398
|
-
|
560
|
+
static void
|
561
|
+
ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
562
|
+
void **avalue, void *closure)
|
399
563
|
{
|
400
564
|
enum x86_64_reg_class classes[MAX_CLASSES];
|
401
565
|
char *stack, *argp;
|
402
566
|
ffi_type **arg_types;
|
403
|
-
int gprcount, ssecount, ngpr, nsse, i, avn;
|
404
|
-
_Bool ret_in_memory;
|
567
|
+
int gprcount, ssecount, ngpr, nsse, i, avn, flags;
|
405
568
|
struct register_args *reg_args;
|
406
569
|
|
407
570
|
/* Can't call 32-bit mode from 64-bit mode. */
|
408
571
|
FFI_ASSERT (cif->abi == FFI_UNIX64);
|
409
572
|
|
410
573
|
/* If the return value is a struct and we don't have a return value
|
411
|
-
address then we need to make one.
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
574
|
+
address then we need to make one. Otherwise we can ignore it. */
|
575
|
+
flags = cif->flags;
|
576
|
+
if (rvalue == NULL)
|
577
|
+
{
|
578
|
+
if (flags & UNIX64_FLAG_RET_IN_MEM)
|
579
|
+
rvalue = alloca (cif->rtype->size);
|
580
|
+
else
|
581
|
+
flags = UNIX64_RET_VOID;
|
582
|
+
}
|
583
|
+
|
584
|
+
arg_types = cif->arg_types;
|
585
|
+
avn = cif->nargs;
|
417
586
|
|
418
587
|
/* Allocate the space for the arguments, plus 4 words of temp space. */
|
419
588
|
stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
|
420
589
|
reg_args = (struct register_args *) stack;
|
421
590
|
argp = stack + sizeof (struct register_args);
|
422
591
|
|
592
|
+
reg_args->r10 = (uintptr_t) closure;
|
593
|
+
|
423
594
|
gprcount = ssecount = 0;
|
424
595
|
|
425
596
|
/* If the return value is passed in memory, add the pointer as the
|
426
597
|
first integer argument. */
|
427
|
-
if (
|
428
|
-
reg_args->gpr[gprcount++] = (long) rvalue;
|
429
|
-
|
430
|
-
avn = cif->nargs;
|
431
|
-
arg_types = cif->arg_types;
|
598
|
+
if (flags & UNIX64_FLAG_RET_IN_MEM)
|
599
|
+
reg_args->gpr[gprcount++] = (unsigned long) rvalue;
|
432
600
|
|
433
601
|
for (i = 0; i < avn; ++i)
|
434
602
|
{
|
435
|
-
size_t size = arg_types[i]->size;
|
436
|
-
int n;
|
603
|
+
size_t n, size = arg_types[i]->size;
|
437
604
|
|
438
605
|
n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
|
439
606
|
if (n == 0
|
@@ -446,33 +613,54 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
446
613
|
if (align < 8)
|
447
614
|
align = 8;
|
448
615
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
616
|
+
/* Pass this argument in memory. */
|
617
|
+
argp = (void *) FFI_ALIGN (argp, align);
|
618
|
+
memcpy (argp, avalue[i], size);
|
619
|
+
|
620
|
+
argp += size;
|
621
|
+
}
|
454
622
|
else
|
455
623
|
{
|
456
624
|
/* The argument is passed entirely in registers. */
|
457
625
|
char *a = (char *) avalue[i];
|
458
|
-
int j;
|
626
|
+
unsigned int j;
|
459
627
|
|
460
628
|
for (j = 0; j < n; j++, a += 8, size -= 8)
|
461
629
|
{
|
462
630
|
switch (classes[j])
|
463
631
|
{
|
632
|
+
case X86_64_NO_CLASS:
|
633
|
+
case X86_64_SSEUP_CLASS:
|
634
|
+
break;
|
464
635
|
case X86_64_INTEGER_CLASS:
|
465
636
|
case X86_64_INTEGERSI_CLASS:
|
466
|
-
|
467
|
-
|
637
|
+
/* Sign-extend integer arguments passed in general
|
638
|
+
purpose registers, to cope with the fact that
|
639
|
+
LLVM incorrectly assumes that this will be done
|
640
|
+
(the x86-64 PS ABI does not specify this). */
|
641
|
+
switch (arg_types[i]->type)
|
642
|
+
{
|
643
|
+
case FFI_TYPE_SINT8:
|
644
|
+
reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a);
|
645
|
+
break;
|
646
|
+
case FFI_TYPE_SINT16:
|
647
|
+
reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a);
|
648
|
+
break;
|
649
|
+
case FFI_TYPE_SINT32:
|
650
|
+
reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a);
|
651
|
+
break;
|
652
|
+
default:
|
653
|
+
reg_args->gpr[gprcount] = 0;
|
654
|
+
memcpy (®_args->gpr[gprcount], a, size);
|
655
|
+
}
|
468
656
|
gprcount++;
|
469
657
|
break;
|
470
658
|
case X86_64_SSE_CLASS:
|
471
659
|
case X86_64_SSEDF_CLASS:
|
472
|
-
reg_args->sse[ssecount++]
|
660
|
+
memcpy (®_args->sse[ssecount++].i64, a, sizeof(UINT64));
|
473
661
|
break;
|
474
662
|
case X86_64_SSESF_CLASS:
|
475
|
-
reg_args->sse[ssecount++]
|
663
|
+
memcpy (®_args->sse[ssecount++].i32, a, sizeof(UINT32));
|
476
664
|
break;
|
477
665
|
default:
|
478
666
|
abort();
|
@@ -480,13 +668,87 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
480
668
|
}
|
481
669
|
}
|
482
670
|
}
|
671
|
+
reg_args->rax = ssecount;
|
483
672
|
|
484
673
|
ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args),
|
485
|
-
|
674
|
+
flags, rvalue, fn);
|
675
|
+
}
|
676
|
+
|
677
|
+
#ifndef __ILP32__
|
678
|
+
extern void
|
679
|
+
ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
|
680
|
+
#endif
|
681
|
+
|
682
|
+
void
|
683
|
+
ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
684
|
+
{
|
685
|
+
ffi_type **arg_types = cif->arg_types;
|
686
|
+
int i, nargs = cif->nargs;
|
687
|
+
const int max_reg_struct_size = cif->abi == FFI_GNUW64 ? 8 : 16;
|
688
|
+
|
689
|
+
/* If we have any large structure arguments, make a copy so we are passing
|
690
|
+
by value. */
|
691
|
+
for (i = 0; i < nargs; i++)
|
692
|
+
{
|
693
|
+
ffi_type *at = arg_types[i];
|
694
|
+
int size = at->size;
|
695
|
+
if (at->type == FFI_TYPE_STRUCT && size > max_reg_struct_size)
|
696
|
+
{
|
697
|
+
char *argcopy = alloca (size);
|
698
|
+
memcpy (argcopy, avalue[i], size);
|
699
|
+
avalue[i] = argcopy;
|
700
|
+
}
|
701
|
+
}
|
702
|
+
|
703
|
+
#ifndef __ILP32__
|
704
|
+
if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
|
705
|
+
{
|
706
|
+
ffi_call_efi64(cif, fn, rvalue, avalue);
|
707
|
+
return;
|
708
|
+
}
|
709
|
+
#endif
|
710
|
+
ffi_call_int (cif, fn, rvalue, avalue, NULL);
|
711
|
+
}
|
712
|
+
|
713
|
+
#ifdef FFI_GO_CLOSURES
|
714
|
+
|
715
|
+
#ifndef __ILP32__
|
716
|
+
extern void
|
717
|
+
ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue,
|
718
|
+
void **avalue, void *closure);
|
719
|
+
#endif
|
720
|
+
|
721
|
+
void
|
722
|
+
ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
723
|
+
void **avalue, void *closure)
|
724
|
+
{
|
725
|
+
#ifndef __ILP32__
|
726
|
+
if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
|
727
|
+
{
|
728
|
+
ffi_call_go_efi64(cif, fn, rvalue, avalue, closure);
|
729
|
+
return;
|
730
|
+
}
|
731
|
+
#endif
|
732
|
+
ffi_call_int (cif, fn, rvalue, avalue, closure);
|
486
733
|
}
|
487
734
|
|
735
|
+
#endif /* FFI_GO_CLOSURES */
|
488
736
|
|
489
|
-
extern void ffi_closure_unix64(void);
|
737
|
+
extern void ffi_closure_unix64(void) FFI_HIDDEN;
|
738
|
+
extern void ffi_closure_unix64_sse(void) FFI_HIDDEN;
|
739
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
740
|
+
extern void ffi_closure_unix64_alt(void) FFI_HIDDEN;
|
741
|
+
extern void ffi_closure_unix64_sse_alt(void) FFI_HIDDEN;
|
742
|
+
#endif
|
743
|
+
|
744
|
+
#ifndef __ILP32__
|
745
|
+
extern ffi_status
|
746
|
+
ffi_prep_closure_loc_efi64(ffi_closure* closure,
|
747
|
+
ffi_cif* cif,
|
748
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
749
|
+
void *user_data,
|
750
|
+
void *codeloc);
|
751
|
+
#endif
|
490
752
|
|
491
753
|
ffi_status
|
492
754
|
ffi_prep_closure_loc (ffi_closure* closure,
|
@@ -495,21 +757,51 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
495
757
|
void *user_data,
|
496
758
|
void *codeloc)
|
497
759
|
{
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
*(
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
tramp
|
760
|
+
static const unsigned char trampoline[24] = {
|
761
|
+
/* endbr64 */
|
762
|
+
0xf3, 0x0f, 0x1e, 0xfa,
|
763
|
+
/* leaq -0xb(%rip),%r10 # 0x0 */
|
764
|
+
0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff,
|
765
|
+
/* jmpq *0x7(%rip) # 0x18 */
|
766
|
+
0xff, 0x25, 0x07, 0x00, 0x00, 0x00,
|
767
|
+
/* nopl 0(%rax) */
|
768
|
+
0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00
|
769
|
+
};
|
770
|
+
void (*dest)(void);
|
771
|
+
char *tramp = closure->tramp;
|
772
|
+
|
773
|
+
#ifndef __ILP32__
|
774
|
+
if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
|
775
|
+
return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc);
|
776
|
+
#endif
|
777
|
+
if (cif->abi != FFI_UNIX64)
|
778
|
+
return FFI_BAD_ABI;
|
779
|
+
|
780
|
+
if (cif->flags & UNIX64_FLAG_XMM_ARGS)
|
781
|
+
dest = ffi_closure_unix64_sse;
|
782
|
+
else
|
783
|
+
dest = ffi_closure_unix64;
|
784
|
+
|
785
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
786
|
+
if (ffi_tramp_is_present(closure))
|
787
|
+
{
|
788
|
+
/* Initialize the static trampoline's parameters. */
|
789
|
+
if (dest == ffi_closure_unix64_sse)
|
790
|
+
dest = ffi_closure_unix64_sse_alt;
|
791
|
+
else
|
792
|
+
dest = ffi_closure_unix64_alt;
|
793
|
+
ffi_tramp_set_parms (closure->ftramp, dest, closure);
|
794
|
+
goto out;
|
795
|
+
}
|
796
|
+
#endif
|
510
797
|
|
511
|
-
|
798
|
+
/* Initialize the dynamic trampoline. */
|
799
|
+
memcpy (tramp, trampoline, sizeof(trampoline));
|
800
|
+
*(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
|
512
801
|
|
802
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
803
|
+
out:
|
804
|
+
#endif
|
513
805
|
closure->cif = cif;
|
514
806
|
closure->fun = fun;
|
515
807
|
closure->user_data = user_data;
|
@@ -517,53 +809,40 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
517
809
|
return FFI_OK;
|
518
810
|
}
|
519
811
|
|
520
|
-
int
|
521
|
-
ffi_closure_unix64_inner(
|
522
|
-
|
812
|
+
int FFI_HIDDEN
|
813
|
+
ffi_closure_unix64_inner(ffi_cif *cif,
|
814
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
815
|
+
void *user_data,
|
816
|
+
void *rvalue,
|
817
|
+
struct register_args *reg_args,
|
818
|
+
char *argp)
|
523
819
|
{
|
524
|
-
ffi_cif *cif;
|
525
820
|
void **avalue;
|
526
821
|
ffi_type **arg_types;
|
527
822
|
long i, avn;
|
528
823
|
int gprcount, ssecount, ngpr, nsse;
|
529
|
-
int
|
824
|
+
int flags;
|
530
825
|
|
531
|
-
|
532
|
-
|
826
|
+
avn = cif->nargs;
|
827
|
+
flags = cif->flags;
|
828
|
+
avalue = alloca(avn * sizeof(void *));
|
533
829
|
gprcount = ssecount = 0;
|
534
830
|
|
535
|
-
|
536
|
-
if (ret != FFI_TYPE_VOID)
|
831
|
+
if (flags & UNIX64_FLAG_RET_IN_MEM)
|
537
832
|
{
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
rvalue = (void *) reg_args->gpr[gprcount++];
|
545
|
-
/* We don't have to do anything in asm for the return. */
|
546
|
-
ret = FFI_TYPE_VOID;
|
547
|
-
}
|
548
|
-
else if (ret == FFI_TYPE_STRUCT && n == 2)
|
549
|
-
{
|
550
|
-
/* Mark which register the second word of the structure goes in. */
|
551
|
-
_Bool sse0 = SSE_CLASS_P (classes[0]);
|
552
|
-
_Bool sse1 = SSE_CLASS_P (classes[1]);
|
553
|
-
if (!sse0 && sse1)
|
554
|
-
ret |= 1 << 8;
|
555
|
-
else if (sse0 && !sse1)
|
556
|
-
ret |= 1 << 9;
|
557
|
-
}
|
833
|
+
/* On return, %rax will contain the address that was passed
|
834
|
+
by the caller in %rdi. */
|
835
|
+
void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++];
|
836
|
+
*(void **)rvalue = r;
|
837
|
+
rvalue = r;
|
838
|
+
flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64);
|
558
839
|
}
|
559
840
|
|
560
|
-
avn = cif->nargs;
|
561
841
|
arg_types = cif->arg_types;
|
562
|
-
|
563
842
|
for (i = 0; i < avn; ++i)
|
564
843
|
{
|
565
844
|
enum x86_64_reg_class classes[MAX_CLASSES];
|
566
|
-
|
845
|
+
size_t n;
|
567
846
|
|
568
847
|
n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
|
569
848
|
if (n == 0
|
@@ -577,7 +856,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
|
|
577
856
|
align = 8;
|
578
857
|
|
579
858
|
/* Pass this argument in memory. */
|
580
|
-
argp = (void *)
|
859
|
+
argp = (void *) FFI_ALIGN (argp, align);
|
581
860
|
avalue[i] = argp;
|
582
861
|
argp += arg_types[i]->size;
|
583
862
|
}
|
@@ -603,7 +882,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
|
|
603
882
|
else
|
604
883
|
{
|
605
884
|
char *a = alloca (16);
|
606
|
-
int j;
|
885
|
+
unsigned int j;
|
607
886
|
|
608
887
|
avalue[i] = a;
|
609
888
|
for (j = 0; j < n; j++, a += 8)
|
@@ -617,10 +896,55 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
|
|
617
896
|
}
|
618
897
|
|
619
898
|
/* Invoke the closure. */
|
620
|
-
|
899
|
+
fun (cif, rvalue, avalue, user_data);
|
621
900
|
|
622
901
|
/* Tell assembly how to perform return type promotions. */
|
623
|
-
return
|
902
|
+
return flags;
|
903
|
+
}
|
904
|
+
|
905
|
+
#ifdef FFI_GO_CLOSURES
|
906
|
+
|
907
|
+
extern void ffi_go_closure_unix64(void) FFI_HIDDEN;
|
908
|
+
extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN;
|
909
|
+
|
910
|
+
#ifndef __ILP32__
|
911
|
+
extern ffi_status
|
912
|
+
ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif,
|
913
|
+
void (*fun)(ffi_cif*, void*, void**, void*));
|
914
|
+
#endif
|
915
|
+
|
916
|
+
ffi_status
|
917
|
+
ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
|
918
|
+
void (*fun)(ffi_cif*, void*, void**, void*))
|
919
|
+
{
|
920
|
+
#ifndef __ILP32__
|
921
|
+
if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
|
922
|
+
return ffi_prep_go_closure_efi64(closure, cif, fun);
|
923
|
+
#endif
|
924
|
+
if (cif->abi != FFI_UNIX64)
|
925
|
+
return FFI_BAD_ABI;
|
926
|
+
|
927
|
+
closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS
|
928
|
+
? ffi_go_closure_unix64_sse
|
929
|
+
: ffi_go_closure_unix64);
|
930
|
+
closure->cif = cif;
|
931
|
+
closure->fun = fun;
|
932
|
+
|
933
|
+
return FFI_OK;
|
934
|
+
}
|
935
|
+
|
936
|
+
#endif /* FFI_GO_CLOSURES */
|
937
|
+
|
938
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
939
|
+
void *
|
940
|
+
ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
|
941
|
+
{
|
942
|
+
extern void *trampoline_code_table;
|
943
|
+
|
944
|
+
*map_size = UNIX64_TRAMP_MAP_SIZE;
|
945
|
+
*tramp_size = UNIX64_TRAMP_SIZE;
|
946
|
+
return &trampoline_code_table;
|
624
947
|
}
|
948
|
+
#endif
|
625
949
|
|
626
950
|
#endif /* __x86_64__ */
|