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
@@ -103,51 +103,103 @@ ffi_call_pa32:
103
103
 
104
104
  /* Prepare to store the result; we need to recover flags and rvalue. */
105
105
  ldw -48(%r3), %r21 /* r21 <- flags */
106
- ldw -52(%r3), %r20 /* r20 <- rvalue */
107
106
 
108
- /* Store the result according to the return type. */
107
+ /* Adjust flags range from [-8, 15] to [0, 23]. */
108
+ addi 8, %r21, %r21
109
109
 
110
- .Lcheckint:
111
- comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
112
- b .Ldone
113
- stw %ret0, 0(%r20)
110
+ blr %r21, %r0
111
+ ldw -52(%r3), %r20 /* r20 <- rvalue */
114
112
 
115
- .Lcheckint8:
116
- comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
113
+ /* Giant jump table */
114
+ /* 8-byte small struct */
115
+ b,n .Lsmst8
116
+ nop
117
+ /* 7-byte small struct */
118
+ b,n .Lsmst7
119
+ nop
120
+ /* 6-byte small struct */
121
+ b,n .Lsmst6
122
+ nop
123
+ /* 5-byte small struct */
124
+ b,n .Lsmst5
125
+ nop
126
+ /* 4-byte small struct */
127
+ b,n .Lsmst4
128
+ nop
129
+ /* 3-byte small struct */
130
+ b,n .Lsmst3
131
+ nop
132
+ /* 2-byte small struct */
133
+ b,n .Lsmst2
134
+ nop
135
+ /* 1-byte small struct */
117
136
  b .Ldone
118
137
  stb %ret0, 0(%r20)
119
-
120
- .Lcheckint16:
121
- comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
138
+ /* void */
139
+ b,n .Ldone
140
+ nop
141
+ /* int */
122
142
  b .Ldone
123
- sth %ret0, 0(%r20)
124
-
125
- .Lcheckdbl:
126
- comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
143
+ stw %ret0, 0(%r20)
144
+ /* float */
145
+ b .Ldone
146
+ fstw %fr4L,0(%r20)
147
+ /* double */
127
148
  b .Ldone
128
149
  fstd %fr4,0(%r20)
129
-
130
- .Lcheckfloat:
131
- comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
150
+ /* long double */
132
151
  b .Ldone
133
- fstw %fr4L,0(%r20)
152
+ fstd %fr4,0(%r20)
153
+ /* unsigned int8 */
154
+ b .Ldone
155
+ stw %ret0, 0(%r20)
156
+ /* sint8 */
157
+ b .Ldone
158
+ stw %ret0, 0(%r20)
159
+ /* unsigned int16 */
160
+ b .Ldone
161
+ stw %ret0, 0(%r20)
162
+ /* sint16 */
163
+ b .Ldone
164
+ stw %ret0, 0(%r20)
165
+ /* unsigned int32 */
166
+ b .Ldone
167
+ stw %ret0, 0(%r20)
168
+ /* sint32 */
169
+ b .Ldone
170
+ stw %ret0, 0(%r20)
171
+ /* unsigned int64 */
172
+ b,n .Luint64
173
+ nop
174
+ /* signed int64 */
175
+ b,n .Lsint64
176
+ nop
177
+ /* large struct */
178
+ b,n .Ldone
179
+ nop
180
+ /* pointer */
181
+ b .Ldone
182
+ stw %ret0, 0(%r20)
183
+ /* complex */
184
+ b,n .Ldone
185
+ nop
186
+
187
+ /* Store the result according to the return type. */
134
188
 
135
- .Lcheckll:
136
- comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
189
+ .Luint64:
190
+ .Lsint64:
137
191
  stw %ret0, 0(%r20)
138
192
  b .Ldone
139
193
  stw %ret1, 4(%r20)
140
194
 
141
- .Lchecksmst2:
142
- comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
195
+ .Lsmst2:
143
196
  /* 2-byte structs are returned in ret0 as ????xxyy. */
