ffi 1.9.24 → 1.16.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (457) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +348 -0
  4. data/Gemfile +4 -5
  5. data/README.md +44 -17
  6. data/Rakefile +74 -148
  7. data/ext/ffi_c/AbstractMemory.c +89 -70
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +49 -13
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +90 -38
  12. data/ext/ffi_c/Call.c +55 -56
  13. data/ext/ffi_c/Call.h +12 -6
  14. data/ext/ffi_c/ClosurePool.c +333 -0
  15. data/ext/ffi_c/{Closure.h → ClosurePool.h} +25 -13
  16. data/ext/ffi_c/DynamicLibrary.c +91 -33
  17. data/ext/ffi_c/Function.c +306 -235
  18. data/ext/ffi_c/Function.h +3 -5
  19. data/ext/ffi_c/FunctionInfo.c +87 -32
  20. data/ext/ffi_c/LastError.c +74 -15
  21. data/ext/ffi_c/LongDouble.c +12 -10
  22. data/ext/ffi_c/LongDouble.h +0 -4
  23. data/ext/ffi_c/MappedType.c +66 -23
  24. data/ext/ffi_c/MappedType.h +0 -2
  25. data/ext/ffi_c/MemoryPointer.c +37 -15
  26. data/ext/ffi_c/MemoryPointer.h +0 -4
  27. data/ext/ffi_c/MethodHandle.c +265 -38
  28. data/ext/ffi_c/MethodHandle.h +3 -2
  29. data/ext/ffi_c/Platform.c +5 -56
  30. data/ext/ffi_c/Pointer.c +93 -55
  31. data/ext/ffi_c/Pointer.h +1 -4
  32. data/ext/ffi_c/Struct.c +202 -134
  33. data/ext/ffi_c/Struct.h +18 -9
  34. data/ext/ffi_c/StructByValue.c +50 -23
  35. data/ext/ffi_c/StructLayout.c +135 -64
  36. data/ext/ffi_c/Thread.c +4 -228
  37. data/ext/ffi_c/Thread.h +1 -20
  38. data/ext/ffi_c/Type.c +105 -55
  39. data/ext/ffi_c/Type.h +3 -2
  40. data/ext/ffi_c/Types.c +8 -9
  41. data/ext/ffi_c/Types.h +3 -4
  42. data/ext/ffi_c/Variadic.c +88 -47
  43. data/ext/ffi_c/compat.h +26 -22
  44. data/ext/ffi_c/extconf.rb +75 -32
  45. data/ext/ffi_c/ffi.c +9 -10
  46. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  47. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  48. data/ext/ffi_c/libffi/.appveyor.yml +53 -19
  49. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  50. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  51. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  52. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  53. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  54. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  55. data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +1 -1
  56. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  57. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  58. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  60. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  61. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  62. data/ext/ffi_c/libffi/.gitattributes +4 -0
  63. data/ext/ffi_c/libffi/.github/workflows/build.yml +460 -0
  64. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -0
  65. data/ext/ffi_c/libffi/.gitignore +10 -2
  66. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  67. data/ext/ffi_c/libffi/LICENSE +1 -1
  68. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +5 -4
  69. data/ext/ffi_c/libffi/Makefile.am +64 -73
  70. data/ext/ffi_c/libffi/Makefile.in +553 -235
  71. data/ext/ffi_c/libffi/README.md +165 -100
  72. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  73. data/ext/ffi_c/libffi/compile +348 -0
  74. data/ext/ffi_c/libffi/config.guess +950 -662
  75. data/ext/ffi_c/libffi/config.sub +1362 -1306
  76. data/ext/ffi_c/libffi/configure +4909 -4096
  77. data/ext/ffi_c/libffi/configure.ac +93 -32
  78. data/ext/ffi_c/libffi/configure.host +76 -28
  79. data/ext/ffi_c/libffi/doc/Makefile.in +15 -8
  80. data/ext/ffi_c/libffi/doc/libffi.texi +107 -46
  81. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  82. data/ext/ffi_c/libffi/fficonfig.h.in +22 -44
  83. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +165 -56
  84. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  85. data/ext/ffi_c/libffi/include/Makefile.in +17 -12
  86. data/ext/ffi_c/libffi/include/ffi.h.in +64 -48
  87. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  88. data/ext/ffi_c/libffi/include/ffi_common.h +34 -1
  89. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  90. data/ext/ffi_c/libffi/install-sh +107 -74
  91. data/ext/ffi_c/libffi/libffi.map.in +8 -12
  92. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  93. data/ext/ffi_c/libffi/libtool-version +2 -2
  94. data/ext/ffi_c/libffi/ltmain.sh +576 -284
  95. data/ext/ffi_c/libffi/m4/asmcfi.m4 +1 -1
  96. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  97. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  98. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  99. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  100. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -44
  101. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  102. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  103. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  104. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  105. data/ext/ffi_c/libffi/man/Makefile.in +15 -8
  106. data/ext/ffi_c/libffi/missing +8 -8
  107. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  108. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  109. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  110. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  111. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  112. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  113. data/ext/ffi_c/libffi/msvcc.sh +39 -14
  114. data/ext/ffi_c/libffi/src/aarch64/ffi.c +286 -98
  115. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +19 -3
  116. data/ext/ffi_c/libffi/src/aarch64/internal.h +33 -0
  117. data/ext/ffi_c/libffi/src/aarch64/sysv.S +142 -37
  118. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  119. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  120. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  121. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  122. data/ext/ffi_c/libffi/src/arm/ffi.c +112 -10
  123. data/ext/ffi_c/libffi/src/arm/ffitarget.h +8 -1
  124. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  125. data/ext/ffi_c/libffi/src/arm/sysv.S +117 -44
  126. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  127. data/ext/ffi_c/libffi/src/closures.c +189 -48
  128. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  129. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  130. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  131. data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
  132. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  133. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  134. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  135. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  136. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  137. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  138. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  139. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +621 -0
  140. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  141. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  142. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  143. data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
  144. data/ext/ffi_c/libffi/src/mips/ffi.c +245 -66
  145. data/ext/ffi_c/libffi/src/mips/ffitarget.h +8 -1
  146. data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
  147. data/ext/ffi_c/libffi/src/mips/o32.S +63 -4
  148. data/ext/ffi_c/libffi/src/moxie/ffi.c +48 -23
  149. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  150. data/ext/ffi_c/libffi/src/pa/ffi.c +62 -108
  151. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  152. data/ext/ffi_c/libffi/src/pa/ffitarget.h +20 -11
  153. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  154. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  155. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  156. data/ext/ffi_c/libffi/src/powerpc/ffi.c +6 -4
  157. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +13 -1
  158. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +211 -32
  159. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  160. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  161. data/ext/ffi_c/libffi/src/powerpc/linux64.S +93 -28
  162. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +83 -5
  163. data/ext/ffi_c/libffi/src/powerpc/sysv.S +5 -7
  164. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  165. data/ext/ffi_c/libffi/src/prep_cif.c +26 -4
  166. data/ext/ffi_c/libffi/src/riscv/ffi.c +79 -10
  167. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  168. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  169. data/ext/ffi_c/libffi/src/sparc/ffi64.c +16 -0
  170. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  171. data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -0
  172. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  173. data/ext/ffi_c/libffi/src/x86/ffi.c +128 -49
  174. data/ext/ffi_c/libffi/src/x86/ffi64.c +89 -23
  175. data/ext/ffi_c/libffi/src/x86/ffitarget.h +21 -4
  176. data/ext/ffi_c/libffi/src/x86/ffiw64.c +63 -10
  177. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  178. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  179. data/ext/ffi_c/libffi/src/x86/sysv.S +274 -45
  180. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  181. data/ext/ffi_c/libffi/src/x86/unix64.S +190 -4
  182. data/ext/ffi_c/libffi/src/x86/win64.S +32 -10
  183. data/ext/ffi_c/libffi/src/x86/win64_intel.S +3 -2
  184. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  185. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  186. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  187. data/ext/ffi_c/libffi/testsuite/Makefile.am +127 -109
  188. data/ext/ffi_c/libffi/testsuite/Makefile.in +144 -88
  189. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  190. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  191. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +80 -0
  192. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  193. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  194. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  195. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +71 -25
  196. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  197. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  198. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +5 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2 -2
  200. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +9 -8
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  231. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  232. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  233. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  234. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  235. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  236. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  237. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  238. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  239. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +6 -0
  240. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +18 -0
  241. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +22 -0
  242. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +24 -0
  243. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +29 -0
  244. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +4 -0
  245. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +19 -1
  246. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +21 -1
  247. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +35 -3
  248. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +13 -0
  249. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +19 -0
  250. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +13 -0
  251. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +13 -0
  252. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +18 -0
  253. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +22 -0
  254. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +13 -0
  255. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +29 -1
  256. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +19 -1
  257. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +24 -0
  258. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +28 -1
  259. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +24 -2
  260. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +39 -1
  261. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +25 -1
  262. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +14 -0
  263. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +14 -1
  264. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +14 -2
  265. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +19 -1
  266. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +19 -1
  267. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +20 -1
  268. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +40 -25
  269. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +40 -3
  270. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +19 -1
  271. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +18 -1
  272. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +18 -3
  273. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +18 -1
  274. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +18 -1
  275. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +19 -1
  276. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +19 -1
  277. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +3 -1
  278. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +9 -1
  279. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  280. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +11 -1
  281. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +22 -3
  282. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  283. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  284. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  285. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  286. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  287. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  288. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +5 -0
  289. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +10 -0
  290. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  291. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  293. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +11 -0
  294. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  295. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  296. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +4 -0
  297. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +4 -0
  298. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +2 -0
  299. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  301. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +24 -22
  302. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +32 -9
  303. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +1 -1
  304. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +12 -0
  305. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +21 -5
  306. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  308. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +10 -1
  309. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +10 -1
  310. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +9 -0
  311. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +9 -0
  312. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +11 -0
  313. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +9 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +11 -0
  315. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +11 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  319. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +1 -1
  320. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +1 -1
  321. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +6 -1
  322. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +2 -1
  323. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +1 -0
  324. data/ext/ffi_c/libffi.bsd.mk +2 -2
  325. data/ext/ffi_c/libffi.darwin.mk +1 -1
  326. data/ext/ffi_c/libffi.gnu.mk +2 -2
  327. data/ext/ffi_c/rbffi.h +1 -3
  328. data/ffi.gemspec +15 -9
  329. data/lib/ffi/abstract_memory.rb +44 -0
  330. data/lib/ffi/autopointer.rb +8 -23
  331. data/lib/ffi/compat.rb +43 -0
  332. data/lib/ffi/data_converter.rb +67 -0
  333. data/lib/ffi/dynamic_library.rb +89 -0
  334. data/lib/ffi/enum.rb +18 -11
  335. data/lib/ffi/ffi.rb +6 -0
  336. data/lib/ffi/function.rb +71 -0
  337. data/lib/ffi/io.rb +3 -3
  338. data/lib/ffi/library.rb +65 -77
  339. data/lib/ffi/library_path.rb +109 -0
  340. data/lib/ffi/managedstruct.rb +3 -3
  341. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  342. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  343. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  344. data/lib/ffi/platform/aarch64-linux/types.conf +81 -81
  345. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  346. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  347. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  348. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  349. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  350. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  351. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  352. data/lib/ffi/platform/i386-cygwin/types.conf +1 -1
  353. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  354. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  355. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  356. data/lib/ffi/platform/i386-gnu/types.conf +84 -84
  357. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  358. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  359. data/lib/ffi/platform/i386-openbsd/types.conf +89 -89
  360. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  361. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  362. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  363. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  364. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  365. data/lib/ffi/platform/mips64-linux/types.conf +81 -81
  366. data/lib/ffi/platform/mips64el-linux/types.conf +81 -81
  367. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  368. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +79 -79
  369. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +79 -79
  370. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +81 -81
  371. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +81 -81
  372. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  373. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  374. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  375. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  376. data/lib/ffi/platform/powerpc64-linux/types.conf +81 -81
  377. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  378. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  379. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  380. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  381. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  382. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  383. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  384. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  385. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  386. data/lib/ffi/platform/x86_64-cygwin/types.conf +1 -1
  387. data/lib/ffi/platform/x86_64-darwin/types.conf +88 -84
  388. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  389. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -90
  390. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  391. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  392. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  393. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  394. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -89
  395. data/lib/ffi/platform/x86_64-openbsd/types.conf +86 -86
  396. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  397. data/lib/ffi/platform/x86_64-windows/types.conf +42 -110
  398. data/lib/ffi/platform.rb +43 -20
  399. data/lib/ffi/pointer.rb +26 -20
  400. data/lib/ffi/struct.rb +14 -68
  401. data/lib/ffi/struct_by_reference.rb +72 -0
  402. data/lib/ffi/struct_layout.rb +96 -0
  403. data/lib/ffi/struct_layout_builder.rb +1 -1
  404. data/lib/ffi/tools/const_generator.rb +11 -8
  405. data/lib/ffi/tools/generator.rb +47 -2
  406. data/lib/ffi/tools/generator_task.rb +13 -17
  407. data/lib/ffi/tools/struct_generator.rb +6 -5
  408. data/lib/ffi/tools/types_generator.rb +7 -4
  409. data/lib/ffi/types.rb +33 -7
  410. data/lib/ffi/variadic.rb +20 -18
  411. data/lib/ffi/version.rb +1 -1
  412. data/lib/ffi.rb +10 -3
  413. data/rakelib/ffi_gem_helper.rb +65 -0
  414. data/samples/getlogin.rb +1 -1
  415. data/samples/getpid.rb +1 -1
  416. data/samples/gettimeofday.rb +8 -8
  417. data/samples/hello.rb +2 -1
  418. data/samples/hello_ractor.rb +11 -0
  419. data/samples/inotify.rb +1 -1
  420. data/samples/pty.rb +1 -2
  421. data/samples/qsort.rb +0 -1
  422. data/samples/qsort_ractor.rb +28 -0
  423. data.tar.gz.sig +0 -0
  424. metadata +252 -153
  425. metadata.gz.sig +0 -0
  426. data/.gitignore +0 -22
  427. data/.gitmodules +0 -3
  428. data/.travis.yml +0 -52
  429. data/.yardopts +0 -5
  430. data/appveyor.yml +0 -22
  431. data/ext/ffi_c/Closure.c +0 -54
  432. data/ext/ffi_c/DataConverter.c +0 -91
  433. data/ext/ffi_c/StructByReference.c +0 -190
  434. data/ext/ffi_c/StructByReference.h +0 -50
  435. data/ext/ffi_c/libffi/.travis/build.sh +0 -34
  436. data/ext/ffi_c/libffi/.travis/install.sh +0 -22
  437. data/ext/ffi_c/libffi/.travis/site.exp +0 -18
  438. data/ext/ffi_c/libffi/.travis.yml +0 -34
  439. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  440. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  441. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  442. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +0 -44
  443. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +0 -44
  444. data/ext/ffi_c/win32/stdbool.h +0 -8
  445. data/ext/ffi_c/win32/stdint.h +0 -201
  446. data/samples/sample_helper.rb +0 -6
  447. data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  448. data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  450. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  451. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  452. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  453. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  454. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  455. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  456. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  457. data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +79 -79
