ffi 1.15.5 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +118 -0
- data/Gemfile +10 -3
- data/README.md +4 -3
- data/Rakefile +25 -10
- data/ext/ffi_c/AbstractMemory.c +99 -74
- data/ext/ffi_c/AbstractMemory.h +3 -2
- data/ext/ffi_c/ArrayType.c +51 -15
- data/ext/ffi_c/ArrayType.h +1 -0
- data/ext/ffi_c/Buffer.c +90 -33
- data/ext/ffi_c/Call.c +29 -12
- data/ext/ffi_c/Call.h +3 -2
- data/ext/ffi_c/DynamicLibrary.c +90 -27
- data/ext/ffi_c/Function.c +244 -98
- data/ext/ffi_c/Function.h +1 -0
- data/ext/ffi_c/FunctionInfo.c +81 -25
- data/ext/ffi_c/LastError.c +29 -11
- data/ext/ffi_c/MappedType.c +66 -23
- data/ext/ffi_c/MappedType.h +0 -2
- data/ext/ffi_c/MemoryPointer.c +36 -9
- data/ext/ffi_c/MethodHandle.c +3 -1
- data/ext/ffi_c/Pointer.c +82 -40
- data/ext/ffi_c/Pointer.h +1 -0
- data/ext/ffi_c/Struct.c +166 -84
- data/ext/ffi_c/Struct.h +7 -4
- data/ext/ffi_c/StructByValue.c +48 -16
- data/ext/ffi_c/StructLayout.c +130 -61
- data/ext/ffi_c/Type.c +120 -51
- data/ext/ffi_c/Type.h +3 -1
- data/ext/ffi_c/Types.c +8 -2
- data/ext/ffi_c/Types.h +0 -1
- data/ext/ffi_c/Variadic.c +71 -26
- data/ext/ffi_c/compat.h +22 -22
- data/ext/ffi_c/extconf.rb +19 -2
- data/ext/ffi_c/ffi.c +4 -0
- data/ext/ffi_c/libffi/.allow-ai-service +0 -0
- data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
- data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
- data/ext/ffi_c/libffi/.appveyor.yml +27 -9
- data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
- data/ext/ffi_c/libffi/.ci/build.sh +124 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
- data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
- data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
- data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
- data/ext/ffi_c/libffi/.gitignore +10 -2
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +12 -5
- data/ext/ffi_c/libffi/Makefile.in +118 -51
- data/ext/ffi_c/libffi/README.md +150 -105
- data/ext/ffi_c/libffi/acinclude.m4 +10 -112
- data/ext/ffi_c/libffi/compile +348 -0
- data/ext/ffi_c/libffi/config.guess +623 -556
- data/ext/ffi_c/libffi/config.sub +75 -34
- data/ext/ffi_c/libffi/configure +4571 -3830
- data/ext/ffi_c/libffi/configure.ac +64 -28
- data/ext/ffi_c/libffi/configure.host +26 -7
- data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
- data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
- data/ext/ffi_c/libffi/include/Makefile.am +1 -1
- data/ext/ffi_c/libffi/include/Makefile.in +10 -9
- data/ext/ffi_c/libffi/include/ffi.h.in +55 -60
- data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +33 -2
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +92 -69
- data/ext/ffi_c/libffi/libffi.map.in +5 -0
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +518 -333
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
- data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
- data/ext/ffi_c/libffi/man/Makefile.in +9 -6
- data/ext/ffi_c/libffi/missing +1 -1
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +2 -2
- data/ext/ffi_c/libffi/msvcc.sh +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +172 -55
- data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +331 -87
- data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
- data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
- data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
- data/ext/ffi_c/libffi/src/closures.c +136 -50
- data/ext/ffi_c/libffi/src/debug.c +2 -2
- data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
- data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
- data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
- data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
- data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
- data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
- data/ext/ffi_c/libffi/src/mips/ffi.c +250 -67
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +193 -33
- data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
- data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
- data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
- data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
- data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
- data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
- data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
- data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +23 -1
- data/ext/ffi_c/libffi/src/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/types.c +4 -6
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
- data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
- data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +44 -1
- data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
- data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
- data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
- data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -114
- data/ext/ffi_c/libffi/testsuite/Makefile.in +89 -121
- data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
- data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
- data/ext/ffi_c/libffi.bsd.mk +2 -2
- data/ext/ffi_c/libffi.darwin.mk +2 -2
- data/ext/ffi_c/libffi.gnu.mk +2 -2
- data/ext/ffi_c/rbffi.h +1 -1
- data/ffi.gemspec +3 -3
- data/lib/ffi/autopointer.rb +8 -31
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +2 -2
- data/lib/ffi/dynamic_library.rb +118 -0
- data/lib/ffi/enum.rb +18 -12
- data/lib/ffi/ffi.rb +3 -0
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/io.rb +2 -2
- data/lib/ffi/library.rb +72 -88
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +1 -1
- data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
- data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
- data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
- data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
- data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
- data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
- data/lib/ffi/platform.rb +15 -13
- data/lib/ffi/pointer.rb +6 -6
- data/lib/ffi/struct.rb +6 -5
- data/lib/ffi/struct_layout.rb +3 -3
- data/lib/ffi/struct_layout_builder.rb +9 -9
- data/lib/ffi/types.rb +65 -37
- data/lib/ffi/variadic.rb +19 -8
- data/lib/ffi/version.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data/sig/ffi/abstract_memory.rbs +165 -0
- data/sig/ffi/auto_pointer.rbs +27 -0
- data/sig/ffi/buffer.rbs +18 -0
- data/sig/ffi/data_converter.rbs +10 -0
- data/sig/ffi/dynamic_library.rbs +9 -0
- data/sig/ffi/enum.rbs +38 -0
- data/sig/ffi/function.rbs +39 -0
- data/sig/ffi/library.rbs +42 -0
- data/sig/ffi/native_type.rbs +86 -0
- data/sig/ffi/pointer.rbs +42 -0
- data/sig/ffi/struct.rbs +76 -0
- data/sig/ffi/struct_by_reference.rbs +11 -0
- data/sig/ffi/struct_by_value.rbs +7 -0
- data/sig/ffi/struct_layout.rbs +9 -0
- data/sig/ffi/struct_layout_builder.rbs +5 -0
- data/sig/ffi/type.rbs +39 -0
- data/sig/ffi.rbs +26 -0
- data.tar.gz.sig +0 -0
- metadata +122 -28
- metadata.gz.sig +1 -0
- data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
- data/ext/ffi_c/libffi/.travis/build.sh +0 -142
- data/ext/ffi_c/libffi/.travis.yml +0 -83
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
- /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
- /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
- /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
/* -----------------------------------------------------------------*-C-*-
|
2
|
+
ffitarget.h - Copyright (c) 2018-2023 Hood Chatham, Brion Vibber, Kleis Auke Wolthuizen, and others.
|
3
|
+
|
4
|
+
Target configuration macros for wasm32.
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
``Software''), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be included
|
15
|
+
in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
21
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
22
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
24
|
+
DEALINGS IN THE SOFTWARE.
|
25
|
+
|
26
|
+
----------------------------------------------------------------------- */
|
27
|
+
|
28
|
+
#ifndef LIBFFI_TARGET_H
|
29
|
+
#define LIBFFI_TARGET_H
|
30
|
+
|
31
|
+
#ifndef LIBFFI_H
|
32
|
+
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
33
|
+
#endif
|
34
|
+
|
35
|
+
/* ---- Generic type definitions ----------------------------------------- */
|
36
|
+
|
37
|
+
typedef unsigned long ffi_arg;
|
38
|
+
typedef signed long ffi_sarg;
|
39
|
+
|
40
|
+
// TODO: https://github.com/emscripten-core/emscripten/issues/9868
|
41
|
+
typedef void (*ffi_fp)(void);
|
42
|
+
|
43
|
+
typedef enum ffi_abi {
|
44
|
+
FFI_FIRST_ABI = 0,
|
45
|
+
FFI_WASM32, // "raw", no structures, varargs, or closures (not implemented!)
|
46
|
+
FFI_WASM32_EMSCRIPTEN, // structures, varargs, and split 64-bit params
|
47
|
+
FFI_LAST_ABI,
|
48
|
+
#ifdef __EMSCRIPTEN__
|
49
|
+
FFI_DEFAULT_ABI = FFI_WASM32_EMSCRIPTEN
|
50
|
+
#else
|
51
|
+
FFI_DEFAULT_ABI = FFI_WASM32
|
52
|
+
#endif
|
53
|
+
} ffi_abi;
|
54
|
+
|
55
|
+
#define FFI_CLOSURES 1
|
56
|
+
// #define FFI_GO_CLOSURES 0
|
57
|
+
#define FFI_TRAMPOLINE_SIZE 4
|
58
|
+
// #define FFI_NATIVE_RAW_API 0
|
59
|
+
#define FFI_TARGET_SPECIFIC_VARIADIC 1
|
60
|
+
#define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs
|
61
|
+
|
62
|
+
#endif
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
ffi.c - Copyright (c) 2017 Anthony Green
|
2
|
+
ffi.c - Copyright (c) 2017, 2022 Anthony Green
|
3
3
|
Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc.
|
4
4
|
Copyright (c) 2002 Ranjit Mathew
|
5
5
|
Copyright (c) 2002 Bo Thorsen
|
@@ -34,6 +34,7 @@
|
|
34
34
|
#include <ffi_common.h>
|
35
35
|
#include <stdint.h>
|
36
36
|
#include <stdlib.h>
|
37
|
+
#include <tramp.h>
|
37
38
|
#include "internal.h"
|
38
39
|
|
39
40
|
/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
|
@@ -116,35 +117,37 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
|
116
117
|
flags = X86_RET_INT64;
|
117
118
|
break;
|
118
119
|
case FFI_TYPE_STRUCT:
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
120
|
+
{
|
121
|
+
#ifdef X86_WIN32
|
122
|
+
size_t size = cif->rtype->size;
|
123
|
+
if (size == 1)
|
124
|
+
flags = X86_RET_STRUCT_1B;
|
125
|
+
else if (size == 2)
|
126
|
+
flags = X86_RET_STRUCT_2B;
|
127
|
+
else if (size == 4)
|
128
|
+
flags = X86_RET_INT32;
|
129
|
+
else if (size == 8)
|
130
|
+
flags = X86_RET_INT64;
|
131
|
+
else
|
130
132
|
#endif
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
133
|
+
{
|
134
|
+
do_struct:
|
135
|
+
switch (cabi)
|
136
|
+
{
|
137
|
+
case FFI_THISCALL:
|
138
|
+
case FFI_FASTCALL:
|
139
|
+
case FFI_STDCALL:
|
140
|
+
case FFI_MS_CDECL:
|
141
|
+
flags = X86_RET_STRUCTARG;
|
142
|
+
break;
|
143
|
+
default:
|
144
|
+
flags = X86_RET_STRUCTPOP;
|
145
|
+
break;
|
146
|
+
}
|
147
|
+
/* Allocate space for return value pointer. */
|
148
|
+
bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
|
149
|
+
}
|
150
|
+
}
|
148
151
|
break;
|
149
152
|
case FFI_TYPE_COMPLEX:
|
150
153
|
switch (cif->rtype->elements[0]->type)
|
@@ -181,7 +184,12 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
|
181
184
|
{
|
182
185
|
ffi_type *t = cif->arg_types[i];
|
183
186
|
|
184
|
-
|
187
|
+
#if defined(X86_WIN32)
|
188
|
+
if (cabi == FFI_STDCALL)
|
189
|
+
bytes = FFI_ALIGN (bytes, FFI_SIZEOF_ARG);
|
190
|
+
else
|
191
|
+
#endif
|
192
|
+
bytes = FFI_ALIGN (bytes, t->alignment);
|
185
193
|
bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG);
|
186
194
|
}
|
187
195
|
cif->bytes = bytes;
|
@@ -255,6 +263,13 @@ static const struct abi_params abi_params[FFI_LAST_ABI] = {
|
|
255
263
|
|
256
264
|
extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN;
|
257
265
|
|
266
|
+
/* We perform some black magic here to use some of the parent's stack frame in
|
267
|
+
* ffi_call_i386() that breaks with the MSVC compiler with the /RTCs or /GZ
|
268
|
+
* flags. Disable the 'Stack frame run time error checking' for this function
|
269
|
+
* so we don't hit weird exceptions in debug builds. */
|
270
|
+
#if defined(_MSC_VER)
|
271
|
+
#pragma runtime_checks("s", off)
|
272
|
+
#endif
|
258
273
|
static void
|
259
274
|
ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
260
275
|
void **avalue, void *closure)
|
@@ -370,7 +385,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
370
385
|
cases. */
|
371
386
|
if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
|
372
387
|
align = 16;
|
373
|
-
|
388
|
+
|
374
389
|
if (dir < 0)
|
375
390
|
{
|
376
391
|
/* ??? These reverse argument ABIs are probably too old
|
@@ -390,6 +405,9 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
390
405
|
|
391
406
|
ffi_call_i386 (frame, stack);
|
392
407
|
}
|
408
|
+
#if defined(_MSC_VER)
|
409
|
+
#pragma runtime_checks("s", restore)
|
410
|
+
#endif
|
393
411
|
|
394
412
|
void
|
395
413
|
ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
@@ -411,6 +429,11 @@ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
411
429
|
void FFI_HIDDEN ffi_closure_i386(void);
|
412
430
|
void FFI_HIDDEN ffi_closure_STDCALL(void);
|
413
431
|
void FFI_HIDDEN ffi_closure_REGISTER(void);
|
432
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
433
|
+
void FFI_HIDDEN ffi_closure_i386_alt(void);
|
434
|
+
void FFI_HIDDEN ffi_closure_STDCALL_alt(void);
|
435
|
+
void FFI_HIDDEN ffi_closure_REGISTER_alt(void);
|
436
|
+
#endif
|
414
437
|
|
415
438
|
struct closure_frame
|
416
439
|
{
|
@@ -522,10 +545,17 @@ ffi_closure_inner (struct closure_frame *frame, char *stack)
|
|
522
545
|
|
523
546
|
frame->fun (cif, rvalue, avalue, frame->user_data);
|
524
547
|
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
548
|
+
switch (cabi)
|
549
|
+
{
|
550
|
+
case FFI_STDCALL:
|
551
|
+
return flags | (cif->bytes << X86_RET_POP_SHIFT);
|
552
|
+
case FFI_THISCALL:
|
553
|
+
case FFI_FASTCALL:
|
554
|
+
return flags | ((cif->bytes - (narg_reg * FFI_SIZEOF_ARG))
|
555
|
+
<< X86_RET_POP_SHIFT);
|
556
|
+
default:
|
557
|
+
return flags;
|
558
|
+
}
|
529
559
|
}
|
530
560
|
|
531
561
|
ffi_status
|
@@ -542,12 +572,12 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
542
572
|
switch (cif->abi)
|
543
573
|
{
|
544
574
|
case FFI_SYSV:
|
545
|
-
case FFI_THISCALL:
|
546
|
-
case FFI_FASTCALL:
|
547
575
|
case FFI_MS_CDECL:
|
548
576
|
dest = ffi_closure_i386;
|
549
577
|
break;
|
550
578
|
case FFI_STDCALL:
|
579
|
+
case FFI_THISCALL:
|
580
|
+
case FFI_FASTCALL:
|
551
581
|
case FFI_PASCAL:
|
552
582
|
dest = ffi_closure_STDCALL;
|
553
583
|
break;
|
@@ -559,6 +589,22 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
559
589
|
return FFI_BAD_ABI;
|
560
590
|
}
|
561
591
|
|
592
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
593
|
+
if (ffi_tramp_is_present(closure))
|
594
|
+
{
|
595
|
+
/* Initialize the static trampoline's parameters. */
|
596
|
+
if (dest == ffi_closure_i386)
|
597
|
+
dest = ffi_closure_i386_alt;
|
598
|
+
else if (dest == ffi_closure_STDCALL)
|
599
|
+
dest = ffi_closure_STDCALL_alt;
|
600
|
+
else
|
601
|
+
dest = ffi_closure_REGISTER_alt;
|
602
|
+
ffi_tramp_set_parms (closure->ftramp, dest, closure);
|
603
|
+
goto out;
|
604
|
+
}
|
605
|
+
#endif
|
606
|
+
|
607
|
+
/* Initialize the dynamic trampoline. */
|
562
608
|
/* endbr32. */
|
563
609
|
*(UINT32 *) tramp = 0xfb1e0ff3;
|
564
610
|
|
@@ -570,6 +616,9 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
570
616
|
tramp[9] = 0xe9;
|
571
617
|
*(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14);
|
572
618
|
|
619
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
620
|
+
out:
|
621
|
+
#endif
|
573
622
|
closure->cif = cif;
|
574
623
|
closure->fun = fun;
|
575
624
|
closure->user_data = user_data;
|
@@ -767,4 +816,17 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue)
|
|
767
816
|
ffi_call_i386 (frame, stack);
|
768
817
|
}
|
769
818
|
#endif /* !FFI_NO_RAW_API */
|
819
|
+
|
820
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
821
|
+
void *
|
822
|
+
ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
|
823
|
+
{
|
824
|
+
extern void *trampoline_code_table;
|
825
|
+
|
826
|
+
*map_size = X86_TRAMP_MAP_SIZE;
|
827
|
+
*tramp_size = X86_TRAMP_SIZE;
|
828
|
+
return &trampoline_code_table;
|
829
|
+
}
|
830
|
+
#endif
|
831
|
+
|
770
832
|
#endif /* __i386__ */
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
ffi64.c - Copyright (c) 2011, 2018 Anthony Green
|
2
|
+
ffi64.c - Copyright (c) 2011, 2018, 2022 Anthony Green
|
3
3
|
Copyright (c) 2013 The Written Word, Inc.
|
4
4
|
Copyright (c) 2008, 2010 Red Hat, Inc.
|
5
5
|
Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
|
@@ -33,6 +33,7 @@
|
|
33
33
|
#include <stdlib.h>
|
34
34
|
#include <stdarg.h>
|
35
35
|
#include <stdint.h>
|
36
|
+
#include <tramp.h>
|
36
37
|
#include "internal64.h"
|
37
38
|
|
38
39
|
#ifdef __x86_64__
|
@@ -217,7 +218,8 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
217
218
|
case FFI_TYPE_STRUCT:
|
218
219
|
{
|
219
220
|
const size_t UNITS_PER_WORD = 8;
|
220
|
-
|
221
|
+
size_t words = (type->size + byte_offset + UNITS_PER_WORD - 1)
|
222
|
+
/ UNITS_PER_WORD;
|
221
223
|
ffi_type **ptr;
|
222
224
|
unsigned int i;
|
223
225
|
enum x86_64_reg_class subclasses[MAX_CLASSES];
|
@@ -241,14 +243,15 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
|
241
243
|
/* Merge the fields of structure. */
|
242
244
|
for (ptr = type->elements; *ptr != NULL; ptr++)
|
243
245
|
{
|
244
|
-
size_t num;
|
246
|
+
size_t num, pos;
|
245
247
|
|
246
248
|
byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment);
|
247
249
|
|
248
250
|
num = classify_argument (*ptr, subclasses, byte_offset % 8);
|
249
251
|
if (num == 0)
|
250
252
|
return 0;
|
251
|
-
|
253
|
+
pos = byte_offset / 8;
|
254
|
+
for (i = 0; i < num && (i + pos) < words; i++)
|
252
255
|
{
|
253
256
|
size_t pos = byte_offset / 8;
|
254
257
|
classes[i + pos] =
|
@@ -578,6 +581,9 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
578
581
|
flags = UNIX64_RET_VOID;
|
579
582
|
}
|
580
583
|
|
584
|
+
arg_types = cif->arg_types;
|
585
|
+
avn = cif->nargs;
|
586
|
+
|
581
587
|
/* Allocate the space for the arguments, plus 4 words of temp space. */
|
582
588
|
stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
|
583
589
|
reg_args = (struct register_args *) stack;
|
@@ -592,9 +598,6 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
592
598
|
if (flags & UNIX64_FLAG_RET_IN_MEM)
|
593
599
|
reg_args->gpr[gprcount++] = (unsigned long) rvalue;
|
594
600
|
|
595
|
-
avn = cif->nargs;
|
596
|
-
arg_types = cif->arg_types;
|
597
|
-
|
598
601
|
for (i = 0; i < avn; ++i)
|
599
602
|
{
|
600
603
|
size_t n, size = arg_types[i]->size;
|
@@ -610,11 +613,12 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
610
613
|
if (align < 8)
|
611
614
|
align = 8;
|
612
615
|
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
616
|
+
/* Pass this argument in memory. */
|
617
|
+
argp = (void *) FFI_ALIGN (argp, align);
|
618
|
+
memcpy (argp, avalue[i], size);
|
619
|
+
|
620
|
+
argp += size;
|
621
|
+
}
|
618
622
|
else
|
619
623
|
{
|
620
624
|
/* The argument is passed entirely in registers. */
|
@@ -678,6 +682,24 @@ ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
|
|
678
682
|
void
|
679
683
|
ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
680
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
|
+
|
681
703
|
#ifndef __ILP32__
|
682
704
|
if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
|
683
705
|
{
|
@@ -714,6 +736,10 @@ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
714
736
|
|
715
737
|
extern void ffi_closure_unix64(void) FFI_HIDDEN;
|
716
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
|
717
743
|
|
718
744
|
#ifndef __ILP32__
|
719
745
|
extern ffi_status
|
@@ -756,9 +782,26 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
756
782
|
else
|
757
783
|
dest = ffi_closure_unix64;
|
758
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
|
797
|
+
|
798
|
+
/* Initialize the dynamic trampoline. */
|
759
799
|
memcpy (tramp, trampoline, sizeof(trampoline));
|
760
800
|
*(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
|
761
801
|
|
802
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
803
|
+
out:
|
804
|
+
#endif
|
762
805
|
closure->cif = cif;
|
763
806
|
closure->fun = fun;
|
764
807
|
closure->user_data = user_data;
|
@@ -892,4 +935,16 @@ ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
|
|
892
935
|
|
893
936
|
#endif /* FFI_GO_CLOSURES */
|
894
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;
|
947
|
+
}
|
948
|
+
#endif
|
949
|
+
|
895
950
|
#endif /* __x86_64__ */
|
@@ -41,6 +41,9 @@
|
|
41
41
|
|
42
42
|
#if defined (X86_64) && defined (__i386__)
|
43
43
|
#undef X86_64
|
44
|
+
#warning ******************************************************
|
45
|
+
#warning ********** X86 IS DEFINED ****************************
|
46
|
+
#warning ******************************************************
|
44
47
|
#define X86
|
45
48
|
#endif
|
46
49
|
|
@@ -85,9 +88,9 @@ typedef enum ffi_abi {
|
|
85
88
|
FFI_LAST_ABI,
|
86
89
|
#ifdef __GNUC__
|
87
90
|
FFI_DEFAULT_ABI = FFI_GNUW64
|
88
|
-
#else
|
91
|
+
#else
|
89
92
|
FFI_DEFAULT_ABI = FFI_WIN64
|
90
|
-
#endif
|
93
|
+
#endif
|
91
94
|
|
92
95
|
#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
|
93
96
|
FFI_FIRST_ABI = 1,
|
@@ -147,9 +150,11 @@ typedef enum ffi_abi {
|
|
147
150
|
# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */
|
148
151
|
#endif
|
149
152
|
|
150
|
-
#if !defined(GENERATE_LIBFFI_MAP) && defined(
|
151
|
-
&& defined(__CET__)
|
153
|
+
#if !defined(GENERATE_LIBFFI_MAP) && defined(__CET__)
|
152
154
|
# include <cet.h>
|
155
|
+
# if (__CET__ & 1) != 0
|
156
|
+
# define ENDBR_PRESENT
|
157
|
+
# endif
|
153
158
|
# define _CET_NOTRACK notrack
|
154
159
|
#else
|
155
160
|
# define _CET_ENDBR
|
@@ -157,4 +162,3 @@ typedef enum ffi_abi {
|
|
157
162
|
#endif
|
158
163
|
|
159
164
|
#endif
|
160
|
-
|
@@ -30,6 +30,7 @@
|
|
30
30
|
#include <ffi_common.h>
|
31
31
|
#include <stdlib.h>
|
32
32
|
#include <stdint.h>
|
33
|
+
#include <tramp.h>
|
33
34
|
|
34
35
|
#ifdef X86_WIN64
|
35
36
|
#define EFI64(name) name
|
@@ -107,6 +108,13 @@ EFI64(ffi_prep_cif_machdep)(ffi_cif *cif)
|
|
107
108
|
return FFI_OK;
|
108
109
|
}
|
109
110
|
|
111
|
+
/* We perform some black magic here to use some of the parent's stack frame in
|
112
|
+
* ffi_call_win64() that breaks with the MSVC compiler with the /RTCs or /GZ
|
113
|
+
* flags. Disable the 'Stack frame run time error checking' for this function
|
114
|
+
* so we don't hit weird exceptions in debug builds. */
|
115
|
+
#if defined(_MSC_VER)
|
116
|
+
#pragma runtime_checks("s", off)
|
117
|
+
#endif
|
110
118
|
static void
|
111
119
|
ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
112
120
|
void **avalue, void *closure)
|
@@ -115,9 +123,25 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
115
123
|
UINT64 *stack;
|
116
124
|
size_t rsize;
|
117
125
|
struct win64_call_frame *frame;
|
126
|
+
ffi_type **arg_types = cif->arg_types;
|
127
|
+
int nargs = cif->nargs;
|
118
128
|
|
119
129
|
FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64);
|
120
130
|
|
131
|
+
/* If we have any large structure arguments, make a copy so we are passing
|
132
|
+
by value. */
|
133
|
+
for (i = 0; i < nargs; i++)
|
134
|
+
{
|
135
|
+
ffi_type *at = arg_types[i];
|
136
|
+
int size = at->size;
|
137
|
+
if (at->type == FFI_TYPE_STRUCT && size > 8)
|
138
|
+
{
|
139
|
+
char *argcopy = alloca (size);
|
140
|
+
memcpy (argcopy, avalue[i], size);
|
141
|
+
avalue[i] = argcopy;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
121
145
|
flags = cif->flags;
|
122
146
|
rsize = 0;
|
123
147
|
|
@@ -171,6 +195,9 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
171
195
|
|
172
196
|
ffi_call_win64 (stack, frame, closure);
|
173
197
|
}
|
198
|
+
#if defined(_MSC_VER)
|
199
|
+
#pragma runtime_checks("s", restore)
|
200
|
+
#endif
|
174
201
|
|
175
202
|
void
|
176
203
|
EFI64(ffi_call)(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
@@ -187,6 +214,9 @@ EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
187
214
|
|
188
215
|
|
189
216
|
extern void ffi_closure_win64(void) FFI_HIDDEN;
|
217
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
218
|
+
extern void ffi_closure_win64_alt(void) FFI_HIDDEN;
|
219
|
+
#endif
|
190
220
|
|
191
221
|
#ifdef FFI_GO_CLOSURES
|
192
222
|
extern void ffi_go_closure_win64(void) FFI_HIDDEN;
|
@@ -197,7 +227,7 @@ EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
|
|
197
227
|
ffi_cif* cif,
|
198
228
|
void (*fun)(ffi_cif*, void*, void**, void*),
|
199
229
|
void *user_data,
|
200
|
-
void *codeloc)
|
230
|
+
void *codeloc MAYBE_UNUSED)
|
201
231
|
{
|
202
232
|
static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = {
|
203
233
|
/* endbr64 */
|
@@ -220,9 +250,22 @@ EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
|
|
220
250
|
return FFI_BAD_ABI;
|
221
251
|
}
|
222
252
|
|
253
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
254
|
+
if (ffi_tramp_is_present(closure))
|
255
|
+
{
|
256
|
+
/* Initialize the static trampoline's parameters. */
|
257
|
+
ffi_tramp_set_parms (closure->ftramp, ffi_closure_win64_alt, closure);
|
258
|
+
goto out;
|
259
|
+
}
|
260
|
+
#endif
|
261
|
+
|
262
|
+
/* Initialize the dynamic trampoline. */
|
223
263
|
memcpy (tramp, trampoline, sizeof(trampoline));
|
224
264
|
*(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64;
|
225
265
|
|
266
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
267
|
+
out:
|
268
|
+
#endif
|
226
269
|
closure->cif = cif;
|
227
270
|
closure->fun = fun;
|
228
271
|
closure->user_data = user_data;
|
@@ -27,3 +27,17 @@
|
|
27
27
|
#else
|
28
28
|
# define HAVE_FASTCALL 1
|
29
29
|
#endif
|
30
|
+
|
31
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
32
|
+
/*
|
33
|
+
* For the trampoline code table mapping, a mapping size of 4K (base page size)
|
34
|
+
* is chosen.
|
35
|
+
*/
|
36
|
+
#define X86_TRAMP_MAP_SHIFT 12
|
37
|
+
#define X86_TRAMP_MAP_SIZE (1 << X86_TRAMP_MAP_SHIFT)
|
38
|
+
#ifdef ENDBR_PRESENT
|
39
|
+
#define X86_TRAMP_SIZE 44
|
40
|
+
#else
|
41
|
+
#define X86_TRAMP_SIZE 40
|
42
|
+
#endif
|
43
|
+
#endif
|
@@ -20,3 +20,17 @@
|
|
20
20
|
#define UNIX64_FLAG_RET_IN_MEM (1 << 10)
|
21
21
|
#define UNIX64_FLAG_XMM_ARGS (1 << 11)
|
22
22
|
#define UNIX64_SIZE_SHIFT 12
|
23
|
+
|
24
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
25
|
+
/*
|
26
|
+
* For the trampoline code table mapping, a mapping size of 4K (base page size)
|
27
|
+
* is chosen.
|
28
|
+
*/
|
29
|
+
#define UNIX64_TRAMP_MAP_SHIFT 12
|
30
|
+
#define UNIX64_TRAMP_MAP_SIZE (1 << UNIX64_TRAMP_MAP_SHIFT)
|
31
|
+
#ifdef ENDBR_PRESENT
|
32
|
+
#define UNIX64_TRAMP_SIZE 40
|
33
|
+
#else
|
34
|
+
#define UNIX64_TRAMP_SIZE 32
|
35
|
+
#endif
|
36
|
+
#endif
|