144
197
  extru %ret0, 23, 8, %r22
145
198
  stbs,ma %r22, 1(%r20)
146
199
  b .Ldone
147
200
  stb %ret0, 0(%r20)
148
201
 
149
- .Lchecksmst3:
150
- comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
202
+ .Lsmst3:
151
203
  /* 3-byte structs are returned in ret0 as ??xxyyzz. */
152
204
  extru %ret0, 15, 8, %r22
153
205
  stbs,ma %r22, 1(%r20)
@@ -156,8 +208,7 @@ ffi_call_pa32:
156
208
  b .Ldone
157
209
  stb %ret0, 0(%r20)
158
210
 
159
- .Lchecksmst4:
160
- comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
211
+ .Lsmst4:
161
212
  /* 4-byte structs are returned in ret0 as wwxxyyzz. */
162
213
  extru %ret0, 7, 8, %r22
163
214
  stbs,ma %r22, 1(%r20)
@@ -168,8 +219,7 @@ ffi_call_pa32:
168
219
  b .Ldone
169
220
  stb %ret0, 0(%r20)
170
221
 
171
- .Lchecksmst5:
172
- comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
222
+ .Lsmst5:
173
223
  /* 5 byte values are returned right justified:
174
224
  ret0 ret1
175
225
  5: ??????aa bbccddee */
@@ -183,8 +233,7 @@ ffi_call_pa32:
183
233
  b .Ldone
184
234
  stb %ret1, 0(%r20)
185
235
 
186
- .Lchecksmst6:
187
- comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
236
+ .Lsmst6:
188
237
  /* 6 byte values are returned right justified:
189
238
  ret0 ret1
190
239
  6: ????aabb ccddeeff */
@@ -200,8 +249,7 @@ ffi_call_pa32:
200
249
  b .Ldone
201
250
  stb %ret1, 0(%r20)
202
251
 
203
- .Lchecksmst7:
204
- comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
252
+ .Lsmst7:
205
253
  /* 7 byte values are returned right justified:
206
254
  ret0 ret1
207
255
  7: ??aabbcc ddeeffgg */
@@ -219,8 +267,7 @@ ffi_call_pa32:
219
267
  b .Ldone
220
268
  stb %ret1, 0(%r20)
221
269
 
222
- .Lchecksmst8:
223
- comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
270
+ .Lsmst8:
224
271
  /* 8 byte values are returned right justified:
225
272
  ret0 ret1
226
273
  8: aabbccdd eeffgghh */
@@ -623,38 +623,50 @@ darwin_adjust_aggregate_sizes (ffi_type *s)
623
623
  }
624
624
 
625
625
  /* Adjust the size of S to be correct for AIX.
626
- Word-align double unless it is the first member of a structure. */
626
+ Word-align double unless it is the first member of a structure recursively.
627
+ Return non-zero if we found a recursive first member aggregate of interest. */
627
628
 