@@ -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
@@ -36,8 +38,10 @@
36
38
  .cfi_startproc
37
39
  # if _CALL_ELF == 2
38
40
  ffi_call_LINUX64:
41
+ # ifndef __PCREL__
39
42
  addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha
40
43
  addi %r2, %r2, .TOC.-ffi_call_LINUX64@l
44
+ # endif
41
45
  .localentry ffi_call_LINUX64, . - ffi_call_LINUX64
42
46
  # else
43
47
  .section ".opd","aw"
@@ -89,9 +93,15 @@ ffi_call_LINUX64:
89
93
  /* Call ffi_prep_args64. */
90
94
  mr %r4, %r1
91
95
  # if defined _CALL_LINUX || _CALL_ELF == 2
96
+ # ifdef __PCREL__
97
+ bl ffi_prep_args64@notoc
98
+ # else
92
99
  bl ffi_prep_args64
100
+ nop
101
+ # endif
93
102
  # else
94
103
  bl .ffi_prep_args64
104
+ nop
95
105
  # endif
96
106
 
97
107
  # if _CALL_ELF == 2
@@ -101,40 +111,70 @@ ffi_call_LINUX64:
101
111
  ld %r2, 8(%r29)
102
112
  # endif
103
113
  /* Now do the call. */
104
- /* Set up cr1 with bits 4-7 of the flags. */
105
- mtcrf 0x40, %r31
114
+ /* Set up cr1 with bits 3-7 of the flags. */
115
+ mtcrf 0xc0, %r31
106
116
 
