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.
Files changed (343) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +118 -0
  4. data/Gemfile +10 -3
  5. data/README.md +4 -3
  6. data/Rakefile +25 -10
  7. data/ext/ffi_c/AbstractMemory.c +99 -74
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +51 -15
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +90 -33
  12. data/ext/ffi_c/Call.c +29 -12
  13. data/ext/ffi_c/Call.h +3 -2
  14. data/ext/ffi_c/DynamicLibrary.c +90 -27
  15. data/ext/ffi_c/Function.c +244 -98
  16. data/ext/ffi_c/Function.h +1 -0
  17. data/ext/ffi_c/FunctionInfo.c +81 -25
  18. data/ext/ffi_c/LastError.c +29 -11
  19. data/ext/ffi_c/MappedType.c +66 -23
  20. data/ext/ffi_c/MappedType.h +0 -2
  21. data/ext/ffi_c/MemoryPointer.c +36 -9
  22. data/ext/ffi_c/MethodHandle.c +3 -1
  23. data/ext/ffi_c/Pointer.c +82 -40
  24. data/ext/ffi_c/Pointer.h +1 -0
  25. data/ext/ffi_c/Struct.c +166 -84
  26. data/ext/ffi_c/Struct.h +7 -4
  27. data/ext/ffi_c/StructByValue.c +48 -16
  28. data/ext/ffi_c/StructLayout.c +130 -61
  29. data/ext/ffi_c/Type.c +120 -51
  30. data/ext/ffi_c/Type.h +3 -1
  31. data/ext/ffi_c/Types.c +8 -2
  32. data/ext/ffi_c/Types.h +0 -1
  33. data/ext/ffi_c/Variadic.c +71 -26
  34. data/ext/ffi_c/compat.h +22 -22
  35. data/ext/ffi_c/extconf.rb +19 -2
  36. data/ext/ffi_c/ffi.c +4 -0
  37. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  38. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  39. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  40. data/ext/ffi_c/libffi/.appveyor.yml +27 -9
  41. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  42. data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
  43. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  44. data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
  45. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  46. data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
  47. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  48. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  49. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  50. data/ext/ffi_c/libffi/.gitignore +10 -2
  51. data/ext/ffi_c/libffi/LICENSE +1 -1
  52. data/ext/ffi_c/libffi/Makefile.am +12 -5
  53. data/ext/ffi_c/libffi/Makefile.in +118 -51
  54. data/ext/ffi_c/libffi/README.md +150 -105
  55. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  56. data/ext/ffi_c/libffi/compile +348 -0
  57. data/ext/ffi_c/libffi/config.guess +623 -556
  58. data/ext/ffi_c/libffi/config.sub +75 -34
  59. data/ext/ffi_c/libffi/configure +4571 -3830
  60. data/ext/ffi_c/libffi/configure.ac +64 -28
  61. data/ext/ffi_c/libffi/configure.host +26 -7
  62. data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
  63. data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
  64. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  65. data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
  66. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
  67. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  68. data/ext/ffi_c/libffi/include/Makefile.in +10 -9
  69. data/ext/ffi_c/libffi/include/ffi.h.in +55 -60
  70. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  71. data/ext/ffi_c/libffi/include/ffi_common.h +33 -2
  72. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  73. data/ext/ffi_c/libffi/install-sh +92 -69
  74. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  75. data/ext/ffi_c/libffi/libtool-version +2 -2
  76. data/ext/ffi_c/libffi/ltmain.sh +518 -333
  77. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  78. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  79. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
  80. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  81. data/ext/ffi_c/libffi/man/Makefile.in +9 -6
  82. data/ext/ffi_c/libffi/missing +1 -1
  83. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +2 -2
  84. data/ext/ffi_c/libffi/msvcc.sh +1 -1
  85. data/ext/ffi_c/libffi/src/aarch64/ffi.c +172 -55
  86. data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
  87. data/ext/ffi_c/libffi/src/aarch64/sysv.S +331 -87
  88. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  89. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  90. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  91. data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
  92. data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
  93. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  94. data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
  95. data/ext/ffi_c/libffi/src/closures.c +136 -50
  96. data/ext/ffi_c/libffi/src/debug.c +2 -2
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
  98. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  99. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  100. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  101. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  102. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  103. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  104. data/ext/ffi_c/libffi/src/mips/ffi.c +250 -67
  105. data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
  106. data/ext/ffi_c/libffi/src/mips/n32.S +193 -33
  107. data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
  108. data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
  109. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  110. data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
  111. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  112. data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
  113. data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
  114. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  115. data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
  116. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  117. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
  118. data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
  119. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
  120. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  121. data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
  122. data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
  123. data/ext/ffi_c/libffi/src/sparc/ffi64.c +23 -1
  124. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  125. data/ext/ffi_c/libffi/src/types.c +4 -6
  126. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  127. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  128. data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
  129. data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
  130. data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
  131. data/ext/ffi_c/libffi/src/x86/ffiw64.c +44 -1
  132. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  133. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  134. data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
  135. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
  136. data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
  137. data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
  138. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  139. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  140. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  141. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -114
  142. data/ext/ffi_c/libffi/testsuite/Makefile.in +89 -121
  143. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  144. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  145. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  146. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  147. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  148. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  149. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
  150. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  151. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
  152. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
  185. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
  188. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
  192. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
  199. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
  200. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
  201. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
  209. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
  210. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
  212. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
  213. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
  214. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
  217. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
  218. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
  219. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
  220. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
  221. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
  222. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
  223. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
  224. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
  226. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
  227. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
  228. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
  229. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
  231. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
  232. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
  234. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
  235. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
  237. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
  238. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
  239. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
  240. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
  241. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
  254. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
  255. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
  256. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
  257. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
  259. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
  262. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
  263. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
  274. data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
  275. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
  276. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
  277. data/ext/ffi_c/libffi.bsd.mk +2 -2
  278. data/ext/ffi_c/libffi.darwin.mk +2 -2
  279. data/ext/ffi_c/libffi.gnu.mk +2 -2
  280. data/ext/ffi_c/rbffi.h +1 -1
  281. data/ffi.gemspec +3 -3
  282. data/lib/ffi/autopointer.rb +8 -31
  283. data/lib/ffi/compat.rb +43 -0
  284. data/lib/ffi/data_converter.rb +2 -2
  285. data/lib/ffi/dynamic_library.rb +118 -0
  286. data/lib/ffi/enum.rb +18 -12
  287. data/lib/ffi/ffi.rb +3 -0
  288. data/lib/ffi/function.rb +71 -0
  289. data/lib/ffi/io.rb +2 -2
  290. data/lib/ffi/library.rb +72 -88
  291. data/lib/ffi/library_path.rb +109 -0
  292. data/lib/ffi/managedstruct.rb +1 -1
  293. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  294. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  295. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  296. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  297. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  298. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  299. data/lib/ffi/platform.rb +15 -13
  300. data/lib/ffi/pointer.rb +6 -6
  301. data/lib/ffi/struct.rb +6 -5
  302. data/lib/ffi/struct_layout.rb +3 -3
  303. data/lib/ffi/struct_layout_builder.rb +9 -9
  304. data/lib/ffi/types.rb +65 -37
  305. data/lib/ffi/variadic.rb +19 -8
  306. data/lib/ffi/version.rb +1 -1
  307. data/samples/hello_ractor.rb +11 -0
  308. data/samples/qsort_ractor.rb +28 -0
  309. data/sig/ffi/abstract_memory.rbs +165 -0
  310. data/sig/ffi/auto_pointer.rbs +27 -0
  311. data/sig/ffi/buffer.rbs +18 -0
  312. data/sig/ffi/data_converter.rbs +10 -0
  313. data/sig/ffi/dynamic_library.rbs +9 -0
  314. data/sig/ffi/enum.rbs +38 -0
  315. data/sig/ffi/function.rbs +39 -0
  316. data/sig/ffi/library.rbs +42 -0
  317. data/sig/ffi/native_type.rbs +86 -0
  318. data/sig/ffi/pointer.rbs +42 -0
  319. data/sig/ffi/struct.rbs +76 -0
  320. data/sig/ffi/struct_by_reference.rbs +11 -0
  321. data/sig/ffi/struct_by_value.rbs +7 -0
  322. data/sig/ffi/struct_layout.rbs +9 -0
  323. data/sig/ffi/struct_layout_builder.rbs +5 -0
  324. data/sig/ffi/type.rbs +39 -0
  325. data/sig/ffi.rbs +26 -0
  326. data.tar.gz.sig +0 -0
  327. metadata +122 -28
  328. metadata.gz.sig +1 -0
  329. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
  330. data/ext/ffi_c/libffi/.travis/build.sh +0 -142
  331. data/ext/ffi_c/libffi/.travis.yml +0 -83
  332. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
  333. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
  334. /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  335. /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
  336. /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  337. /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
  338. /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
  339. /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
  340. /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
  341. /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
  342. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  343. /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