628
- static void
629
- aix_adjust_aggregate_sizes (ffi_type *s)
629
+ static int
630
+ aix_adjust_aggregate_sizes (ffi_type *s, int outer_most_type_or_first_member)
630
631
  {
631
- int i;
632
+ int i, nested_first_member=0, final_align, rc=0;
632
633
 
633
634
  if (s->type != FFI_TYPE_STRUCT)
634
- return;
635
+ return 0;
635
636
 
636
637
  s->size = 0;
637
638
  for (i = 0; s->elements[i] != NULL; i++)
638
639
  {
639
- ffi_type *p;
640
+ ffi_type p;
640
641
  int align;
641
-
642
- p = s->elements[i];
643
- aix_adjust_aggregate_sizes (p);
644
- align = p->alignment;
645
- if (i != 0 && p->type == FFI_TYPE_DOUBLE)
646
- align = 4;
647
- s->size = FFI_ALIGN(s->size, align) + p->size;
642
+
643
+ /* nested aggregates layout differently on AIX, so take a copy of the type */
644
+ p = *(s->elements[i]);
645
+ if (i == 0)
646
+ nested_first_member = aix_adjust_aggregate_sizes(&p, outer_most_type_or_first_member);
647
+ else
648
+ aix_adjust_aggregate_sizes(&p, 0);
649
+ align = p.alignment;
650
+ if (i != 0 && p.type == FFI_TYPE_DOUBLE)
651
+ align = 4;
652
+ s->size = FFI_ALIGN(s->size, align) + p.size;
648
653
  }
649
-
650
- s->size = FFI_ALIGN(s->size, s->alignment);
651
-
652
- if (s->elements[0]->type == FFI_TYPE_UINT64
653
- || s->elements[0]->type == FFI_TYPE_SINT64
654
- || s->elements[0]->type == FFI_TYPE_DOUBLE
655
- || s->elements[0]->alignment == 8)
656
- s->alignment = s->alignment > 8 ? s->alignment : 8;
657
- /* Do not add additional tail padding. */
654
+
655
+ final_align=s->alignment;
656
+ if ((s->elements[0]->type == FFI_TYPE_UINT64
657
+ || s->elements[0]->type == FFI_TYPE_SINT64
658
+ || s->elements[0]->type == FFI_TYPE_DOUBLE
659
+ || s->elements[0]->alignment == 8 || nested_first_member)) {
660
+ final_align = s->alignment > 8 ? s->alignment : 8;
661
+ rc=1;
662
+ /* still use the adjusted alignment to calculate tail padding, but don't adjust the types alignment if
663
+ we aren't in the recursive first position */
664
+ if (outer_most_type_or_first_member)
665
+ s->alignment=final_align;
666
+ }
667
+
668
+ s->size = FFI_ALIGN(s->size, final_align);
669
+ return rc;
658
670
  }
659
671
 
660
672
  /* Perform machine dependent cif processing. */
@@ -682,9 +694,9 @@ ffi_prep_cif_machdep (ffi_cif *cif)
682
694
 
683
695
  if (cif->abi == FFI_AIX)
684
696
  {
685
- aix_adjust_aggregate_sizes (cif->rtype);
697
+ aix_adjust_aggregate_sizes (cif->rtype, 1);
686
698
  for (i = 0; i < cif->nargs; i++)
687
- aix_adjust_aggregate_sizes (cif->arg_types[i]);
699
+ aix_adjust_aggregate_sizes (cif->arg_types[i], 1);
688
700
  }
689
701
 