107
117
  /* Get the address to call into CTR. */
108
118
  mtctr %r12
109
119
  /* Load all those argument registers. */
110
- ld %r3, -32-(8*8)(%r28)
111
- ld %r4, -32-(7*8)(%r28)
112
- ld %r5, -32-(6*8)(%r28)
113
- ld %r6, -32-(5*8)(%r28)
120
+ addi %r29, %r28, -32-(8*8)
121
+ ld %r3, (0*8)(%r29)
122
+ ld %r4, (1*8)(%r29)
123
+ ld %r5, (2*8)(%r29)
124
+ ld %r6, (3*8)(%r29)
114
125
  bf- 5, 1f
115
- ld %r7, -32-(4*8)(%r28)
116
- ld %r8, -32-(3*8)(%r28)
117
- ld %r9, -32-(2*8)(%r28)
118
- ld %r10, -32-(1*8)(%r28)
126
+ ld %r7, (4*8)(%r29)
127
+ ld %r8, (5*8)(%r29)
128
+ ld %r9, (6*8)(%r29)
129
+ ld %r10, (7*8)(%r29)
119
130
  1:
120
131
 
121
132
  /* Load all the FP registers. */
122
133
  bf- 6, 2f
123
- lfd %f1, -32-(21*8)(%r28)
124
- lfd %f2, -32-(20*8)(%r28)
125
- lfd %f3, -32-(19*8)(%r28)
126
- lfd %f4, -32-(18*8)(%r28)
127
- lfd %f5, -32-(17*8)(%r28)
128
- lfd %f6, -32-(16*8)(%r28)
129
- lfd %f7, -32-(15*8)(%r28)
130
- lfd %f8, -32-(14*8)(%r28)
131
- lfd %f9, -32-(13*8)(%r28)
132
- lfd %f10, -32-(12*8)(%r28)
133
- lfd %f11, -32-(11*8)(%r28)
134
- lfd %f12, -32-(10*8)(%r28)
135
- lfd %f13, -32-(9*8)(%r28)
134
+ addi %r29, %r29, -(14*8)
135
+ lfd %f1, ( 1*8)(%r29)
136
+ lfd %f2, ( 2*8)(%r29)
137
+ lfd %f3, ( 3*8)(%r29)
138
+ lfd %f4, ( 4*8)(%r29)
139
+ lfd %f5, ( 5*8)(%r29)
140
+ lfd %f6, ( 6*8)(%r29)
141
+ lfd %f7, ( 7*8)(%r29)
142
+ lfd %f8, ( 8*8)(%r29)
143
+ lfd %f9, ( 9*8)(%r29)
144
+ lfd %f10, (10*8)(%r29)
145
+ lfd %f11, (11*8)(%r29)
146
+ lfd %f12, (12*8)(%r29)
147
+ lfd %f13, (13*8)(%r29)
136
148
  2:
