ffi 1.9.24 → 1.16.3

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 (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
@@ -0,0 +1,506 @@
1
+ /* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
2
+ Permission is hereby granted, free of charge, to any person obtaining
3
+ a copy of this software and associated documentation files (the
4
+ ``Software''), to deal in the Software without restriction, including
5
+ without limitation the rights to use, copy, modify, merge, publish,
6
+ distribute, sublicense, and/or sell copies of the Software, and to
7
+ permit persons to whom the Software is furnished to do so, subject to
8
+ the following conditions:
9
+ The above copyright notice and this permission notice shall be
10
+ included in all copies or substantial portions of the Software.
11
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
12
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
13
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
14
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
15
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
16
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
17
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
18
+
19
+ #define LIBFFI_ASM
20
+ #include <fficonfig.h>
21
+ #include <ffi.h>
22
+ #include <ffi_cfi.h>
23
+ #include "internal.h"
24
+
25
+ OPT 2 /*disable listing */
26
+ /* For some macros to add unwind information */
27
+ #include "ksarm64.h"
28
+ OPT 1 /*re-enable listing */
29
+
30
+ #define BE(X) 0
31
+ #define PTR_REG(n) x##n
32
+ #define PTR_SIZE 8
33
+
34
+ IMPORT ffi_closure_SYSV_inner
35
+ EXPORT ffi_call_SYSV
36
+ EXPORT ffi_closure_SYSV_V
37
+ EXPORT ffi_closure_SYSV
38
+ EXPORT extend_hfa_type
39
+ EXPORT compress_hfa_type
40
+ #ifdef FFI_GO_CLOSURES
41
+ EXPORT ffi_go_closure_SYSV_V
42
+ EXPORT ffi_go_closure_SYSV
43
+ #endif
44
+
45
+ TEXTAREA, ALIGN=8
46
+
47
+ /* ffi_call_SYSV
48
+ extern void ffi_call_SYSV (void *stack, void *frame,
49
+ void (*fn)(void), void *rvalue,
50
+ int flags, void *closure);
51
+ Therefore on entry we have:
52
+ x0 stack
53
+ x1 frame
54
+ x2 fn
55
+ x3 rvalue
56
+ x4 flags
57
+ x5 closure
58
+ */
59
+
60
+ NESTED_ENTRY ffi_call_SYSV_fake
61
+
62
+ /* For unwind information, Windows has to store fp and lr */
63
+ PROLOG_SAVE_REG_PAIR x29, x30, #-32!
64
+
65
+ ALTERNATE_ENTRY ffi_call_SYSV
66
+ /* Use a stack frame allocated by our caller. */
67
+ stp x29, x30, [x1]
68
+ mov x29, x1
69
+ mov sp, x0
70
+
71
+ mov x9, x2 /* save fn */
72
+ mov x8, x3 /* install structure return */
73
+ #ifdef FFI_GO_CLOSURES
74
+ /*mov x18, x5 install static chain */
75
+ #endif
76
+ stp x3, x4, [x29, #16] /* save rvalue and flags */
77
+
78
+ /* Load the vector argument passing registers, if necessary. */
79
+ tbz x4, #AARCH64_FLAG_ARG_V_BIT, ffi_call_SYSV_L1
80
+ ldp q0, q1, [sp, #0]
81
+ ldp q2, q3, [sp, #32]
82
+ ldp q4, q5, [sp, #64]
83
+ ldp q6, q7, [sp, #96]
84
+
85
+ ffi_call_SYSV_L1
86
+ /* Load the core argument passing registers, including
87
+ the structure return pointer. */
88
+ ldp x0, x1, [sp, #16*N_V_ARG_REG + 0]
89
+ ldp x2, x3, [sp, #16*N_V_ARG_REG + 16]
90
+ ldp x4, x5, [sp, #16*N_V_ARG_REG + 32]
91
+ ldp x6, x7, [sp, #16*N_V_ARG_REG + 48]
92
+
93
+ /* Deallocate the context, leaving the stacked arguments. */
94
+ add sp, sp, #CALL_CONTEXT_SIZE
95
+
96
+ blr x9 /* call fn */
97
+
98
+ ldp x3, x4, [x29, #16] /* reload rvalue and flags */
99
+
100
+ /* Partially deconstruct the stack frame. */
101
+ mov sp, x29
102
+ ldp x29, x30, [x29]
103
+
104
+ /* Save the return value as directed. */
105
+ adr x5, ffi_call_SYSV_return
106
+ and w4, w4, #AARCH64_RET_MASK
107
+ add x5, x5, x4, lsl #3
108
+ br x5
109
+
110
+ /* Note that each table entry is 2 insns, and thus 8 bytes.
111
+ For integer data, note that we're storing into ffi_arg
112
+ and therefore we want to extend to 64 bits; these types
113
+ have two consecutive entries allocated for them. */
114
+ ALIGN 4
115
+ ffi_call_SYSV_return
116
+ ret /* VOID */
117
+ nop
118
+ str x0, [x3] /* INT64 */
119
+ ret
120
+ stp x0, x1, [x3] /* INT128 */
121
+ ret
122
+ brk #1000 /* UNUSED */
123
+ ret
124
+ brk #1000 /* UNUSED */
125
+ ret
126
+ brk #1000 /* UNUSED */
127
+ ret
128
+ brk #1000 /* UNUSED */
129
+ ret
130
+ brk #1000 /* UNUSED */
131
+ ret
132
+ st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */
133
+ ret
134
+ st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */
135
+ ret
136
+ stp s0, s1, [x3] /* S2 */
137
+ ret
138
+ str s0, [x3] /* S1 */
139
+ ret
140
+ st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */
141
+ ret
142
+ st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */
143
+ ret
144
+ stp d0, d1, [x3] /* D2 */
145
+ ret
146
+ str d0, [x3] /* D1 */
147
+ ret
148
+ str q3, [x3, #48] /* Q4 */
149
+ nop
150
+ str q2, [x3, #32] /* Q3 */
151
+ nop
152
+ stp q0, q1, [x3] /* Q2 */
153
+ ret
154
+ str q0, [x3] /* Q1 */
155
+ ret
156
+ uxtb w0, w0 /* UINT8 */
157
+ str x0, [x3]
158
+ ret /* reserved */
159
+ nop
160
+ uxth w0, w0 /* UINT16 */
161
+ str x0, [x3]
162
+ ret /* reserved */
163
+ nop
164
+ mov w0, w0 /* UINT32 */
165
+ str x0, [x3]
166
+ ret /* reserved */
167
+ nop
168
+ sxtb x0, w0 /* SINT8 */
169
+ str x0, [x3]
170
+ ret /* reserved */
171
+ nop
172
+ sxth x0, w0 /* SINT16 */
173
+ str x0, [x3]
174
+ ret /* reserved */
175
+ nop
176
+ sxtw x0, w0 /* SINT32 */
177
+ str x0, [x3]
178
+ ret /* reserved */
179
+ nop
180
+
181
+
182
+ NESTED_END ffi_call_SYSV_fake
183
+
184
+
185
+ /* ffi_closure_SYSV
186
+ Closure invocation glue. This is the low level code invoked directly by
187
+ the closure trampoline to setup and call a closure.
188
+ On entry x17 points to a struct ffi_closure, x16 has been clobbered
189
+ all other registers are preserved.
190
+ We allocate a call context and save the argument passing registers,
191
+ then invoked the generic C ffi_closure_SYSV_inner() function to do all
192
+ the real work, on return we load the result passing registers back from
193
+ the call context.
194
+ */
195
+
196
+ #define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64)
197
+
198
+ NESTED_ENTRY ffi_closure_SYSV_V
199
+ PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
200
+
201
+ /* Save the argument passing vector registers. */
202
+ stp q0, q1, [sp, #16 + 0]
203
+ stp q2, q3, [sp, #16 + 32]
204
+ stp q4, q5, [sp, #16 + 64]
205
+ stp q6, q7, [sp, #16 + 96]
206
+
207
+ b ffi_closure_SYSV_save_argument
208
+ NESTED_END ffi_closure_SYSV_V
209
+
210
+ NESTED_ENTRY ffi_closure_SYSV
211
+ PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
212
+
213
+ ffi_closure_SYSV_save_argument
214
+ /* Save the argument passing core registers. */
215
+ stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0]
216
+ stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16]
217
+ stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32]
218
+ stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48]
219
+
220
+ /* Load ffi_closure_inner arguments. */
221
+ ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */
222
+ ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */
223
+
224
+ do_closure
225
+ add x3, sp, #16 /* load context */
226
+ add x4, sp, #ffi_closure_SYSV_FS /* load stack */
227
+ add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */
228
+ mov x6, x8 /* load struct_rval */
229
+
230
+ bl ffi_closure_SYSV_inner
231
+
232
+ /* Load the return value as directed. */
233
+ adr x1, ffi_closure_SYSV_return_base
234
+ and w0, w0, #AARCH64_RET_MASK
235
+ add x1, x1, x0, lsl #3
236
+ add x3, sp, #16+CALL_CONTEXT_SIZE
237
+ br x1
238
+
239
+ /* Note that each table entry is 2 insns, and thus 8 bytes. */
240
+ ALIGN 8
241
+ ffi_closure_SYSV_return_base
242
+ b ffi_closure_SYSV_epilog /* VOID */
243
+ nop
244
+ ldr x0, [x3] /* INT64 */
245
+ b ffi_closure_SYSV_epilog
246
+ ldp x0, x1, [x3] /* INT128 */
247
+ b ffi_closure_SYSV_epilog
248
+ brk #1000 /* UNUSED */
249
+ nop
250
+ brk #1000 /* UNUSED */
251
+ nop
252
+ brk #1000 /* UNUSED */
253
+ nop
254
+ brk #1000 /* UNUSED */
255
+ nop
256
+ brk #1000 /* UNUSED */
257
+ nop
258
+ ldr s3, [x3, #12] /* S4 */
259
+ nop
260
+ ldr s2, [x3, #8] /* S3 */
261
+ nop
262
+ ldp s0, s1, [x3] /* S2 */
263
+ b ffi_closure_SYSV_epilog
264
+ ldr s0, [x3] /* S1 */
265
+ b ffi_closure_SYSV_epilog
266
+ ldr d3, [x3, #24] /* D4 */
267
+ nop
268
+ ldr d2, [x3, #16] /* D3 */
269
+ nop
270
+ ldp d0, d1, [x3] /* D2 */
271
+ b ffi_closure_SYSV_epilog
272
+ ldr d0, [x3] /* D1 */
273
+ b ffi_closure_SYSV_epilog
274
+ ldr q3, [x3, #48] /* Q4 */
275
+ nop
276
+ ldr q2, [x3, #32] /* Q3 */
277
+ nop
278
+ ldp q0, q1, [x3] /* Q2 */
279
+ b ffi_closure_SYSV_epilog
280
+ ldr q0, [x3] /* Q1 */
281
+ b ffi_closure_SYSV_epilog
282
+ ldrb w0, [x3, #BE(7)] /* UINT8 */
283
+ b ffi_closure_SYSV_epilog
284
+ brk #1000 /* reserved */
285
+ nop
286
+ ldrh w0, [x3, #BE(6)] /* UINT16 */
287
+ b ffi_closure_SYSV_epilog
288
+ brk #1000 /* reserved */
289
+ nop
290
+ ldr w0, [x3, #BE(4)] /* UINT32 */
291
+ b ffi_closure_SYSV_epilog
292
+ brk #1000 /* reserved */
293
+ nop
294
+ ldrsb x0, [x3, #BE(7)] /* SINT8 */
295
+ b ffi_closure_SYSV_epilog
296
+ brk #1000 /* reserved */
297
+ nop
298
+ ldrsh x0, [x3, #BE(6)] /* SINT16 */
299
+ b ffi_closure_SYSV_epilog
300
+ brk #1000 /* reserved */
301
+ nop
302
+ ldrsw x0, [x3, #BE(4)] /* SINT32 */
303
+ nop
304
+ /* reserved */
305
+
306
+ ffi_closure_SYSV_epilog
307
+ EPILOG_RESTORE_REG_PAIR x29, x30, #ffi_closure_SYSV_FS!
308
+ EPILOG_RETURN
309
+ NESTED_END ffi_closure_SYSV
310
+
311
+
312
+ #ifdef FFI_GO_CLOSURES
313
+ NESTED_ENTRY ffi_go_closure_SYSV_V
314
+ PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
315
+
316
+ /* Save the argument passing vector registers. */
317
+ stp q0, q1, [sp, #16 + 0]
318
+ stp q2, q3, [sp, #16 + 32]
319
+ stp q4, q5, [sp, #16 + 64]
320
+ stp q6, q7, [sp, #16 + 96]
321
+ b ffi_go_closure_SYSV_save_argument
322
+ NESTED_END ffi_go_closure_SYSV_V
323
+
324
+ NESTED_ENTRY ffi_go_closure_SYSV
325
+ PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
326
+
327
+ ffi_go_closure_SYSV_save_argument
328
+ /* Save the argument passing core registers. */
329
+ stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0]
330
+ stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16]
331
+ stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32]
332
+ stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48]
333
+
334
+ /* Load ffi_closure_inner arguments. */
335
+ ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */
336
+ mov x2, x18 /* load user_data */
337
+ b do_closure
338
+ NESTED_END ffi_go_closure_SYSV
339
+
340
+ #endif /* FFI_GO_CLOSURES */
341
+
342
+
343
+ /* void extend_hfa_type (void *dest, void *src, int h) */
344
+
345
+ LEAF_ENTRY extend_hfa_type
346
+
347
+ adr x3, extend_hfa_type_jump_base
348
+ and w2, w2, #AARCH64_RET_MASK
349
+ sub x2, x2, #AARCH64_RET_S4
350
+ add x3, x3, x2, lsl #4
351
+ br x3
352
+
353
+ ALIGN 4
354
+ extend_hfa_type_jump_base
355
+ ldp s16, s17, [x1] /* S4 */
356
+ ldp s18, s19, [x1, #8]
357
+ b extend_hfa_type_store_4
358
+ nop
359
+
360
+ ldp s16, s17, [x1] /* S3 */
361
+ ldr s18, [x1, #8]
362
+ b extend_hfa_type_store_3
363
+ nop
364
+
365
+ ldp s16, s17, [x1] /* S2 */
366
+ b extend_hfa_type_store_2
367
+ nop
368
+ nop
369
+
370
+ ldr s16, [x1] /* S1 */
371
+ b extend_hfa_type_store_1
372
+ nop
373
+ nop
374
+
375
+ ldp d16, d17, [x1] /* D4 */
376
+ ldp d18, d19, [x1, #16]
377
+ b extend_hfa_type_store_4
378
+ nop
379
+
380
+ ldp d16, d17, [x1] /* D3 */
381
+ ldr d18, [x1, #16]
382
+ b extend_hfa_type_store_3
383
+ nop
384
+
385
+ ldp d16, d17, [x1] /* D2 */
386
+ b extend_hfa_type_store_2
387
+ nop
388
+ nop
389
+
390
+ ldr d16, [x1] /* D1 */
391
+ b extend_hfa_type_store_1
392
+ nop
393
+ nop
394
+
395
+ ldp q16, q17, [x1] /* Q4 */
396
+ ldp q18, q19, [x1, #16]
397
+ b extend_hfa_type_store_4
398
+ nop
399
+
400
+ ldp q16, q17, [x1] /* Q3 */
401
+ ldr q18, [x1, #16]
402
+ b extend_hfa_type_store_3
403
+ nop
404
+
405
+ ldp q16, q17, [x1] /* Q2 */
406
+ b extend_hfa_type_store_2
407
+ nop
408
+ nop
409
+
410
+ ldr q16, [x1] /* Q1 */
411
+ b extend_hfa_type_store_1
412
+
413
+ extend_hfa_type_store_4
414
+ str q19, [x0, #48]
415
+ extend_hfa_type_store_3
416
+ str q18, [x0, #32]
417
+ extend_hfa_type_store_2
418
+ str q17, [x0, #16]
419
+ extend_hfa_type_store_1
420
+ str q16, [x0]
421
+ ret
422
+
423
+ LEAF_END extend_hfa_type
424
+
425
+
426
+ /* void compress_hfa_type (void *dest, void *reg, int h) */
427
+
428
+ LEAF_ENTRY compress_hfa_type
429
+
430
+ adr x3, compress_hfa_type_jump_base
431
+ and w2, w2, #AARCH64_RET_MASK
432
+ sub x2, x2, #AARCH64_RET_S4
433
+ add x3, x3, x2, lsl #4
434
+ br x3
435
+
436
+ ALIGN 4
437
+ compress_hfa_type_jump_base
438
+ ldp q16, q17, [x1] /* S4 */
439
+ ldp q18, q19, [x1, #32]
440
+ st4 { v16.s, v17.s, v18.s, v19.s }[0], [x0]
441
+ ret
442
+
443
+ ldp q16, q17, [x1] /* S3 */
444
+ ldr q18, [x1, #32]
445
+ st3 { v16.s, v17.s, v18.s }[0], [x0]
446
+ ret
447
+
448
+ ldp q16, q17, [x1] /* S2 */
449
+ st2 { v16.s, v17.s }[0], [x0]
450
+ ret
451
+ nop
452
+
453
+ ldr q16, [x1] /* S1 */
454
+ st1 { v16.s }[0], [x0]
455
+ ret
456
+ nop
457
+
458
+ ldp q16, q17, [x1] /* D4 */
459
+ ldp q18, q19, [x1, #32]
460
+ st4 { v16.d, v17.d, v18.d, v19.d }[0], [x0]
461
+ ret
462
+
463
+ ldp q16, q17, [x1] /* D3 */
464
+ ldr q18, [x1, #32]
465
+ st3 { v16.d, v17.d, v18.d }[0], [x0]
466
+ ret
467
+
468
+ ldp q16, q17, [x1] /* D2 */
469
+ st2 { v16.d, v17.d }[0], [x0]
470
+ ret
471
+ nop
472
+
473
+ ldr q16, [x1] /* D1 */
474
+ st1 { v16.d }[0], [x0]
475
+ ret
476
+ nop
477
+
478
+ ldp q16, q17, [x1] /* Q4 */
479
+ ldp q18, q19, [x1, #32]
480
+ b compress_hfa_type_store_q4
481
+ nop
482
+
483
+ ldp q16, q17, [x1] /* Q3 */
484
+ ldr q18, [x1, #32]
485
+ b compress_hfa_type_store_q3
486
+ nop
487
+
488
+ ldp q16, q17, [x1] /* Q2 */
489
+ stp q16, q17, [x0]
490
+ ret
491
+ nop
492
+
493
+ ldr q16, [x1] /* Q1 */
494
+ str q16, [x0]
495
+ ret
496
+
497
+ compress_hfa_type_store_q4
498
+ str q19, [x0, #48]
499
+ compress_hfa_type_store_q3
500
+ str q18, [x0, #32]
501
+ stp q16, q17, [x0]
502
+ ret
503
+
504
+ LEAF_END compress_hfa_type
505
+
506
+ END