690
702
  /* Space for the frame pointer, callee's LR, CR, etc, and for
@@ -680,7 +680,7 @@ ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack)
680
680
  {
681
681
  if (vecarg_count < NUM_VEC_ARG_REGISTERS64
682
682
  && i < nfixedargs)
683
- memcpy (vec_base.f128++, arg.f128, sizeof (float128));
683
+ memcpy (vec_base.f128++, arg.f128++, sizeof (float128));
684
684
  else
685
685
  memcpy (next_arg.f128, arg.f128++, sizeof (float128));
686
686
  if (++next_arg.f128 == gpr_end.f128)
@@ -29,6 +29,8 @@
29
29
  #include <fficonfig.h>
30
30
  #include <ffi.h>
31
31
 
32
+ .machine altivec
33
+
32
34
  #ifdef POWERPC64
33
35
  .hidden ffi_call_LINUX64
34
36
  .globl ffi_call_LINUX64
@@ -30,6 +30,8 @@
30
30
 
31
31
  .file "linux64_closure.S"
32
32
 
33
+ .machine altivec
34
+
33
35
  #ifdef POWERPC64
34
36
  FFI_HIDDEN (ffi_closure_LINUX64)
35
37
  .globl ffi_closure_LINUX64
@@ -0,0 +1,5 @@
1
+ # This file is needed by GCC in order to correctly build AIX FAT
2
+ # library for libffi.
3
+ # However, it has no sense to include this code here, as it depends
4
+ # on GCC multilib architecture.
5
+ # Thus, this file is a simple stub replaced in GCC repository.
@@ -1,6 +1,7 @@
1
1
  /* -----------------------------------------------------------------------
2
- prep_cif.c - Copyright (c) 2011, 2012 Anthony Green
2
+ prep_cif.c - Copyright (c) 2011, 2012, 2021 Anthony Green
3
3
  Copyright (c) 1996, 1998, 2007 Red Hat, Inc.
4
+ Copyright (c) 2022 Oracle and/or its affiliates.
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining
6
7
  a copy of this software and associated documentation files (the
@@ -231,7 +232,26 @@ ffi_status ffi_prep_cif_var(ffi_cif *cif,
231
232
  ffi_type *rtype,
232
233
  ffi_type **atypes)
233
234
  {
234
- return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
235
+ ffi_status rc;
236
+ size_t int_size = ffi_type_sint.size;
237
+ unsigned int i;
238
+
239
+ rc = ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
240
+
241
+ if (rc != FFI_OK)
242
+ return rc;
243
+
244
+ for (i = nfixedargs; i < ntotalargs; i++)
245
+ {
246
+ ffi_type *arg_type = atypes[i];
247
+ if (arg_type == &ffi_type_float
248
+ || ((arg_type->type != FFI_TYPE_STRUCT
249
+ && arg_type->type != FFI_TYPE_COMPLEX)
250
+ && arg_type->size < int_size))
251
+ return FFI_BAD_ARGTYPE;
252
+ }
253
+
254
+ return FFI_OK;
235
255
  }
236
256
 
237
257
  #if FFI_CLOSURES
@@ -61,6 +61,7 @@ typedef struct call_builder
61
61
  int used_integer;
62
62
  int used_float;
63
63
  size_t *used_stack;
64
+ void *struct_stack;
64
65
  } call_builder;
65
66
 
66
67
  /* integer (not pointer) less than ABI XLEN */
@@ -227,7 +228,9 @@ static void marshal(call_builder *cb, ffi_type *type, int var, void *data) {
227
228
  #endif
228
229
 
229
230
  if (type->size > 2 * __SIZEOF_POINTER__) {
230
- /* pass by reference */
231
+ /* copy to stack and pass by reference */
232
+ data = memcpy (cb->struct_stack, data, type->size);
233
+ cb->struct_stack = (size_t *) FFI_ALIGN ((char *) cb->struct_stack + type->size, __SIZEOF_POINTER__);
231
234
  marshal_atom(cb, FFI_TYPE_POINTER, &data);
232
235
  } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
233
236
  marshal_atom(cb, type->type, data);
@@ -335,10 +338,12 @@ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
335
338
  that all remaining arguments are long long / __int128 */
336
339
  size_t arg_bytes = cif->nargs <= 3 ? 0 :
337
340
  FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN);
341
+ /* Allocate space for copies of big structures. */
342
+ size_t struct_bytes = FFI_ALIGN (cif->bytes, STKALIGN);
338
343
  size_t rval_bytes = 0;
339
344
  if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__)
340
345
  rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN);
341
- size_t alloc_size = arg_bytes + rval_bytes + sizeof(call_context);
346
+ size_t alloc_size = arg_bytes + rval_bytes + struct_bytes + sizeof(call_context);
342
347
 