137
149
 
150
+ /* Load all the vector registers. */
151
+ bf- 3, 3f
152
+ addi %r29, %r29, -16
153
+ lvx %v13, 0, %r29
154
+ addi %r29, %r29, -16
155
+ lvx %v12, 0, %r29
156
+ addi %r29, %r29, -16
157
+ lvx %v11, 0, %r29
158
+ addi %r29, %r29, -16
159
+ lvx %v10, 0, %r29
160
+ addi %r29, %r29, -16
161
+ lvx %v9, 0, %r29
162
+ addi %r29, %r29, -16
163
+ lvx %v8, 0, %r29
164
+ addi %r29, %r29, -16
165
+ lvx %v7, 0, %r29
166
+ addi %r29, %r29, -16
167
+ lvx %v6, 0, %r29
168
+ addi %r29, %r29, -16
169
+ lvx %v5, 0, %r29
170
+ addi %r29, %r29, -16
171
+ lvx %v4, 0, %r29
172
+ addi %r29, %r29, -16
173
+ lvx %v3, 0, %r29
174
+ addi %r29, %r29, -16
175
+ lvx %v2, 0, %r29
176
+ 3:
177
+
138
178
  /* Make the call. */
139
179
  ld %r11, 8(%r28)
140
180
  bctrl
