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
@@ -0,0 +1,614 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffi64.c - (c) 2022 John David Anglin <dave.anglin@bell.net>
3
+
4
+ HPPA Foreign Function Interface
5
+ PA 64-Bit ABI support
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ ``Software''), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included
16
+ in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
26
+ ----------------------------------------------------------------------- */
27
+
28
+ #include <ffi.h>
29
+ #include <ffi_common.h>
30
+
31
+ #include <stdlib.h>
32
+ #include <stdio.h>
33
+
34
+ #define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1))
35
+
36
+ #define FIRST_ARG_SLOT 0
37
+ #define DEBUG_LEVEL 0
38
+
39
+ #define fldw(addr, fpreg) \
40
+ __asm__ volatile ("fldw 4(%0), %%" #fpreg "R" : : "r"(addr) : #fpreg)
41
+ #define fstw(fpreg, addr) \
42
+ __asm__ volatile ("fstw %%" #fpreg "R, 4(%0)" : : "r"(addr))
43
+ #define fldd(addr, fpreg) \
44
+ __asm__ volatile ("fldd 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg)
45
+ #define fstd(fpreg, addr) \
46
+ __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr))
47
+
48
+ #define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0)
49
+
50
+ static inline int ffi_struct_type(ffi_type *t)
51
+ {
52
+ int sz = t->size;
53
+
54
+ /* Small structure results are returned in registers 28 and 29,
55
+ larger ones are in a buffer allocated by the callee. The
56
+ address of the buffer is passed in r28. The buffer is supposed
57
+ to be aligned on a 16-byte boundary. Register return values are
58
+ padded on the right. The pad bits on the right are undefined. */
59
+
60
+ if (sz <= 16)
61
+ return -sz;
62
+ else
63
+ return FFI_TYPE_STRUCT;
64
+ }
65
+
66
+ /* PA has a downward growing stack, which looks like this. Stack
67
+ arguments are offset from the argument ponter (AP) in r29.
68
+
69
+ Offset
70
+ [ Fixed args ]
71
+ AP-64 arg word 0 (r26, fr4)
72
+ AP-56 arg word 1 (r25, fr5)
73
+ AP-48 arg word 2 (r24, fr6)
74
+ AP-40 arg word 3 (r23, fr7)
75
+ AP-32 arg word 4 (r22, fr8)
76
+ AP-24 arg word 5 (r21, fr9)
77
+ AP-16 arg word 6 (r20, fr10)
78
+ AP-8 arg word 7 (r19, fr11)
79
+ [ Variable args; AP = SP-16 if there are no variable args ]
80
+ AP stack arg 0
81
+ AP+8 stack arg 1
82
+ ...
83
+ [ Frame marker ]
84
+ SP-16 RP
85
+ SP-8 previous SP
86
+
87
+ The first eight argument words on the stack are reserved for use by
88
+ the callee. Instead, the general and floating registers replace
89
+ the first four argument slots. Non FP arguments are passed solely
90
+ in the general registers. Single and double FP arguments are passed
91
+ in both general and floating registers when using libffi.
92
+
93
+ The registers are allocated in the same manner as stack slots.
94
+ This allows the callee to save its arguments on the stack if
95
+ necessary:
96
+
97
+ arg word 0 -> gr26 or fr4L or fr4R
98
+ arg word 1 -> gr25 or fr5L or fr5R
99
+ arg word 2 -> gr24 or fr6L or fr6R
100
+ arg word 3 -> gr23 or fr7L or fr7R
101
+ ...
102
+
103
+ Single Single-precision floating-point parameters, when passed in
104
+ floating-point registers, are passed in the right halves of the
105
+ floating point registers; the left halves are unused.
106
+
107
+ Quad-precision floating-point parameters within the first 64 bytes of
108
+ the parameter list are always passed in general registers.
109
+
110
+ The rest of the arguments are passed on the stack starting at AP.
111
+
112
+ This means we can have holes either in the register allocation,
113
+ or in the stack. */
114
+
115
+ /* ffi_prep_args is called by the assembly routine once stack space
116
+ has been allocated for the function's arguments
117
+
118
+ The following code will put everything into the stack frame
119
+ (which was allocated by the asm routine), and on return
120
+ the asm routine will load the arguments that should be
121
+ passed by register into the appropriate registers
122
+
123
+ NOTE: We load floating point args in this function... that means we
124
+ assume gcc will not mess with fp regs in here. */
125
+
126
+ void ffi_prep_args_pa64(UINT64 *stack, extended_cif *ecif, unsigned bytes)
127
+ {
128
+ register unsigned int i;
129
+ register ffi_type **p_arg;
130
+ register void **p_argv;
131
+ unsigned int slot = FIRST_ARG_SLOT;
132
+ size_t len;
133
+
134
+ debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack,
135
+ ecif, bytes);
136
+
137
+ p_arg = ecif->cif->arg_types;
138
+ p_argv = ecif->avalue;
139
+
140
+ for (i = 0; i < ecif->cif->nargs; i++)
141
+ {
142
+ int type = (*p_arg)->type;
143
+
144
+ len = (*p_arg)->size;
145
+
146
+ switch (type)
147
+ {
148
+ case FFI_TYPE_SINT8:
149
+ *(SINT64 *)(stack + slot) = *(SINT8 *)(*p_argv);
150
+ break;
151
+
152
+ case FFI_TYPE_UINT8:
153
+ *(UINT64 *)(stack + slot) = *(UINT8 *)(*p_argv);
154
+ break;
155
+
156
+ case FFI_TYPE_SINT16:
157
+ *(SINT64 *)(stack + slot) = *(SINT16 *)(*p_argv);
158
+ break;
159
+
160
+ case FFI_TYPE_UINT16:
161
+ *(UINT64 *)(stack + slot) = *(UINT16 *)(*p_argv);
162
+ break;
163
+
164
+ case FFI_TYPE_SINT32:
165
+ *(SINT64 *)(stack + slot) = *(SINT32 *)(*p_argv);
166
+ break;
167
+
168
+ case FFI_TYPE_UINT32:
169
+ *(UINT64 *)(stack + slot) = *(UINT32 *)(*p_argv);
170
+ break;
171
+
172
+ case FFI_TYPE_UINT64:
173
+ case FFI_TYPE_SINT64:
174
+ case FFI_TYPE_POINTER:
175
+ debug(3, "Storing UINT64 %lu in slot %u\n", *(UINT64 *)(*p_argv),
176
+ slot);
177
+ *(UINT64 *)(stack + slot) = *(UINT64 *)(*p_argv);
178
+ break;
179
+
180
+ case FFI_TYPE_FLOAT:
181
+ /* First 8 args go in fr4L - fr11L. */
182
+ debug(3, "Storing UINT32(float) in slot %u\n", slot);
183
+ *(UINT64 *)(stack + slot) = *(UINT32 *)(*p_argv);
184
+ switch (slot - FIRST_ARG_SLOT)
185
+ {
186
+ /* First 4 args go in fr4L - fr7L. */
187
+ case 0: fldw(stack + slot, fr4); break;
188
+ case 1: fldw(stack + slot, fr5); break;
189
+ case 2: fldw(stack + slot, fr6); break;
190
+ case 3: fldw(stack + slot, fr7); break;
191
+ case 4: fldw(stack + slot, fr8); break;
192
+ case 5: fldw(stack + slot, fr9); break;
193
+ case 6: fldw(stack + slot, fr10); break;
194
+ case 7: fldw(stack + slot, fr11); break;
195
+ }
196
+ break;
197
+
198
+ case FFI_TYPE_DOUBLE:
199
+ debug(3, "Storing UINT64(double) at slot %u\n", slot);
200
+ *(UINT64 *)(stack + slot) = *(UINT64 *)(*p_argv);
201
+ switch (slot - FIRST_ARG_SLOT)
202
+ {
203
+ /* First 8 args go in fr4 to fr11. */
204
+ case 0: fldd(stack + slot, fr4); break;
205
+ case 1: fldd(stack + slot, fr5); break;
206
+ case 2: fldd(stack + slot, fr6); break;
207
+ case 3: fldd(stack + slot, fr7); break;
208
+ case 4: fldd(stack + slot, fr8); break;
209
+ case 5: fldd(stack + slot, fr9); break;
210
+ case 6: fldd(stack + slot, fr10); break;
211
+ case 7: fldd(stack + slot, fr11); break;
212
+ }
213
+ break;
214
+
215
+ #ifdef PA64_HPUX
216
+ case FFI_TYPE_LONGDOUBLE:
217
+ /* Align slot to a 16-byte boundary. */
218
+ slot += (slot & 1);
219
+ *(UINT64 *)(stack + slot) = *(UINT64 *)(*p_argv);
220
+ *(UINT64 *)(stack + slot + 1) = *(UINT64 *)(*p_argv + 8);
221
+ break;
222
+ #endif
223
+
224
+ case FFI_TYPE_STRUCT:
225
+ /* Structs larger than 8 bytes are aligned on a 16-byte boundary. */
226
+ if (len > 8)
227
+ slot += (slot & 1);
228
+ memcpy((char *)(stack + slot), (char *)*p_argv, len);
229
+ break;
230
+
231
+ default:
232
+ FFI_ASSERT(0);
233
+ }
234
+
235
+ slot += ROUND_UP (len, 8) >> 3;
236
+ p_arg++;
237
+ p_argv++;
238
+ }
239
+
240
+ FFI_ASSERT(slot * 8 <= bytes);
241
+
242
+ return;
243
+ }
244
+
245
+ static void ffi_size_stack_pa64(ffi_cif *cif)
246
+ {
247
+ ffi_type **ptr;
248
+ int i;
249
+ int z = 0; /* # stack slots */
250
+
251
+ for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++)
252
+ {
253
+ int type = (*ptr)->type;
254
+ int size = (*ptr)->size;
255
+
256
+ switch (type)
257
+ {
258
+ #ifdef PA64_HPUX
259
+ case FFI_TYPE_LONGDOUBLE:
260
+ z += 2 + (z & 1);
261
+ break;
262
+ #endif
263
+
264
+ case FFI_TYPE_STRUCT:
265
+ if (size > 8)
266
+ z += (z & 1);
267
+ z += ROUND_UP (size, 8) >> 3;
268
+ break;
269
+
270
+ default: /* 64-bit values */
271
+ z++;
272
+ }
273
+ }
274
+
275
+ /* We need a minimum of 8 argument slots. Stack must be 16-byte
276
+ aligned. */
277
+ if (z <= 8)
278
+ z = 8;
279
+ else
280
+ z += (z & 1);
281
+
282
+ /* Add 16 bytes for frame marker. */
283
+ cif->bytes = z * 8 + 64;
284
+ debug(3, "Calculated stack size is %u bytes\n", cif->bytes);
285
+ }
286
+
287
+ /* Perform machine dependent cif processing. */
288
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
289
+ {
290
+ /* Set the return type flag for jump table. */
291
+ switch (cif->rtype->type)
292
+ {
293
+ case FFI_TYPE_COMPLEX:
294
+ case FFI_TYPE_STRUCT:
295
+ /* For the return type we have to check the size of the structures.
296
+ If the size is smaller or equal 8 bytes, the result is given back
297
+ in one register. If the size is smaller or equal 16 bytes than we
298
+ return the result in two registers. If the size is bigger than
299
+ 16 bytes, the return is in a buffer allocated by the caller. */
300
+ cif->flags = ffi_struct_type(cif->rtype);
301
+ break;
302
+
303
+ default:
304
+ cif->flags = (unsigned) cif->rtype->type;
305
+ break;
306
+ }
307
+
308
+ /* Lucky us, because of the unique PA ABI we get to do our
309
+ own stack sizing. */
310
+ switch (cif->abi)
311
+ {
312
+ case FFI_PA64:
313
+ ffi_size_stack_pa64(cif);
314
+ break;
315
+
316
+ default:
317
+ FFI_ASSERT(0);
318
+ break;
319
+ }
320
+
321
+ return FFI_OK;
322
+ }
323
+
324
+ extern void ffi_call_pa64(void (*)(UINT64 *, extended_cif *, unsigned),
325
+ extended_cif *, unsigned, unsigned, unsigned *,
326
+ void (*fn)(void));
327
+
328
+ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
329
+ {
330
+ extended_cif ecif;
331
+
332
+ ecif.cif = cif;
333
+ ecif.avalue = avalue;
334
+
335
+ /* If the return value is a struct and we don't have a return
336
+ value address then we need to make one. */
337
+
338
+ if (rvalue == NULL
339
+ && (cif->rtype->type == FFI_TYPE_STRUCT
340
+ || cif->rtype->type == FFI_TYPE_COMPLEX)
341
+ && cif->rtype->size > 16)
342
+ ecif.rvalue = alloca(ROUND_UP (cif->rtype->size, 16));
343
+ else
344
+ ecif.rvalue = rvalue;
345
+
346
+
347
+ switch (cif->abi)
348
+ {
349
+ case FFI_PA64:
350
+ debug(3, "Calling ffi_call_pa64: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn);
351
+ ffi_call_pa64(ffi_prep_args_pa64, &ecif, cif->bytes,
352
+ cif->flags, ecif.rvalue, fn);
353
+ break;
354
+
355
+ default:
356
+ FFI_ASSERT(0);
357
+ break;
358
+ }
359
+ }
360
+
361
+ #if FFI_CLOSURES
362
+ /* This is more-or-less an inverse of ffi_call -- we have arguments on
363
+ the stack, and we need to fill them into a cif structure and invoke
364
+ the user function. This really ought to be in asm to make sure
365
+ the compiler doesn't do things we don't expect. */
366
+ ffi_status ffi_closure_inner_pa64(ffi_closure *closure, UINT64 *stack)
367
+ {
368
+ ffi_cif *cif;
369
+ void **avalue;
370
+ void *rvalue;
371
+ /* Functions can return up to 128-bits in registers. Return address
372
+ must be double word aligned. */
373
+ union { long double rld; UINT64 ret[2]; } u;
374
+ ffi_type **p_arg;
375
+ char *tmp;
376
+ int i, avn;
377
+ unsigned int slot = FIRST_ARG_SLOT;
378
+ register UINT64 r28 asm("r28");
379
+
380
+ cif = closure->cif;
381
+
382
+ /* If returning via structure, callee will write to our pointer. */
383
+ if (cif->flags == FFI_TYPE_STRUCT)
384
+ rvalue = (void *)r28;
385
+ else
386
+ rvalue = &u;
387
+
388
+ avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG);
389
+ avn = cif->nargs;
390
+ p_arg = cif->arg_types;
391
+
392
+ for (i = 0; i < avn; i++)
393
+ {
394
+ int type = (*p_arg)->type;
395
+
396
+ switch (type)
397
+ {
398
+ case FFI_TYPE_SINT8:
399
+ case FFI_TYPE_UINT8:
400
+ avalue[i] = (void *)(stack + slot) + 7;
401
+ break;
402
+
403
+ case FFI_TYPE_SINT16:
404
+ case FFI_TYPE_UINT16:
405
+ avalue[i] = (void *)(stack + slot) + 6;
406
+ break;
407
+
408
+ case FFI_TYPE_SINT32:
409
+ case FFI_TYPE_UINT32:
410
+ avalue[i] = (void *)(stack + slot) + 4;
411
+ break;
412
+
413
+ case FFI_TYPE_POINTER:
414
+ case FFI_TYPE_SINT64:
415
+ case FFI_TYPE_UINT64:
416
+ avalue[i] = (void *)(stack + slot);
417
+ break;
418
+
419
+ case FFI_TYPE_FLOAT:
420
+ /* The closure call is indirect. In Linux, floating point
421
+ arguments in indirect calls with a prototype are passed
422
+ in the floating point registers instead of the general
423
+ registers. So, we need to replace what was previously
424
+ stored in the current slot with the value in the
425
+ corresponding floating point register. */
426
+ switch (slot + FIRST_ARG_SLOT)
427
+ {
428
+ case 0: fstw(fr4, (void *)(stack + slot)); break;
429
+ case 1: fstw(fr5, (void *)(stack + slot)); break;
430
+ case 2: fstw(fr6, (void *)(stack + slot)); break;
431
+ case 3: fstw(fr7, (void *)(stack + slot)); break;
432
+ case 4: fstw(fr8, (void *)(stack + slot)); break;
433
+ case 5: fstw(fr9, (void *)(stack + slot)); break;
434
+ case 6: fstw(fr10, (void *)(stack + slot)); break;
435
+ case 7: fstw(fr11, (void *)(stack + slot)); break;
436
+ }
437
+ avalue[i] = (void *)(stack + slot) + 4;
438
+ break;
439
+
440
+ case FFI_TYPE_DOUBLE:
441
+ /* See previous comment for FFI_TYPE_FLOAT. */
442
+ switch (slot + FIRST_ARG_SLOT)
443
+ {
444
+ case 0: fstd(fr4, (void *)(stack + slot)); break;
445
+ case 1: fstd(fr5, (void *)(stack + slot)); break;
446
+ case 2: fstd(fr6, (void *)(stack + slot)); break;
447
+ case 3: fstd(fr7, (void *)(stack + slot)); break;
448
+ case 4: fstd(fr8, (void *)(stack + slot)); break;
449
+ case 5: fstd(fr9, (void *)(stack + slot)); break;
450
+ case 6: fstd(fr10, (void *)(stack + slot)); break;
451
+ case 7: fstd(fr11, (void *)(stack + slot)); break;
452
+ }
453
+ avalue[i] = (void *)(stack + slot);
454
+ break;
455
+
456
+ #ifdef PA64_HPUX
457
+ case FFI_TYPE_LONGDOUBLE:
458
+ /* Long doubles are treated like a big structure. */
459
+ slot += (slot & 1);
460
+ avalue[i] = (void *)(stack + slot);
461
+ break;
462
+ #endif
463
+
464
+ case FFI_TYPE_STRUCT:
465
+ /* All structs are passed in registers. Structs larger
466
+ than 8 bytes are aligned on a 16-byte boundary. */
467
+ if((*p_arg)->size > 8)
468
+ slot += (slot & 1);
469
+ avalue[i] = (void *) (stack + slot);
470
+ break;
471
+
472
+ default:
473
+ FFI_ASSERT(0);
474
+ }
475
+
476
+ slot += (ROUND_UP ((*p_arg)->size, 8) >> 3);
477
+ p_arg++;
478
+ }
479
+
480
+ /* Invoke the closure. */
481
+ (closure->fun) (cif, rvalue, avalue, closure->user_data);
482
+
483
+ debug(3, "after calling function, ret[0] = %16lx, ret[1] = %16lx\n", u.ret[0],
484
+ u.ret[1]);
485
+
486
+ /* Store the result using the lower 2 bytes of the flags. */
487
+ switch (cif->flags)
488
+ {
489
+ case FFI_TYPE_UINT8:
490
+ *(stack + FIRST_ARG_SLOT) = (UINT8)u.ret[0];
491
+ break;
492
+ case FFI_TYPE_SINT8:
493
+ *(stack + FIRST_ARG_SLOT) = (SINT8)u.ret[0];
494
+ break;
495
+ case FFI_TYPE_UINT16:
496
+ *(stack + FIRST_ARG_SLOT) = (UINT16)u.ret[0];
497
+ break;
498
+ case FFI_TYPE_SINT16:
499
+ *(stack + FIRST_ARG_SLOT) = (SINT16)u.ret[0];
500
+ break;
501
+ case FFI_TYPE_INT:
502
+ case FFI_TYPE_SINT32:
503
+ *(stack + FIRST_ARG_SLOT) = (SINT32)u.ret[0];
504
+ break;
505
+ case FFI_TYPE_UINT32:
506
+ *(stack - FIRST_ARG_SLOT) = (UINT32)u.ret[0];
507
+ break;
508
+ case FFI_TYPE_SINT64:
509
+ case FFI_TYPE_UINT64:
510
+ case FFI_TYPE_POINTER:
511
+ *(stack - FIRST_ARG_SLOT) = u.ret[0];
512
+ break;
513
+
514
+ case FFI_TYPE_LONGDOUBLE:
515
+ *(stack + FIRST_ARG_SLOT) = u.ret[0];
516
+ *(stack + FIRST_ARG_SLOT + 1) = u.ret[1];
517
+ break;
518
+
519
+ case FFI_TYPE_DOUBLE:
520
+ fldd(rvalue, fr4);
521
+ break;
522
+
523
+ case FFI_TYPE_FLOAT:
524
+ /* Adjust for address adjustment in fldw macro. */
525
+ fldw(rvalue - 4, fr4);
526
+ break;
527
+
528
+ case FFI_TYPE_STRUCT:
529
+ /* Don't need a return value, done by caller. */
530
+ break;
531
+
532
+ case -1:
533
+ case -2:
534
+ case -3:
535
+ case -4:
536
+ case -5:
537
+ case -6:
538
+ case -7:
539
+ case -8:
540
+ case -9:
541
+ case -10:
542
+ case -11:
543
+ case -12:
544
+ case -13:
545
+ case -14:
546
+ case -15:
547
+ case -16:
548
+ tmp = (void*)(stack + FIRST_ARG_SLOT);
549
+ memcpy((void*)tmp, &u, cif->rtype->size);
550
+ break;
551
+
552
+ case FFI_TYPE_VOID:
553
+ break;
554
+
555
+ default:
556
+ debug(0, "assert with cif->flags: %d\n",cif->flags);
557
+ FFI_ASSERT(0);
558
+ break;
559
+ }
560
+ return FFI_OK;
561
+ }
562
+
563
+ /* Fill in a closure to refer to the specified fun and user_data.
564
+ cif specifies the argument and result types for fun.
565
+ The cif must already be prep'ed. */
566
+
567
+ extern void ffi_closure_pa64(void);
568
+
569
+ ffi_status
570
+ ffi_prep_closure_loc (ffi_closure* closure,
571
+ ffi_cif* cif,
572
+ void (*fun)(ffi_cif*,void*,void**,void*),
573
+ void *user_data,
574
+ void *codeloc)
575
+ {
576
+ /* The layout of a function descriptor. */
577
+ struct pa64_fd
578
+ {
579
+ UINT64 tmp1;
580
+ UINT64 tmp2;
581
+ UINT64 code_pointer;
582
+ UINT64 gp;
583
+ };
584
+
585
+ struct ffi_pa64_trampoline_struct
586
+ {
587
+ UINT64 real_gp; /* Real gp value. */
588
+ UINT64 tmp2;
589
+ UINT64 code_pointer; /* Pointer to ffi_closure_unix. */
590
+ UINT64 fake_gp; /* Pointer to closure, installed as gp. */
591
+ };
592
+
593
+ struct ffi_pa64_trampoline_struct *tramp;
594
+ struct pa64_fd *fd;
595
+
596
+ if (cif->abi != FFI_PA64)
597
+ return FFI_BAD_ABI;
598
+
599
+ /* Get function descriptor address for ffi_closure_pa64. */
600
+ fd = (struct pa64_fd *)((UINT64)ffi_closure_pa64);
601
+
602
+ /* Setup trampoline. */
603
+ tramp = (struct ffi_pa64_trampoline_struct *)closure->tramp;
604
+ tramp->code_pointer = fd->code_pointer;
605
+ tramp->fake_gp = (UINT64)codeloc;
606
+ tramp->real_gp = fd->gp;
607
+
608
+ closure->cif = cif;
609
+ closure->user_data = user_data;
610
+ closure->fun = fun;
611
+
612
+ return FFI_OK;
613
+ }
614
+ #endif
@@ -54,7 +54,6 @@ typedef enum ffi_abi {
54
54
  #endif
55
55
 
56
56
  #ifdef PA64_HPUX
57
- #error "PA64_HPUX FFI is not yet implemented"
58
57
  FFI_PA64,
59
58
  FFI_LAST_ABI,
60
59
  FFI_DEFAULT_ABI = FFI_PA64
@@ -68,18 +67,28 @@ typedef enum ffi_abi {
68
67
 
69
68
  #define FFI_CLOSURES 1
70
69
  #define FFI_NATIVE_RAW_API 0
71
-
72
- #ifdef PA_LINUX
70
+ #if defined(PA64_HPUX)
73
71
  #define FFI_TRAMPOLINE_SIZE 32
74
72
  #else
75
- #define FFI_TRAMPOLINE_SIZE 40
73
+ #define FFI_TRAMPOLINE_SIZE 12
74
+ #endif
75
+
76
+ #define FFI_TYPE_SMALL_STRUCT1 -1
77
+ #define FFI_TYPE_SMALL_STRUCT2 -2
78
+ #define FFI_TYPE_SMALL_STRUCT3 -3
79
+ #define FFI_TYPE_SMALL_STRUCT4 -4
80
+ #define FFI_TYPE_SMALL_STRUCT5 -5
81
+ #define FFI_TYPE_SMALL_STRUCT6 -6
82
+ #define FFI_TYPE_SMALL_STRUCT7 -7
83
+ #define FFI_TYPE_SMALL_STRUCT8 -8
84
+
85
+ /* linux.S and hpux32.S expect FFI_TYPE_COMPLEX is the last generic type. */
86
+ #define FFI_PA_TYPE_LAST FFI_TYPE_COMPLEX
87
+
88
+ /* If new generic types are added, the jump tables in linux.S and hpux32.S
89
+ likely need updating. */
90
+ #if FFI_TYPE_LAST != FFI_PA_TYPE_LAST
91
+ # error "You likely have broken jump tables"
76
92
  #endif
77
93
 
78
- #define FFI_TYPE_SMALL_STRUCT2 -1
79
- #define FFI_TYPE_SMALL_STRUCT3 -2
80
- #define FFI_TYPE_SMALL_STRUCT4 -3
81
- #define FFI_TYPE_SMALL_STRUCT5 -4
82
- #define FFI_TYPE_SMALL_STRUCT6 -5
83
- #define FFI_TYPE_SMALL_STRUCT7 -6
84
- #define FFI_TYPE_SMALL_STRUCT8 -7
85
94
  #endif