ffi 1.15.4 → 1.16.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +90 -0
- data/Gemfile +1 -1
- data/README.md +3 -2
- data/Rakefile +28 -11
- data/ext/ffi_c/AbstractMemory.c +60 -36
- data/ext/ffi_c/AbstractMemory.h +3 -2
- data/ext/ffi_c/ArrayType.c +49 -13
- data/ext/ffi_c/ArrayType.h +1 -0
- data/ext/ffi_c/Buffer.c +86 -29
- data/ext/ffi_c/Call.c +18 -7
- data/ext/ffi_c/DynamicLibrary.c +89 -26
- data/ext/ffi_c/Function.c +244 -98
- data/ext/ffi_c/Function.h +1 -0
- data/ext/ffi_c/FunctionInfo.c +80 -24
- data/ext/ffi_c/LastError.c +25 -7
- data/ext/ffi_c/MappedType.c +66 -23
- data/ext/ffi_c/MappedType.h +0 -2
- data/ext/ffi_c/MemoryPointer.c +34 -7
- data/ext/ffi_c/MethodHandle.c +3 -1
- data/ext/ffi_c/Pointer.c +68 -29
- data/ext/ffi_c/Pointer.h +1 -0
- data/ext/ffi_c/Struct.c +155 -80
- data/ext/ffi_c/Struct.h +7 -4
- data/ext/ffi_c/StructByValue.c +48 -16
- data/ext/ffi_c/StructLayout.c +117 -48
- data/ext/ffi_c/Type.c +104 -36
- data/ext/ffi_c/Type.h +3 -1
- data/ext/ffi_c/Types.c +1 -1
- data/ext/ffi_c/Variadic.c +65 -23
- 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/.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 +460 -0
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -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 +92 -34
- data/ext/ffi_c/libffi/README.md +144 -104
- 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 +4567 -3822
- data/ext/ffi_c/libffi/configure.ac +64 -28
- data/ext/ffi_c/libffi/configure.host +25 -6
- 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 +54 -50
- data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +29 -0
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +512 -315
- 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 +1 -1
- data/ext/ffi_c/libffi/msvcc.sh +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +146 -42
- data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +134 -42
- 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 +133 -47
- data/ext/ffi_c/libffi/src/dlmalloc.c +5 -0
- 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 +621 -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 +240 -65
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
- 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_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 +16 -0
- data/ext/ffi_c/libffi/src/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -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 +43 -0
- 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 +127 -114
- data/ext/ffi_c/libffi/testsuite/Makefile.in +136 -120
- 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 +80 -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/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.gnu.mk +2 -2
- data/ext/ffi_c/rbffi.h +1 -1
- data/ffi.gemspec +3 -3
- data/lib/ffi/autopointer.rb +7 -22
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +2 -2
- data/lib/ffi/dynamic_library.rb +89 -0
- data/lib/ffi/enum.rb +18 -11
- data/lib/ffi/ffi.rb +3 -0
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/library.rb +55 -71
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +1 -1
- 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/struct.rb +2 -1
- data/lib/ffi/struct_layout.rb +1 -1
- data/lib/ffi/struct_layout_builder.rb +1 -1
- data/lib/ffi/tools/const_generator.rb +5 -4
- data/lib/ffi/types.rb +32 -6
- data/lib/ffi/variadic.rb +19 -8
- data/lib/ffi/version.rb +1 -1
- data/rakelib/ffi_gem_helper.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data.tar.gz.sig +0 -0
- metadata +103 -28
- metadata.gz.sig +0 -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
@@ -31,6 +31,34 @@
|
|
31
31
|
|
32
32
|
#include <sys/cachectl.h>
|
33
33
|
|
34
|
+
#define NARGREG 8
|
35
|
+
#define STKALIGN 4
|
36
|
+
#define MAXCOPYARG (2 * sizeof(double))
|
37
|
+
|
38
|
+
typedef struct call_context
|
39
|
+
{
|
40
|
+
size_t r[8];
|
41
|
+
/* used by the assembly code to in-place construct its own stack frame */
|
42
|
+
char frame[16];
|
43
|
+
} call_context;
|
44
|
+
|
45
|
+
typedef struct call_builder
|
46
|
+
{
|
47
|
+
call_context *aregs;
|
48
|
+
int used_integer;
|
49
|
+
//int used_float;
|
50
|
+
size_t *used_stack;
|
51
|
+
void *struct_stack;
|
52
|
+
} call_builder;
|
53
|
+
|
54
|
+
/* integer (not pointer) less than ABI XLEN */
|
55
|
+
/* FFI_TYPE_INT does not appear to be used */
|
56
|
+
#if defined(__ARC64_ARCH64__)
|
57
|
+
#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT64)
|
58
|
+
#else
|
59
|
+
#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT32)
|
60
|
+
#endif
|
61
|
+
|
34
62
|
/* for little endian ARC, the code is in fact stored as mixed endian for
|
35
63
|
performance reasons */
|
36
64
|
#if __BIG_ENDIAN__
|
@@ -39,94 +67,6 @@
|
|
39
67
|
#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16))
|
40
68
|
#endif
|
41
69
|
|
42
|
-
/* ffi_prep_args is called by the assembly routine once stack
|
43
|
-
space has been allocated for the function's arguments. */
|
44
|
-
|
45
|
-
void
|
46
|
-
ffi_prep_args (char *stack, extended_cif * ecif)
|
47
|
-
{
|
48
|
-
unsigned int i;
|
49
|
-
void **p_argv;
|
50
|
-
char *argp;
|
51
|
-
ffi_type **p_arg;
|
52
|
-
|
53
|
-
argp = stack;
|
54
|
-
|
55
|
-
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
|
56
|
-
{
|
57
|
-
*(void **) argp = ecif->rvalue;
|
58
|
-
argp += 4;
|
59
|
-
}
|
60
|
-
|
61
|
-
p_argv = ecif->avalue;
|
62
|
-
|
63
|
-
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
64
|
-
(i != 0); i--, p_arg++)
|
65
|
-
{
|
66
|
-
size_t z;
|
67
|
-
int alignment;
|
68
|
-
|
69
|
-
/* align alignment to 4 */
|
70
|
-
alignment = (((*p_arg)->alignment - 1) | 3) + 1;
|
71
|
-
|
72
|
-
/* Align if necessary. */
|
73
|
-
if ((alignment - 1) & (unsigned) argp)
|
74
|
-
argp = (char *) FFI_ALIGN (argp, alignment);
|
75
|
-
|
76
|
-
z = (*p_arg)->size;
|
77
|
-
if (z < sizeof (int))
|
78
|
-
{
|
79
|
-
z = sizeof (int);
|
80
|
-
|
81
|
-
switch ((*p_arg)->type)
|
82
|
-
{
|
83
|
-
case FFI_TYPE_SINT8:
|
84
|
-
*(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
|
85
|
-
break;
|
86
|
-
|
87
|
-
case FFI_TYPE_UINT8:
|
88
|
-
*(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv);
|
89
|
-
break;
|
90
|
-
|
91
|
-
case FFI_TYPE_SINT16:
|
92
|
-
*(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
|
93
|
-
break;
|
94
|
-
|
95
|
-
case FFI_TYPE_UINT16:
|
96
|
-
*(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv);
|
97
|
-
break;
|
98
|
-
|
99
|
-
case FFI_TYPE_STRUCT:
|
100
|
-
memcpy (argp, *p_argv, (*p_arg)->size);
|
101
|
-
break;
|
102
|
-
|
103
|
-
default:
|
104
|
-
FFI_ASSERT (0);
|
105
|
-
}
|
106
|
-
}
|
107
|
-
else if (z == sizeof (int))
|
108
|
-
{
|
109
|
-
*(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
|
110
|
-
}
|
111
|
-
else
|
112
|
-
{
|
113
|
-
if ((*p_arg)->type == FFI_TYPE_STRUCT)
|
114
|
-
{
|
115
|
-
memcpy (argp, *p_argv, z);
|
116
|
-
}
|
117
|
-
else
|
118
|
-
{
|
119
|
-
/* Double or long long 64bit. */
|
120
|
-
memcpy (argp, *p_argv, z);
|
121
|
-
}
|
122
|
-
}
|
123
|
-
p_argv++;
|
124
|
-
argp += z;
|
125
|
-
}
|
126
|
-
|
127
|
-
return;
|
128
|
-
}
|
129
|
-
|
130
70
|
/* Perform machine dependent cif processing. */
|
131
71
|
ffi_status
|
132
72
|
ffi_prep_cif_machdep (ffi_cif * cif)
|
@@ -157,85 +97,250 @@ ffi_prep_cif_machdep (ffi_cif * cif)
|
|
157
97
|
return FFI_OK;
|
158
98
|
}
|
159
99
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
100
|
+
/* allocates a single register, float register, or XLEN-sized stack slot to a datum */
|
101
|
+
static void marshal_atom(call_builder *cb, int type, void *data) {
|
102
|
+
size_t value = 0;
|
103
|
+
switch (type) {
|
104
|
+
case FFI_TYPE_UINT8: value = *(uint8_t *)data; break;
|
105
|
+
case FFI_TYPE_SINT8: value = *(int8_t *)data; break;
|
106
|
+
case FFI_TYPE_UINT16: value = *(uint16_t *)data; break;
|
107
|
+
case FFI_TYPE_SINT16: value = *(int16_t *)data; break;
|
108
|
+
/* 32-bit quantities are always sign-extended in the ABI */
|
109
|
+
case FFI_TYPE_UINT32: value = *(int32_t *)data; break;
|
110
|
+
case FFI_TYPE_SINT32: value = *(int32_t *)data; break;
|
111
|
+
#if defined(__ARC64_ARCH64__)
|
112
|
+
case FFI_TYPE_UINT64: value = *(uint64_t *)data; break;
|
113
|
+
case FFI_TYPE_SINT64: value = *(int64_t *)data; break;
|
114
|
+
#endif
|
115
|
+
case FFI_TYPE_POINTER: value = *(size_t *)data; break;
|
116
|
+
default: FFI_ASSERT(0); break;
|
117
|
+
}
|
118
|
+
|
119
|
+
if (cb->used_integer == NARGREG) {
|
120
|
+
*cb->used_stack++ = value;
|
121
|
+
} else {
|
122
|
+
cb->aregs->r[cb->used_integer++] = value;
|
123
|
+
}
|
124
|
+
}
|
171
125
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
126
|
+
/* adds an argument to a call, or a not by reference return value */
|
127
|
+
static void marshal(call_builder *cb, ffi_type *type, int var, void *data) {
|
128
|
+
size_t realign[2];
|
129
|
+
|
130
|
+
#if (defined(__ARC64_ARCH64__) || defined(__ARC64_ARCH32__))
|
131
|
+
if (type->size > 2 * __SIZEOF_POINTER__) {
|
132
|
+
if (var) {
|
133
|
+
marshal_atom(cb, FFI_TYPE_POINTER, &data);
|
134
|
+
} else {
|
135
|
+
/* copy to stack and pass by reference */
|
136
|
+
data = memcpy (cb->struct_stack, data, type->size);
|
137
|
+
cb->struct_stack = (size_t *) FFI_ALIGN ((char *) cb->struct_stack + type->size, __SIZEOF_POINTER__);
|
138
|
+
marshal_atom(cb, FFI_TYPE_POINTER, &data);
|
177
139
|
}
|
178
|
-
|
179
|
-
|
140
|
+
}
|
141
|
+
#else
|
142
|
+
if (type->type == FFI_TYPE_STRUCT) {
|
143
|
+
if (var) {
|
144
|
+
if (type->size > 0)
|
145
|
+
marshal_atom(cb, FFI_TYPE_POINTER, data);
|
146
|
+
} else {
|
147
|
+
int i;
|
148
|
+
|
149
|
+
for (i = 0; i < type->size; i += sizeof(size_t)) {
|
150
|
+
marshal_atom(cb, FFI_TYPE_POINTER, data);
|
151
|
+
data += sizeof(size_t);
|
152
|
+
}
|
153
|
+
}
|
154
|
+
}
|
155
|
+
#endif
|
156
|
+
else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
|
157
|
+
marshal_atom(cb, type->type, data);
|
158
|
+
} else {
|
159
|
+
memcpy(realign, data, type->size);
|
160
|
+
if (type->size > 0)
|
161
|
+
marshal_atom(cb, FFI_TYPE_POINTER, realign);
|
162
|
+
if (type->size > __SIZEOF_POINTER__)
|
163
|
+
marshal_atom(cb, FFI_TYPE_POINTER, realign + 1);
|
164
|
+
}
|
165
|
+
}
|
180
166
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
167
|
+
static void unmarshal_atom(call_builder *cb, int type, void *data) {
|
168
|
+
size_t value;
|
169
|
+
|
170
|
+
if (cb->used_integer == NARGREG) {
|
171
|
+
value = *cb->used_stack++;
|
172
|
+
} else {
|
173
|
+
value = cb->aregs->r[cb->used_integer++];
|
174
|
+
}
|
175
|
+
|
176
|
+
switch (type) {
|
177
|
+
case FFI_TYPE_UINT8: *(uint8_t *)data = value; break;
|
178
|
+
case FFI_TYPE_SINT8: *(uint8_t *)data = value; break;
|
179
|
+
case FFI_TYPE_UINT16: *(uint16_t *)data = value; break;
|
180
|
+
case FFI_TYPE_SINT16: *(uint16_t *)data = value; break;
|
181
|
+
case FFI_TYPE_UINT32: *(uint32_t *)data = value; break;
|
182
|
+
case FFI_TYPE_SINT32: *(uint32_t *)data = value; break;
|
183
|
+
#if defined(__ARC64_ARCH64__)
|
184
|
+
case FFI_TYPE_UINT64: *(uint64_t *)data = value; break;
|
185
|
+
case FFI_TYPE_SINT64: *(uint64_t *)data = value; break;
|
186
|
+
#endif
|
187
|
+
case FFI_TYPE_POINTER: *(size_t *)data = value; break;
|
188
|
+
default: FFI_ASSERT(0); break;
|
189
|
+
}
|
190
|
+
}
|
187
191
|
|
188
|
-
|
189
|
-
|
190
|
-
|
192
|
+
/* for arguments passed by reference returns the pointer, otherwise the arg is copied (up to MAXCOPYARG bytes) */
|
193
|
+
static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) {
|
194
|
+
size_t realign[2];
|
195
|
+
void *pointer;
|
196
|
+
|
197
|
+
#if defined(__ARC64_ARCH64__)
|
198
|
+
if (type->size > 2 * __SIZEOF_POINTER__) {
|
199
|
+
/* pass by reference */
|
200
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer);
|
201
|
+
return pointer;
|
191
202
|
}
|
203
|
+
#elif defined(__ARC64_ARCH32__)
|
204
|
+
if (type->type == FFI_TYPE_STRUCT) {
|
205
|
+
if (type->size > 2 * __SIZEOF_POINTER__) {
|
206
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, &realign[0]);
|
207
|
+
memcpy(data, (const void*)realign[0], type->size);
|
208
|
+
return data;
|
209
|
+
} else {
|
210
|
+
int i;
|
211
|
+
void *pdata = data;
|
212
|
+
|
213
|
+
for (i = 0; i < type->size; i += sizeof(size_t)) {
|
214
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, pdata);
|
215
|
+
pdata += sizeof(size_t);
|
216
|
+
}
|
217
|
+
return data;
|
218
|
+
}
|
219
|
+
}
|
220
|
+
#else
|
221
|
+
if (type->type == FFI_TYPE_STRUCT) {
|
222
|
+
|
223
|
+
if (var) {
|
224
|
+
int i;
|
225
|
+
void *pdata = data;
|
226
|
+
|
227
|
+
for (i = 0; i < type->size; i += sizeof(size_t)) {
|
228
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, pdata);
|
229
|
+
pdata += sizeof(size_t);
|
230
|
+
}
|
231
|
+
return data;
|
232
|
+
} else {
|
233
|
+
if (type->size > 0)
|
234
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, &realign[0]);
|
235
|
+
memcpy(data, (const void*)realign[0], type->size);
|
236
|
+
return data;
|
237
|
+
}
|
238
|
+
}
|
239
|
+
#endif
|
240
|
+
else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
|
241
|
+
unmarshal_atom(cb, type->type, data);
|
242
|
+
return data;
|
243
|
+
} else {
|
244
|
+
if (type->size > 0)
|
245
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, realign);
|
246
|
+
if (type->size > __SIZEOF_POINTER__)
|
247
|
+
unmarshal_atom(cb, FFI_TYPE_POINTER, realign + 1);
|
248
|
+
memcpy(data, realign, type->size);
|
249
|
+
return data;
|
250
|
+
}
|
192
251
|
}
|
193
252
|
|
194
|
-
int
|
195
|
-
|
196
|
-
|
253
|
+
static int passed_by_ref(ffi_type *type, int var) {
|
254
|
+
if (type->type == FFI_TYPE_STRUCT)
|
255
|
+
return 1;
|
256
|
+
|
257
|
+
return type->size > 2 * __SIZEOF_POINTER__;
|
258
|
+
}
|
259
|
+
|
260
|
+
/* Low level routine for calling functions */
|
261
|
+
extern void ffi_call_asm (void *stack, struct call_context *regs,
|
262
|
+
void (*fn) (void), void *closure) FFI_HIDDEN;
|
263
|
+
|
264
|
+
static void
|
265
|
+
ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
|
266
|
+
void *closure)
|
197
267
|
{
|
198
|
-
|
199
|
-
ffi_cif *cif = closure->cif;
|
200
|
-
char *argp = (char *) args;
|
201
|
-
ffi_type **p_argt;
|
202
|
-
int i;
|
268
|
+
int return_by_ref = passed_by_ref(cif->rtype, 0);
|
203
269
|
|
204
|
-
|
270
|
+
/* Allocate space for stack arg parameters. */
|
271
|
+
size_t arg_bytes = FFI_ALIGN(2 * sizeof(size_t) * cif->nargs, STKALIGN);
|
272
|
+
/* Allocate space for copies of big structures. */
|
273
|
+
size_t struct_bytes = FFI_ALIGN(cif->bytes, STKALIGN);
|
274
|
+
// size_t rval_bytes = 0;
|
275
|
+
// if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__)
|
276
|
+
// rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN);
|
277
|
+
size_t alloc_size = arg_bytes + /*rval_bytes +*/ struct_bytes + sizeof(call_context);
|
278
|
+
size_t alloc_base = (size_t)alloca(alloc_size);
|
205
279
|
|
206
|
-
|
207
|
-
|
208
|
-
{
|
209
|
-
rvalue = *(void **) argp;
|
210
|
-
argp += 4;
|
211
|
-
}
|
280
|
+
// if (rval_bytes)
|
281
|
+
// rvalue = (void*)(alloc_base + arg_bytes);
|
212
282
|
|
213
|
-
|
283
|
+
call_builder cb;
|
284
|
+
cb.used_integer = 0;
|
285
|
+
cb.aregs = (call_context*)(alloc_base + arg_bytes /*+ rval_bytes*/ + struct_bytes);
|
286
|
+
cb.used_stack = (void*)alloc_base;
|
287
|
+
cb.struct_stack = (void *)(alloc_base + arg_bytes /*+ rval_bytes*/);
|
214
288
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
289
|
+
// if (cif->rtype->type == FFI_TYPE_STRUCT)
|
290
|
+
// marshal(&cb, &ffi_type_pointer, 0, &rvalue);
|
291
|
+
|
292
|
+
if (return_by_ref)
|
293
|
+
marshal(&cb, &ffi_type_pointer, 0, &rvalue);
|
220
294
|
|
221
|
-
|
222
|
-
|
295
|
+
int i;
|
296
|
+
for (i = 0; i < cif->nargs; i++)
|
297
|
+
marshal(&cb, cif->arg_types[i], 0, avalue[i]);
|
223
298
|
|
224
|
-
|
225
|
-
if ((alignment - 1) & (unsigned) argp)
|
226
|
-
argp = (char *) FFI_ALIGN (argp, alignment);
|
299
|
+
ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure);
|
227
300
|
|
228
|
-
|
229
|
-
|
230
|
-
|
301
|
+
cb.used_integer = 0;
|
302
|
+
if (!return_by_ref && rvalue)
|
303
|
+
{
|
304
|
+
if (IS_INT(cif->rtype->type)
|
305
|
+
&& cif->rtype->size < sizeof (ffi_arg))
|
306
|
+
{
|
307
|
+
/* Integer types smaller than ffi_arg need to be extended. */
|
308
|
+
switch (cif->rtype->type) {
|
309
|
+
case FFI_TYPE_SINT8:
|
310
|
+
case FFI_TYPE_SINT16:
|
311
|
+
case FFI_TYPE_SINT32:
|
312
|
+
unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
|
313
|
+
? FFI_TYPE_SINT64 : FFI_TYPE_SINT32),
|
314
|
+
rvalue);
|
315
|
+
break;
|
316
|
+
case FFI_TYPE_UINT8:
|
317
|
+
case FFI_TYPE_UINT16:
|
318
|
+
case FFI_TYPE_UINT32:
|
319
|
+
unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
|
320
|
+
? FFI_TYPE_UINT64 : FFI_TYPE_UINT32),
|
321
|
+
rvalue);
|
322
|
+
break;
|
323
|
+
}
|
324
|
+
}
|
325
|
+
else
|
326
|
+
unmarshal(&cb, cif->rtype, 0, rvalue);
|
231
327
|
}
|
328
|
+
}
|
232
329
|
|
233
|
-
|
330
|
+
void
|
331
|
+
ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
|
332
|
+
{
|
333
|
+
ffi_call_int(cif, fn, rvalue, avalue, NULL);
|
334
|
+
}
|
234
335
|
|
235
|
-
|
336
|
+
void
|
337
|
+
ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue,
|
338
|
+
void **avalue, void *closure)
|
339
|
+
{
|
340
|
+
ffi_call_int(cif, fn, rvalue, avalue, closure);
|
236
341
|
}
|
237
342
|
|
238
|
-
extern void
|
343
|
+
extern void ffi_closure_asm(void) FFI_HIDDEN;
|
239
344
|
|
240
345
|
ffi_status
|
241
346
|
ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
|
@@ -243,15 +348,28 @@ ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
|
|
243
348
|
void *user_data, void *codeloc)
|
244
349
|
{
|
245
350
|
uint32_t *tramp = (uint32_t *) & (closure->tramp[0]);
|
351
|
+
size_t address_ffi_closure = (size_t) ffi_closure_asm;
|
246
352
|
|
247
353
|
switch (cif->abi)
|
248
354
|
{
|
355
|
+
#if defined(__ARC64_ARCH64__)
|
356
|
+
case FFI_ARC64:
|
357
|
+
FFI_ASSERT (tramp == codeloc);
|
358
|
+
tramp[0] = CODE_ENDIAN (0x580a1fc0); /* movl r8, pcl */
|
359
|
+
tramp[1] = CODE_ENDIAN (0x5c0b1f80); /* movhl r12, limm */
|
360
|
+
tramp[2] = CODE_ENDIAN ((uint32_t)(address_ffi_closure >> 32));
|
361
|
+
tramp[3] = CODE_ENDIAN (0x5c051f8c); /* orl r12, r12, limm */
|
362
|
+
tramp[4] = CODE_ENDIAN ((uint32_t)(address_ffi_closure & 0xffffffff));
|
363
|
+
tramp[5] = CODE_ENDIAN (0x20200300); /* j [r12] */
|
364
|
+
break;
|
365
|
+
#else
|
249
366
|
case FFI_ARCOMPACT:
|
250
367
|
FFI_ASSERT (tramp == codeloc);
|
251
368
|
tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */
|
252
369
|
tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */
|
253
|
-
tramp[2] = CODE_ENDIAN (
|
370
|
+
tramp[2] = CODE_ENDIAN (ffi_closure_asm);
|
254
371
|
break;
|
372
|
+
#endif
|
255
373
|
|
256
374
|
default:
|
257
375
|
return FFI_BAD_ABI;
|
@@ -264,3 +382,62 @@ ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
|
|
264
382
|
|
265
383
|
return FFI_OK;
|
266
384
|
}
|
385
|
+
|
386
|
+
extern void ffi_go_closure_asm (void) FFI_HIDDEN;
|
387
|
+
|
388
|
+
ffi_status
|
389
|
+
ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
|
390
|
+
void (*fun) (ffi_cif *, void *, void **, void *))
|
391
|
+
{
|
392
|
+
if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI)
|
393
|
+
return FFI_BAD_ABI;
|
394
|
+
|
395
|
+
closure->tramp = (void *) ffi_go_closure_asm;
|
396
|
+
closure->cif = cif;
|
397
|
+
closure->fun = fun;
|
398
|
+
|
399
|
+
return FFI_OK;
|
400
|
+
}
|
401
|
+
|
402
|
+
/* Called by the assembly code with aregs pointing to saved argument registers
|
403
|
+
and stack pointing to the stacked arguments. Return values passed in
|
404
|
+
registers will be reloaded from aregs. */
|
405
|
+
void FFI_HIDDEN
|
406
|
+
ffi_closure_inner (ffi_cif *cif,
|
407
|
+
void (*fun) (ffi_cif *, void *, void **, void *),
|
408
|
+
void *user_data,
|
409
|
+
size_t *stack, call_context *aregs)
|
410
|
+
{
|
411
|
+
void **avalue = alloca(cif->nargs * sizeof(void*));
|
412
|
+
/* storage for arguments which will be copied by unmarshal(). We could
|
413
|
+
theoretically avoid the copies in many cases and use at most 128 bytes
|
414
|
+
of memory, but allocating disjoint storage for each argument is
|
415
|
+
simpler. */
|
416
|
+
char *astorage = alloca(cif->bytes);
|
417
|
+
char *ptr = astorage;
|
418
|
+
void *rvalue;
|
419
|
+
call_builder cb;
|
420
|
+
int i;
|
421
|
+
|
422
|
+
cb.aregs = aregs;
|
423
|
+
cb.used_integer = 0;
|
424
|
+
cb.used_stack = stack;
|
425
|
+
|
426
|
+
/* handle hidden argument */
|
427
|
+
if (cif->flags == FFI_TYPE_STRUCT)
|
428
|
+
unmarshal(&cb, &ffi_type_pointer, 0, &rvalue);
|
429
|
+
else
|
430
|
+
rvalue = alloca(cif->rtype->size);
|
431
|
+
|
432
|
+
for (i = 0; i < cif->nargs; i++) {
|
433
|
+
avalue[i] = unmarshal(&cb, cif->arg_types[i], 1, ptr);
|
434
|
+
ptr += cif->arg_types[i]->size;
|
435
|
+
}
|
436
|
+
|
437
|
+
fun (cif, rvalue, avalue, user_data);
|
438
|
+
|
439
|
+
if (cif->rtype->type != FFI_TYPE_VOID) {
|
440
|
+
cb.used_integer = 0;
|
441
|
+
marshal(&cb, cif->rtype, 1, rvalue);
|
442
|
+
}
|
443
|
+
}
|
@@ -40,14 +40,28 @@ typedef signed long ffi_sarg;
|
|
40
40
|
typedef enum ffi_abi
|
41
41
|
{
|
42
42
|
FFI_FIRST_ABI = 0,
|
43
|
+
#if __SIZEOF_POINTER__ == 8
|
44
|
+
FFI_ARC64,
|
45
|
+
#else
|
43
46
|
FFI_ARCOMPACT,
|
47
|
+
#endif
|
44
48
|
FFI_LAST_ABI,
|
49
|
+
#if __SIZEOF_POINTER__ == 8
|
50
|
+
FFI_DEFAULT_ABI = FFI_ARC64
|
51
|
+
#else
|
45
52
|
FFI_DEFAULT_ABI = FFI_ARCOMPACT
|
53
|
+
#endif
|
46
54
|
} ffi_abi;
|
47
55
|
#endif
|
48
56
|
|
49
57
|
#define FFI_CLOSURES 1
|
58
|
+
#define FFI_GO_CLOSURES 1
|
59
|
+
#if __SIZEOF_POINTER__ == 8
|
60
|
+
#define FFI_TRAMPOLINE_SIZE 24
|
61
|
+
#else
|
50
62
|
#define FFI_TRAMPOLINE_SIZE 12
|
63
|
+
#endif
|
64
|
+
|
51
65
|
#define FFI_NATIVE_RAW_API 0
|
52
66
|
|
53
67
|
#endif
|