@@ -152,6 +192,7 @@ ffi_call_LINUX64:
152
192
  bt 31, .Lstruct_return_value
153
193
  bt 30, .Ldone_return_value
154
194
  bt 29, .Lfp_return_value
195
+ bt 28, .Lvec_return_value
155
196
  std %r3, 0(%r30)
156
197
  /* Fall through... */
157
198
 
@@ -167,12 +208,16 @@ ffi_call_LINUX64:
167
208
  ld %r31, -8(%r1)
168
209
  blr
169
210
 
211
+ .Lvec_return_value:
212
+ stvx %v2, 0, %r30
213
+ b .Ldone_return_value
214
+
170
215
  .Lfp_return_value:
171
216
  .cfi_def_cfa_register 28
172
- bf 28, .Lfloat_return_value
173
- stfd %f1, 0(%r30)
174
217
  mtcrf 0x02, %r31 /* cr6 */
175
- bf 27, .Ldone_return_value
218
+ bf 27, .Lfloat_return_value
219
+ stfd %f1, 0(%r30)
220
+ bf 26, .Ldone_return_value
176
221
  stfd %f2, 8(%r30)
177
222
  b .Ldone_return_value
178
223
  .Lfloat_return_value:
@@ -180,8 +225,9 @@ ffi_call_LINUX64:
180
225
  b .Ldone_return_value
181
226
 
182
227
  .Lstruct_return_value:
183
- bf 29, .Lsmall_struct
184
- bf 28, .Lfloat_homog_return_value
228
+ bf 29, .Lvec_homog_or_small_struct
229
+ mtcrf 0x02, %r31 /* cr6 */
230
+ bf 27, .Lfloat_homog_return_value
185
231
  stfd %f1, 0(%r30)
186
232
  stfd %f2, 8(%r30)
187
233
  stfd %f3, 16(%r30)
@@ -203,6 +249,25 @@ ffi_call_LINUX64:
203
249
  stfs %f8, 28(%r30)
204
250
  b .Ldone_return_value
205
251
 
252
+ .Lvec_homog_or_small_struct:
253
+ bf 28, .Lsmall_struct
254
+ stvx %v2, 0, %r30
255
+ addi %r30, %r30, 16
256
+ stvx %v3, 0, %r30
257
+ addi %r30, %r30, 16
258
+ stvx %v4, 0, %r30
259
+ addi %r30, %r30, 16
260
+ stvx %v5, 0, %r30
261
+ addi %r30, %r30, 16
262
+ stvx %v6, 0, %r30
263
+ addi %r30, %r30, 16
264
+ stvx %v7, 0, %r30
265
+ addi %r30, %r30, 16
266
+ stvx %v8, 0, %r30
267
+ addi %r30, %r30, 16
268
+ stvx %v9, 0, %r30
269
+ b .Ldone_return_value
270
+
206
271
  .Lsmall_struct:
207
272
  std %r3, 0(%r30)
208
273
  std %r4, 8(%r30)