343
348
  /* the assembly code will deallocate all stack data at lower addresses
344
349
  than the argument region, so we need to allocate the frame and the
@@ -358,8 +363,9 @@ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
358
363
 
359
364
  call_builder cb;
360
365
  cb.used_float = cb.used_integer = 0;
361
- cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes);
366
+ cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes + struct_bytes);
362
367
  cb.used_stack = (void*)alloc_base;
368
+ cb.struct_stack = (void *) (alloc_base + arg_bytes + rval_bytes);
363
369
 
364
370
  int return_by_ref = passed_by_ref(&cb, cif->rtype, 0);
365
371
  if (return_by_ref)
@@ -373,7 +379,32 @@ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
373
379
 
374
380
  cb.used_float = cb.used_integer = 0;
375
381
  if (!return_by_ref && rvalue)
376
- unmarshal(&cb, cif->rtype, 0, rvalue);
382
+ {
383
+ if (IS_INT(cif->rtype->type)
384
+ && cif->rtype->size < sizeof (ffi_arg))
385
+ {
386
+ /* Integer types smaller than ffi_arg need to be extended. */
387
+ switch (cif->rtype->type)
388
+ {
389
+ case FFI_TYPE_SINT8:
390
+ case FFI_TYPE_SINT16:
391
+ case FFI_TYPE_SINT32:
392
+ unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
393
+ ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32),
394
+ rvalue);
395
+ break;
396
+ case FFI_TYPE_UINT8:
397
+ case FFI_TYPE_UINT16:
398
+ case FFI_TYPE_UINT32:
399
+ unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
400
+ ? FFI_TYPE_UINT64 : FFI_TYPE_UINT32),
401
+ rvalue);
402
+ break;
403
+ }
404
+ }
405
+ else
406
+ unmarshal(&cb, cif->rtype, 0, rvalue);
407
+ }
377
408
  }
378
409
 
379
410
  void
@@ -417,7 +448,9 @@ ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)(
417
448
  closure->fun = fun;
418
449
  closure->user_data = user_data;
419
450
 
451
+ #if !defined(__FreeBSD__)
420
452
  __builtin___clear_cache(codeloc, codeloc + FFI_TRAMPOLINE_SIZE);
453
+ #endif
421
454
 
422
455
  return FFI_OK;
423
456
  }
@@ -382,13 +382,19 @@ ffi_prep_args_v9(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue)
382
382
  *argp++ = *(SINT32 *)a;
383
383
  break;
384
384
  case FFI_TYPE_UINT32:
385
- case FFI_TYPE_FLOAT:
386
385
  *argp++ = *(UINT32 *)a;
387
386
  break;
388
387
  case FFI_TYPE_SINT64:
389
388
  case FFI_TYPE_UINT64:
390
389
  case FFI_TYPE_POINTER:
390
+ *argp++ = *(UINT64 *)a;
391
+ break;
392
+ case FFI_TYPE_FLOAT:
393
+ flags |= SPARC_FLAG_FP_ARGS;
394
+ *argp++ = *(UINT32 *)a;
395
+ break;
391
396
  case FFI_TYPE_DOUBLE:
397
+ flags |= SPARC_FLAG_FP_ARGS;
392
398
  *argp++ = *(UINT64 *)a;
393
399
  break;
394
400
 
@@ -421,12 +427,28 @@ ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue,
421
427
  void **avalue, void *closure)
422
428
  {
423
429
  size_t bytes = cif->bytes;
430
+ size_t i, nargs = cif->nargs;
431
+ ffi_type **arg_types = cif->arg_types;
424
432
 
425
433
  FFI_ASSERT (cif->abi == FFI_V9);
426
434
 
427
435
  if (rvalue == NULL && (cif->flags & SPARC_FLAG_RET_IN_MEM))
428
436
  bytes += FFI_ALIGN (cif->rtype->size, 16);
429
437
 
438
+ /* If we have any large structure arguments, make a copy so we are passing
439
+ by value. */
440
+ for (i = 0; i < nargs; i++)
441
+ {
442
+ ffi_type *at = arg_types[i];
443
+ int size = at->size;
444
+ if (at->type == FFI_TYPE_STRUCT && size > 4)
445
+ {
446
+ char *argcopy = alloca (size);
447
+ memcpy (argcopy, avalue[i], size);
448
+ avalue[i] = argcopy;
449
+ }
450
+ }
451
+
430
452
  ffi_call_v9(cif, fn, rvalue, avalue, -bytes, closure);
431
453
  }
432
454