- extern void ffi_call_ARCompact (void (*)(char *, extended_cif *),
161
- extended_cif *, unsigned, unsigned,
162
- unsigned *, void (*fn) (void));
163
-
164
- void
165
- ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue)
166
- {
167
- extended_cif ecif;
168
-
169
- ecif.cif = cif;
170
- ecif.avalue = avalue;
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
- /* If the return value is a struct and we don't have
173
- a return value address then we need to make one. */
174
- if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
175
- {
176
- ecif.rvalue = alloca (cif->rtype->size);
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
- else
179
- ecif.rvalue = rvalue;
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
- switch (cif->abi)
182
- {
183
- case FFI_ARCOMPACT:
184
- ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes,
185
- cif->flags, ecif.rvalue, fn);
186
- break;
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
- default:
189
- FFI_ASSERT (0);
190
- break;
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
- ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue,
196
- ffi_arg * args)
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
- void **arg_area, **p_argv;
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
- arg_area = (void **) alloca (cif->nargs * sizeof (void *));
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
- /* handle hidden argument */
207
- if (cif->flags == FFI_TYPE_STRUCT)
208
- {
209
- rvalue = *(void **) argp;
210
- argp += 4;
211
- }
280
+ // if (rval_bytes)
281
+ // rvalue = (void*)(alloc_base + arg_bytes);
212
282
 
213
- p_argv = arg_area;
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
- for (i = 0, p_argt = cif->arg_types; i < cif->nargs;
216
- i++, p_argt++, p_argv++)
217
- {
218
- size_t z;
219
- int alignment;
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
- /* align alignment to 4 */
222
- alignment = (((*p_argt)->alignment - 1) | 3) + 1;
295
+ int i;
296
+ for (i = 0; i < cif->nargs; i++)
297
+ marshal(&cb, cif->arg_types[i], 0, avalue[i]);
223
298
 
224
- /* Align if necessary. */
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
- z = (*p_argt)->size;
229
- *p_argv = (void *) argp;
230
- argp += z;
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
- (closure->fun) (cif, rvalue, arg_area, closure->user_data);
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
- return cif->flags;
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 ffi_closure_ARCompact (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 (ffi_closure_ARCompact);
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