@@ -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
@@ -37,8 +39,10 @@
37
39
  .cfi_startproc
38
40
  # if _CALL_ELF == 2
39
41
  ffi_closure_LINUX64:
42
+ # ifndef __PCREL__
40
43
  addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha
41
44
  addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l
45
+ # endif
42
46
  .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64
43
47
  # else
44
48
  .section ".opd","aw"
@@ -61,9 +65,15 @@ ffi_closure_LINUX64:
61
65
  # endif
62
66
 
63
67
  # if _CALL_ELF == 2
64
- # 32 byte special reg save area + 64 byte parm save area
65
- # + 64 byte retval area + 13*8 fpr save area + round to 16
66
- # define STACKFRAME 272
68
+ # ifdef __VEC__
69
+ # 32 byte special reg save area + 64 byte parm save area
70
+ # + 128 byte retval area + 13*8 fpr save area + 12*16 vec save area + round to 16
71
+ # define STACKFRAME 528
72
+ # else
73
+ # 32 byte special reg save area + 64 byte parm save area
74
+ # + 64 byte retval area + 13*8 fpr save area + round to 16
75
+ # define STACKFRAME 272
76
+ # endif
67
77
  # define PARMSAVE 32
68
78
  # define RETVAL PARMSAVE+64
69
79
  # else
@@ -143,9 +153,38 @@ ffi_closure_LINUX64:
143
153
  stfd %f12, -104+(11*8)(%r1)
144
154
  stfd %f13, -104+(12*8)(%r1)
145
155
 
146
- # load up the pointer to the saved fpr registers */
156
+ # load up the pointer to the saved fpr registers
147
157
  addi %r8, %r1, -104
148
158
 
159
+ # ifdef __VEC__
160
+ # load up the pointer to the saved vector registers
161
+ # 8 bytes padding for 16-byte alignment at -112(%r1)
162
+ addi %r9, %r8, -24
163
+ stvx %v13, 0, %r9
164
+ addi %r9, %r9, -16
165
+ stvx %v12, 0, %r9
166
+ addi %r9, %r9, -16
167
+ stvx %v11, 0, %r9
168
+ addi %r9, %r9, -16
169
+ stvx %v10, 0, %r9
170
+ addi %r9, %r9, -16
171
+ stvx %v9, 0, %r9
172
+ addi %r9, %r9, -16
173
+ stvx %v8, 0, %r9
174
+ addi %r9, %r9, -16
175
+ stvx %v7, 0, %r9
176
+ addi %r9, %r9, -16
177
+ stvx %v6, 0, %r9
178
+ addi %r9, %r9, -16
179
+ stvx %v5, 0, %r9
180
+ addi %r9, %r9, -16
181
+ stvx %v4, 0, %r9
182
+ addi %r9, %r9, -16
183
+ stvx %v3, 0, %r9
184
+ addi %r9, %r9, -16
185
+ stvx %v2, 0, %r9
186
+ # endif
187
+
149
188
  # load up the pointer to the result storage
150
189
  addi %r6, %r1, -STACKFRAME+RETVAL
151
190
 
@@ -155,11 +194,19 @@ ffi_closure_LINUX64:
155
194
 
156
195
  # make the call
157
196
  # if defined _CALL_LINUX || _CALL_ELF == 2
197
+ # ifdef __PCREL__
198
+ bl ffi_closure_helper_LINUX64@notoc
199
+ .Lret:
200
+ # else
158
201
  bl ffi_closure_helper_LINUX64
202
+ .Lret:
203
+ nop
204
+ # endif
159
205
  # else
160
206
  bl .ffi_closure_helper_LINUX64
161
- # endif
162
207
  .Lret:
208
+ nop
209
+ # endif
163
210
 
164
211
  # now r3 contains the return type
165
212
  # so use it to look up in a table
@@ -313,6 +360,16 @@ ffi_closure_LINUX64:
313
360
  .cfi_def_cfa_offset 0
314
361
  blr
315
362
  .cfi_def_cfa_offset STACKFRAME
363
+ # case FFI_V2_TYPE_VECTOR
364
+ addi %r3, %r1, RETVAL
365
+ lvx %v2, 0, %r3
366
+ mtlr %r0
367
+ b .Lfinish
368
+ # case FFI_V2_TYPE_VECTOR_HOMOG
369
+ addi %r3, %r1, RETVAL
370
+ lvx %v2, 0, %r3
371
+ addi %r3, %r3, 16
372
+ b .Lmorevector
316
373
  # case FFI_V2_TYPE_FLOAT_HOMOG
317
374
  lfs %f1, RETVAL+0(%r1)
318
375
  lfs %f2, RETVAL+4(%r1)
@@ -332,6 +389,25 @@ ffi_closure_LINUX64:
332
389
  .cfi_def_cfa_offset 0
333
390
  blr
334
391
  .cfi_def_cfa_offset STACKFRAME
392
+ .Lmorevector:
393
+ lvx %v3, 0, %r3
394
+ addi %r3, %r3, 16
395
+ lvx %v4, 0, %r3
396
+ addi %r3, %r3, 16
397
+ lvx %v5, 0, %r3
398
+ mtlr %r0
399
+ addi %r3, %r3, 16
400
+ lvx %v6, 0, %r3
401
+ addi %r3, %r3, 16
402
+ lvx %v7, 0, %r3
403
+ addi %r3, %r3, 16
404
+ lvx %v8, 0, %r3
405
+ addi %r3, %r3, 16
406
+ lvx %v9, 0, %r3
407
+ addi %r1, %r1, STACKFRAME
408
+ .cfi_def_cfa_offset 0
409
+ blr
410
+ .cfi_def_cfa_offset STACKFRAME
335
411
  .Lmorefloat:
336
412
  lfs %f4, RETVAL+12(%r1)
337
413
  mtlr %r0
@@ -396,8 +472,10 @@ ffi_closure_LINUX64:
396
472
  .cfi_startproc
397
473
  # if _CALL_ELF == 2
398
474
  ffi_go_closure_linux64:
475
+ # ifndef __PCREL__
399
476
  addis %r2, %r12, .TOC.-ffi_go_closure_linux64@ha
400
477
  addi %r2, %r2, .TOC.-ffi_go_closure_linux64@l
478
+ # endif
401
479
  .localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64
402
480
  # else
403
481
  .section ".opd","aw"
@@ -104,17 +104,16 @@ ENTRY(ffi_call_SYSV)
104
104
  bctrl
105
105
 
106
106
  /* Now, deal with the return value. */
107
- mtcrf 0x01,%r31 /* cr7 */
107
+ mtcrf 0x03,%r31 /* cr6-cr7 */
108
108
  bt- 31,L(small_struct_return_value)
109
109
  bt- 30,L(done_return_value)
110
110
  #ifndef __NO_FPRS__
111
111
  bt- 29,L(fp_return_value)
112
112
  #endif
113
113
  stw %r3,0(%r30)
114
- bf+ 28,L(done_return_value)
114
+ bf+ 27,L(done_return_value)
115
115
  stw %r4,4(%r30)
116
- mtcrf 0x02,%r31 /* cr6 */
117
- bf 27,L(done_return_value)
116
+ bf 26,L(done_return_value)
118
117
  stw %r5,8(%r30)
119
118
  stw %r6,12(%r30)
120
119
  /* Fall through... */
@@ -145,10 +144,9 @@ L(done_return_value):
145
144
  #ifndef __NO_FPRS__
146
145
  L(fp_return_value):
147
146
  .cfi_restore_state
148
- bf 28,L(float_return_value)
147
+ bf 27,L(float_return_value)
149
148
  stfd %f1,0(%r30)
150
- mtcrf 0x02,%r31 /* cr6 */
151
- bf 27,L(done_return_value)
149
+ bf 26,L(done_return_value)
152
150
  stfd %f2,8(%r30)
153
151
  b L(done_return_value)
154
152
  L(float_return_value):
@@ -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
@@ -129,7 +130,9 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
129
130
  cif->rtype = rtype;
130
131
 
131
132
  cif->flags = 0;
132
-
133
+ #if (defined(_M_ARM64) || defined(__aarch64__)) && defined(_WIN32)
134
+ cif->is_variadic = isvariadic;
135
+ #endif
133
136
  #if HAVE_LONG_DOUBLE_VARIANT
134
137
  ffi_prep_types (abi);
135
138
  #endif
@@ -199,7 +202,7 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
199
202
  bytes = 6*4;
200
203
  #endif
201
204
 
202
- bytes += STACK_ARG_SIZE((*ptr)->size);
205
+ bytes += (unsigned int)STACK_ARG_SIZE((*ptr)->size);
203
206
  }
204
207
  #endif
205
208
  }
@@ -229,7 +232,26 @@ ffi_status ffi_prep_cif_var(ffi_cif *cif,
229
232
  ffi_type *rtype,
230
233
  ffi_type **atypes)
231
234
  {
232
- 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;
233
255
  }
234
256
 
235
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);
@@ -324,18 +327,23 @@ ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsig
324
327
  }
325
328
 
326
329
  /* Low level routine for calling functions */
327
- extern void ffi_call_asm(void *stack, struct call_context *regs, void (*fn)(void)) FFI_HIDDEN;
330
+ extern void ffi_call_asm (void *stack, struct call_context *regs,
331
+ void (*fn) (void), void *closure) FFI_HIDDEN;
328
332
 
329
- void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
333
+ static void
334
+ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
335
+ void *closure)
330
336
  {
331
337
  /* this is a conservative estimate, assuming a complex return value and
332
338
  that all remaining arguments are long long / __int128 */
333
339
  size_t arg_bytes = cif->nargs <= 3 ? 0 :
334
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);
335
343
  size_t rval_bytes = 0;
336
344
  if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__)
337
345
  rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN);
338
- 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);
339
347
 
340
348
  /* the assembly code will deallocate all stack data at lower addresses
341
349
  than the argument region, so we need to allocate the frame and the
@@ -355,8 +363,9 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
355
363
 
356
364
  call_builder cb;
357
365
  cb.used_float = cb.used_integer = 0;
358
- cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes);
366
+ cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes + struct_bytes);
359
367
  cb.used_stack = (void*)alloc_base;
368
+ cb.struct_stack = (void *) (alloc_base + arg_bytes + rval_bytes);
360
369
 
361
370
  int return_by_ref = passed_by_ref(&cb, cif->rtype, 0);
362
371
  if (return_by_ref)
@@ -366,11 +375,49 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
366
375
  for (i = 0; i < cif->nargs; i++)
367
376
  marshal(&cb, cif->arg_types[i], i >= cif->riscv_nfixedargs, avalue[i]);
368
377
 
369
- ffi_call_asm((void*)alloc_base, cb.aregs, fn);
378
+ ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure);
370
379
 
371
380
  cb.used_float = cb.used_integer = 0;
372
381
  if (!return_by_ref && rvalue)
373
- 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
+ }
408
+ }
409
+
410
+ void
411
+ ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
412
+ {
413
+ ffi_call_int(cif, fn, rvalue, avalue, NULL);
414
+ }
415
+
416
+ void
417
+ ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue,
418
+ void **avalue, void *closure)
419
+ {
420
+ ffi_call_int(cif, fn, rvalue, avalue, closure);
374
421
  }
375
422
 
376
423
  extern void ffi_closure_asm(void) FFI_HIDDEN;
@@ -401,16 +448,38 @@ ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)(
401
448
  closure->fun = fun;
402
449
  closure->user_data = user_data;
403
450
 
451
+ #if !defined(__FreeBSD__)
404
452
  __builtin___clear_cache(codeloc, codeloc + FFI_TRAMPOLINE_SIZE);
453
+ #endif
405
454
 
406
455
  return FFI_OK;
407
456
  }
408
457
 
458
+ extern void ffi_go_closure_asm (void) FFI_HIDDEN;
459
+
460
+ ffi_status
461
+ ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
462
+ void (*fun) (ffi_cif *, void *, void **, void *))
463
+ {
464
+ if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI)
465
+ return FFI_BAD_ABI;
466
+
467
+ closure->tramp = (void *) ffi_go_closure_asm;
468
+ closure->cif = cif;
469
+ closure->fun = fun;
470
+
471
+ return FFI_OK;
472
+ }
473
+
409
474
  /* Called by the assembly code with aregs pointing to saved argument registers
410
475
  and stack pointing to the stacked arguments. Return values passed in
411
476
  registers will be reloaded from aregs. */
412
- void FFI_HIDDEN ffi_closure_inner(size_t *stack, call_context *aregs, ffi_closure *closure) {
413
- ffi_cif *cif = closure->cif;
477
+ void FFI_HIDDEN
478
+ ffi_closure_inner (ffi_cif *cif,
479
+ void (*fun) (ffi_cif *, void *, void **, void *),
480
+ void *user_data,
481
+ size_t *stack, call_context *aregs)
482
+ {
414
483
  void **avalue = alloca(cif->nargs * sizeof(void*));
415
484
  /* storage for arguments which will be copied by unmarshal(). We could
416
485
  theoretically avoid the copies in many cases and use at most 128 bytes
@@ -436,7 +505,7 @@ void FFI_HIDDEN ffi_closure_inner(size_t *stack, call_context *aregs, ffi_closur
436
505
  avalue[i] = unmarshal(&cb, cif->arg_types[i],
437
506
  i >= cif->riscv_nfixedargs, astorage + i*MAXCOPYARG);
438
507
 
439
- (closure->fun)(cif, rvalue, avalue, closure->user_data);
508
+ fun (cif, rvalue, avalue, user_data);
440
509
 
441
510
  if (!return_by_ref && cif->rtype->type != FFI_TYPE_VOID) {
442
511
  cb.used_integer = cb.used_float = 0;
@@ -59,6 +59,7 @@ typedef enum ffi_abi {
59
59
  /* ---- Definitions for closures ----------------------------------------- */
60
60
 
61
61
  #define FFI_CLOSURES 1
62
+ #define FFI_GO_CLOSURES 1
62
63
  #define FFI_TRAMPOLINE_SIZE 24
63
64
  #define FFI_NATIVE_RAW_API 0
64
65
  #define FFI_EXTRA_CIF_FIELDS unsigned riscv_nfixedargs; unsigned riscv_unused;