ffi 1.10.0 → 1.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/{appveyor.yml → .appveyor.yml} +9 -1
  3. data/.github/workflows/ci.yml +64 -0
  4. data/.gitignore +3 -0
  5. data/.gitmodules +1 -0
  6. data/.travis.yml +35 -20
  7. data/CHANGELOG.md +124 -0
  8. data/Gemfile +6 -4
  9. data/README.md +29 -17
  10. data/Rakefile +29 -120
  11. data/ext/ffi_c/AbstractMemory.c +5 -9
  12. data/ext/ffi_c/Buffer.c +2 -2
  13. data/ext/ffi_c/Call.c +14 -41
  14. data/ext/ffi_c/Call.h +4 -7
  15. data/ext/ffi_c/ClosurePool.c +11 -14
  16. data/ext/ffi_c/DynamicLibrary.c +1 -1
  17. data/ext/ffi_c/Function.c +18 -117
  18. data/ext/ffi_c/FunctionInfo.c +1 -2
  19. data/ext/ffi_c/LongDouble.c +12 -10
  20. data/ext/ffi_c/LongDouble.h +0 -4
  21. data/ext/ffi_c/MemoryPointer.c +1 -1
  22. data/ext/ffi_c/MethodHandle.c +18 -24
  23. data/ext/ffi_c/MethodHandle.h +3 -2
  24. data/ext/ffi_c/Platform.c +1 -47
  25. data/ext/ffi_c/Pointer.c +1 -1
  26. data/ext/ffi_c/Struct.c +47 -51
  27. data/ext/ffi_c/Struct.h +12 -6
  28. data/ext/ffi_c/StructLayout.c +20 -14
  29. data/ext/ffi_c/Thread.c +4 -223
  30. data/ext/ffi_c/Thread.h +0 -14
  31. data/ext/ffi_c/Type.c +0 -18
  32. data/ext/ffi_c/Type.h +0 -1
  33. data/ext/ffi_c/Types.c +1 -1
  34. data/ext/ffi_c/Variadic.c +9 -15
  35. data/ext/ffi_c/compat.h +4 -0
  36. data/ext/ffi_c/extconf.rb +36 -26
  37. data/ext/ffi_c/ffi.c +3 -8
  38. data/ext/ffi_c/libffi.darwin.mk +1 -1
  39. data/ext/ffi_c/libffi/.appveyor.yml +29 -13
  40. data/ext/ffi_c/libffi/.gitattributes +4 -0
  41. data/ext/ffi_c/libffi/.travis.yml +51 -2
  42. data/ext/ffi_c/libffi/.travis/bfin-sim.exp +58 -0
  43. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +14 -0
  44. data/ext/ffi_c/libffi/.travis/build-in-container.sh +12 -0
  45. data/ext/ffi_c/libffi/.travis/build.sh +116 -8
  46. data/ext/ffi_c/libffi/.travis/install.sh +65 -16
  47. data/ext/ffi_c/libffi/.travis/m32r-sim.exp +58 -0
  48. data/ext/ffi_c/libffi/.travis/or1k-sim.exp +58 -0
  49. data/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +58 -0
  50. data/ext/ffi_c/libffi/.travis/site.exp +10 -1
  51. data/ext/ffi_c/libffi/.travis/wine-sim.exp +55 -0
  52. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  53. data/ext/ffi_c/libffi/LICENSE +1 -1
  54. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +5 -4
  55. data/ext/ffi_c/libffi/Makefile.am +35 -41
  56. data/ext/ffi_c/libffi/README.md +29 -8
  57. data/ext/ffi_c/libffi/configure.ac +31 -11
  58. data/ext/ffi_c/libffi/configure.host +26 -9
  59. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +1 -3
  60. data/ext/ffi_c/libffi/include/ffi.h.in +19 -7
  61. data/ext/ffi_c/libffi/include/ffi_common.h +5 -1
  62. data/ext/ffi_c/libffi/libffi.map.in +8 -12
  63. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  64. data/ext/ffi_c/libffi/libtool-version +1 -1
  65. data/ext/ffi_c/libffi/m4/asmcfi.m4 +1 -1
  66. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  67. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  68. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +2 -1
  69. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  70. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  71. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  72. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  73. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  74. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  75. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  76. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  77. data/ext/ffi_c/libffi/msvcc.sh +27 -2
  78. data/ext/ffi_c/libffi/src/aarch64/ffi.c +132 -58
  79. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +13 -2
  80. data/ext/ffi_c/libffi/src/aarch64/sysv.S +21 -8
  81. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  82. data/ext/ffi_c/libffi/src/arm/ffi.c +40 -5
  83. data/ext/ffi_c/libffi/src/arm/ffitarget.h +8 -1
  84. data/ext/ffi_c/libffi/src/arm/sysv.S +2 -0
  85. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  86. data/ext/ffi_c/libffi/src/closures.c +51 -13
  87. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  88. data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
  89. data/ext/ffi_c/libffi/src/mips/o32.S +2 -0
  90. data/ext/ffi_c/libffi/src/moxie/ffi.c +1 -1
  91. data/ext/ffi_c/libffi/src/pa/ffi.c +46 -91
  92. data/ext/ffi_c/libffi/src/pa/ffitarget.h +1 -6
  93. data/ext/ffi_c/libffi/src/pa/hpux32.S +4 -2
  94. data/ext/ffi_c/libffi/src/pa/linux.S +27 -4
  95. data/ext/ffi_c/libffi/src/powerpc/ffi.c +6 -4
  96. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +211 -32
  97. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  98. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  99. data/ext/ffi_c/libffi/src/powerpc/linux64.S +83 -28
  100. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +68 -4
  101. data/ext/ffi_c/libffi/src/powerpc/sysv.S +5 -7
  102. data/ext/ffi_c/libffi/src/prep_cif.c +4 -2
  103. data/ext/ffi_c/libffi/src/riscv/ffi.c +42 -6
  104. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  105. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  106. data/ext/ffi_c/libffi/src/x86/ffi.c +21 -10
  107. data/ext/ffi_c/libffi/src/x86/ffi64.c +15 -11
  108. data/ext/ffi_c/libffi/src/x86/ffitarget.h +15 -2
  109. data/ext/ffi_c/libffi/src/x86/ffiw64.c +15 -10
  110. data/ext/ffi_c/libffi/src/x86/sysv.S +103 -8
  111. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +995 -0
  112. data/ext/ffi_c/libffi/src/x86/unix64.S +99 -2
  113. data/ext/ffi_c/libffi/src/x86/win64.S +9 -1
  114. data/ext/ffi_c/libffi/testsuite/Makefile.am +114 -109
  115. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +26 -22
  116. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  117. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -1
  118. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +1 -1
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +9 -8
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -1
  122. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  123. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +0 -0
  124. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +0 -0
  125. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +0 -0
  126. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +0 -0
  127. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +0 -0
  128. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +0 -0
  129. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +0 -0
  130. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +0 -0
  131. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +0 -0
  132. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +0 -0
  133. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +0 -0
  134. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +0 -0
  135. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +0 -0
  136. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +0 -0
  137. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +0 -0
  138. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +0 -0
  139. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +0 -0
  140. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +0 -0
  141. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +0 -0
  142. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +0 -0
  143. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +0 -0
  144. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +0 -0
  145. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +0 -0
  146. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +0 -0
  147. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +0 -0
  148. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +0 -0
  149. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +0 -0
  150. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +0 -0
  151. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +0 -0
  152. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +0 -0
  153. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +0 -0
  154. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +0 -0
  155. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +0 -0
  156. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +0 -0
  157. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +0 -0
  158. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +0 -0
  159. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +0 -0
  160. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +0 -0
  161. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +0 -0
  162. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +0 -0
  163. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +0 -0
  164. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +0 -0
  165. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +0 -0
  166. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +0 -0
  167. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +0 -0
  168. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +0 -0
  169. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +0 -0
  170. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  171. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +0 -0
  172. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +0 -0
  173. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +0 -0
  174. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +0 -0
  175. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  176. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  177. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +0 -0
  178. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +0 -0
  179. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +0 -0
  180. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +0 -0
  181. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +0 -0
  182. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +0 -0
  183. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +0 -0
  184. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +0 -0
  185. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +0 -0
  186. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +0 -0
  187. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +0 -0
  188. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +0 -0
  189. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +0 -0
  190. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar_va.c +0 -0
  191. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +0 -0
  192. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +0 -0
  193. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +0 -0
  194. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +0 -0
  195. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +0 -0
  196. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort_va.c +0 -0
  197. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +138 -0
  199. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +1 -1
  200. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +0 -0
  201. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +0 -0
  202. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +0 -0
  203. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +0 -0
  204. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +0 -0
  205. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +0 -0
  206. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +0 -0
  207. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +0 -0
  208. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +0 -0
  209. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +0 -0
  210. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +0 -0
  211. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +0 -0
  212. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  213. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  214. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  215. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +0 -0
  216. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +0 -0
  217. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +0 -0
  218. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +0 -0
  219. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +0 -0
  220. data/ext/ffi_c/rbffi.h +0 -2
  221. data/ffi.gemspec +12 -5
  222. data/lib/ffi.rb +10 -2
  223. data/lib/ffi/data_converter.rb +67 -0
  224. data/lib/ffi/ffi.rb +2 -0
  225. data/lib/ffi/library.rb +10 -6
  226. data/lib/ffi/platform.rb +12 -3
  227. data/lib/ffi/platform/aarch64-freebsd/types.conf +89 -89
  228. data/lib/ffi/platform/aarch64-freebsd12/types.conf +89 -89
  229. data/lib/ffi/platform/aarch64-linux/types.conf +81 -81
  230. data/lib/ffi/platform/arm-freebsd/types.conf +87 -87
  231. data/lib/ffi/platform/arm-freebsd12/types.conf +87 -87
  232. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  233. data/lib/ffi/platform/i386-cygwin/types.conf +1 -1
  234. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  235. data/lib/ffi/platform/i386-freebsd/types.conf +87 -87
  236. data/lib/ffi/platform/i386-freebsd12/types.conf +87 -87
  237. data/lib/ffi/platform/i386-gnu/types.conf +84 -84
  238. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  239. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  240. data/lib/ffi/platform/i386-openbsd/types.conf +89 -89
  241. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  242. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  243. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  244. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  245. data/lib/ffi/platform/mips64-linux/types.conf +81 -81
  246. data/lib/ffi/platform/mips64el-linux/types.conf +81 -81
  247. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  248. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +79 -79
  249. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +79 -79
  250. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +81 -81
  251. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +81 -81
  252. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  253. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  254. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  255. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  256. data/lib/ffi/platform/powerpc64-linux/types.conf +81 -81
  257. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  258. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  259. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  260. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  261. data/lib/ffi/platform/sparc64-linux/types.conf +79 -79
  262. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  263. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  264. data/lib/ffi/platform/x86_64-cygwin/types.conf +1 -1
  265. data/lib/ffi/platform/x86_64-darwin/types.conf +88 -84
  266. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  267. data/lib/ffi/platform/x86_64-freebsd/types.conf +89 -89
  268. data/lib/ffi/platform/x86_64-freebsd12/types.conf +139 -109
  269. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  270. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -89
  271. data/lib/ffi/platform/x86_64-openbsd/types.conf +86 -86
  272. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  273. data/lib/ffi/platform/x86_64-windows/types.conf +42 -110
  274. data/lib/ffi/pointer.rb +20 -13
  275. data/lib/ffi/struct.rb +13 -68
  276. data/lib/ffi/struct_by_reference.rb +72 -0
  277. data/lib/ffi/struct_layout.rb +96 -0
  278. data/lib/ffi/tools/const_generator.rb +5 -4
  279. data/lib/ffi/tools/generator.rb +47 -2
  280. data/lib/ffi/tools/generator_task.rb +13 -17
  281. data/lib/ffi/tools/struct_generator.rb +4 -4
  282. data/lib/ffi/tools/types_generator.rb +7 -4
  283. data/lib/ffi/types.rb +1 -1
  284. data/lib/ffi/version.rb +1 -1
  285. data/samples/getlogin.rb +1 -1
  286. data/samples/getpid.rb +1 -1
  287. data/samples/gettimeofday.rb +8 -8
  288. data/samples/hello.rb +2 -1
  289. data/samples/inotify.rb +1 -1
  290. data/samples/pty.rb +1 -2
  291. data/samples/qsort.rb +0 -1
  292. metadata +141 -116
  293. data/ext/ffi_c/DataConverter.c +0 -91
  294. data/ext/ffi_c/StructByReference.c +0 -190
  295. data/ext/ffi_c/StructByReference.h +0 -50
  296. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  297. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  298. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  299. data/samples/sample_helper.rb +0 -6
@@ -31,22 +31,24 @@
31
31
  enum {
32
32
  /* The assembly depends on these exact flags. */
33
33
  /* These go in cr7 */
34
- FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */
34
+ FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */
35
35
  FLAG_RETURNS_NOTHING = 1 << (31-30),
36
36
  FLAG_RETURNS_FP = 1 << (31-29),
37
- FLAG_RETURNS_64BITS = 1 << (31-28),
37
+ FLAG_RETURNS_VEC = 1 << (31-28),
38
38
 
39
- /* This goes in cr6 */
40
- FLAG_RETURNS_128BITS = 1 << (31-27),
39
+ /* These go in cr6 */
40
+ FLAG_RETURNS_64BITS = 1 << (31-27),
41
+ FLAG_RETURNS_128BITS = 1 << (31-26),
41
42
 
42
- FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */
43
+ FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */
43
44
 
44
45
  /* These go in cr1 */
45
46
  FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */
46
47
  FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */
47
48
  FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
48
49
  FLAG_4_GPR_ARGUMENTS = 1 << (31- 5),
49
- FLAG_RETVAL_REFERENCE = 1 << (31- 4)
50
+ FLAG_RETVAL_REFERENCE = 1 << (31- 4),
51
+ FLAG_VEC_ARGUMENTS = 1 << (31- 3),
50
52
  };
51
53
 
52
54
  typedef union
@@ -55,6 +57,14 @@ typedef union
55
57
  double d;
56
58
  } ffi_dblfl;
57
59
 
60
+ #if defined(__FLOAT128_TYPE__)
61
+ typedef _Float128 float128;
62
+ #elif defined(__FLOAT128__)
63
+ typedef __float128 float128;
64
+ #else
65
+ typedef char float128[16] __attribute__((aligned(16)));
66
+ #endif
67
+
58
68
  void FFI_HIDDEN ffi_closure_SYSV (void);
59
69
  void FFI_HIDDEN ffi_go_closure_sysv (void);
60
70
  void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *,
@@ -91,4 +101,5 @@ int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *,
91
101
  void (*) (ffi_cif *, void *,
92
102
  void **, void *),
93
103
  void *, void *,
94
- unsigned long *, ffi_dblfl *);
104
+ unsigned long *, ffi_dblfl *,
105
+ float128 *);
@@ -91,15 +91,19 @@ typedef enum ffi_abi {
91
91
  /* This and following bits can reuse FFI_COMPAT values. */
92
92
  FFI_LINUX_STRUCT_ALIGN = 1,
93
93
  FFI_LINUX_LONG_DOUBLE_128 = 2,
94
+ FFI_LINUX_LONG_DOUBLE_IEEE128 = 4,
94
95
  FFI_DEFAULT_ABI = (FFI_LINUX
95
96
  # ifdef __STRUCT_PARM_ALIGN__
96
97
  | FFI_LINUX_STRUCT_ALIGN
97
98
  # endif
98
99
  # ifdef __LONG_DOUBLE_128__
99
100
  | FFI_LINUX_LONG_DOUBLE_128
101
+ # ifdef __LONG_DOUBLE_IEEE128__
102
+ | FFI_LINUX_LONG_DOUBLE_IEEE128
103
+ # endif
100
104
  # endif
101
105
  ),
102
- FFI_LAST_ABI = 12
106
+ FFI_LAST_ABI = 16
103
107
 
104
108
  # else
105
109
  /* This bit, always set in new code, must not be set in any of the
@@ -167,9 +171,11 @@ typedef enum ffi_abi {
167
171
  #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2)
168
172
 
169
173
  /* Used by ELFv2 for homogenous structure returns. */
170
- #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 1)
171
- #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 2)
172
- #define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 3)
174
+ #define FFI_V2_TYPE_VECTOR (FFI_PPC_TYPE_LAST + 1)
175
+ #define FFI_V2_TYPE_VECTOR_HOMOG (FFI_PPC_TYPE_LAST + 2)
176
+ #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 3)
177
+ #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 4)
178
+ #define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 5)
173
179
 
174
180
  #if _CALL_ELF == 2
175
181
  # define FFI_TRAMPOLINE_SIZE 32
@@ -101,40 +101,70 @@ ffi_call_LINUX64:
101
101
  ld %r2, 8(%r29)
102
102
  # endif
103
103
  /* Now do the call. */
104
- /* Set up cr1 with bits 4-7 of the flags. */
105
- mtcrf 0x40, %r31
104
+ /* Set up cr1 with bits 3-7 of the flags. */
105
+ mtcrf 0xc0, %r31
106
106
 
107
107
  /* Get the address to call into CTR. */
108
108
  mtctr %r12
109
109
  /* Load all those argument registers. */
110
- ld %r3, -32-(8*8)(%r28)
111
- ld %r4, -32-(7*8)(%r28)
112
- ld %r5, -32-(6*8)(%r28)
113
- ld %r6, -32-(5*8)(%r28)
110
+ addi %r29, %r28, -32-(8*8)
111
+ ld %r3, (0*8)(%r29)
112
+ ld %r4, (1*8)(%r29)
113
+ ld %r5, (2*8)(%r29)
114
+ ld %r6, (3*8)(%r29)
114
115
  bf- 5, 1f
115
- ld %r7, -32-(4*8)(%r28)
116
- ld %r8, -32-(3*8)(%r28)
117
- ld %r9, -32-(2*8)(%r28)
118
- ld %r10, -32-(1*8)(%r28)
116
+ ld %r7, (4*8)(%r29)
117
+ ld %r8, (5*8)(%r29)
118
+ ld %r9, (6*8)(%r29)
119
+ ld %r10, (7*8)(%r29)
119
120
  1:
120
121
 
121
122
  /* Load all the FP registers. */
122
123
  bf- 6, 2f
123
- lfd %f1, -32-(21*8)(%r28)
124
- lfd %f2, -32-(20*8)(%r28)
125
- lfd %f3, -32-(19*8)(%r28)
126
- lfd %f4, -32-(18*8)(%r28)
127
- lfd %f5, -32-(17*8)(%r28)
128
- lfd %f6, -32-(16*8)(%r28)
129
- lfd %f7, -32-(15*8)(%r28)
130
- lfd %f8, -32-(14*8)(%r28)
131
- lfd %f9, -32-(13*8)(%r28)
132
- lfd %f10, -32-(12*8)(%r28)
133
- lfd %f11, -32-(11*8)(%r28)
134
- lfd %f12, -32-(10*8)(%r28)
135
- lfd %f13, -32-(9*8)(%r28)
124
+ addi %r29, %r29, -(14*8)
125
+ lfd %f1, ( 1*8)(%r29)
126
+ lfd %f2, ( 2*8)(%r29)
127
+ lfd %f3, ( 3*8)(%r29)
128
+ lfd %f4, ( 4*8)(%r29)
129
+ lfd %f5, ( 5*8)(%r29)
130
+ lfd %f6, ( 6*8)(%r29)
131
+ lfd %f7, ( 7*8)(%r29)
132
+ lfd %f8, ( 8*8)(%r29)
133
+ lfd %f9, ( 9*8)(%r29)
134
+ lfd %f10, (10*8)(%r29)
135
+ lfd %f11, (11*8)(%r29)
136
+ lfd %f12, (12*8)(%r29)
137
+ lfd %f13, (13*8)(%r29)
136
138
  2:
137
139
 
140
+ /* Load all the vector registers. */
141
+ bf- 3, 3f
142
+ addi %r29, %r29, -16
143
+ lvx %v13, 0, %r29
144
+ addi %r29, %r29, -16
145
+ lvx %v12, 0, %r29
146
+ addi %r29, %r29, -16
147
+ lvx %v11, 0, %r29
148
+ addi %r29, %r29, -16
149
+ lvx %v10, 0, %r29
150
+ addi %r29, %r29, -16
151
+ lvx %v9, 0, %r29
152
+ addi %r29, %r29, -16
153
+ lvx %v8, 0, %r29
154
+ addi %r29, %r29, -16
155
+ lvx %v7, 0, %r29
156
+ addi %r29, %r29, -16
157
+ lvx %v6, 0, %r29
158
+ addi %r29, %r29, -16
159
+ lvx %v5, 0, %r29
160
+ addi %r29, %r29, -16
161
+ lvx %v4, 0, %r29
162
+ addi %r29, %r29, -16
163
+ lvx %v3, 0, %r29
164
+ addi %r29, %r29, -16
165
+ lvx %v2, 0, %r29
166
+ 3:
167
+
138
168
  /* Make the call. */
139
169
  ld %r11, 8(%r28)
140
170
  bctrl
@@ -152,6 +182,7 @@ ffi_call_LINUX64:
152
182
  bt 31, .Lstruct_return_value
153
183
  bt 30, .Ldone_return_value
154
184
  bt 29, .Lfp_return_value
185
+ bt 28, .Lvec_return_value
155
186
  std %r3, 0(%r30)
156
187
  /* Fall through... */
157
188
 
@@ -167,12 +198,16 @@ ffi_call_LINUX64:
167
198
  ld %r31, -8(%r1)
168
199
  blr
169
200
 
201
+ .Lvec_return_value:
202
+ stvx %v2, 0, %r30
203
+ b .Ldone_return_value
204
+
170
205
  .Lfp_return_value:
171
206
  .cfi_def_cfa_register 28
172
- bf 28, .Lfloat_return_value
173
- stfd %f1, 0(%r30)
174
207
  mtcrf 0x02, %r31 /* cr6 */
175
- bf 27, .Ldone_return_value
208
+ bf 27, .Lfloat_return_value
209
+ stfd %f1, 0(%r30)
210
+ bf 26, .Ldone_return_value
176
211
  stfd %f2, 8(%r30)
177
212
  b .Ldone_return_value
178
213
  .Lfloat_return_value:
@@ -180,8 +215,9 @@ ffi_call_LINUX64:
180
215
  b .Ldone_return_value
181
216
 
182
217
  .Lstruct_return_value:
183
- bf 29, .Lsmall_struct
184
- bf 28, .Lfloat_homog_return_value
218
+ bf 29, .Lvec_homog_or_small_struct
219
+ mtcrf 0x02, %r31 /* cr6 */
220
+ bf 27, .Lfloat_homog_return_value
185
221
  stfd %f1, 0(%r30)
186
222
  stfd %f2, 8(%r30)
187
223
  stfd %f3, 16(%r30)
@@ -203,6 +239,25 @@ ffi_call_LINUX64:
203
239
  stfs %f8, 28(%r30)
204
240
  b .Ldone_return_value
205
241
 
242
+ .Lvec_homog_or_small_struct:
243
+ bf 28, .Lsmall_struct
244
+ stvx %v2, 0, %r30
245
+ addi %r30, %r30, 16
246
+ stvx %v3, 0, %r30
247
+ addi %r30, %r30, 16
248
+ stvx %v4, 0, %r30
249
+ addi %r30, %r30, 16
250
+ stvx %v5, 0, %r30
251
+ addi %r30, %r30, 16
252
+ stvx %v6, 0, %r30
253
+ addi %r30, %r30, 16
254
+ stvx %v7, 0, %r30
255
+ addi %r30, %r30, 16
256
+ stvx %v8, 0, %r30
257
+ addi %r30, %r30, 16
258
+ stvx %v9, 0, %r30
259
+ b .Ldone_return_value
260
+
206
261
  .Lsmall_struct:
207
262
  std %r3, 0(%r30)
208
263
  std %r4, 8(%r30)
@@ -61,9 +61,15 @@ ffi_closure_LINUX64:
61
61
  # endif
62
62
 
63
63
  # if _CALL_ELF == 2
64
- # 32 byte special reg save area + 64 byte parm save area
65
- # + 64 byte retval area + 13*8 fpr save area + round to 16
66
- # define STACKFRAME 272
64
+ # ifdef __VEC__
65
+ # 32 byte special reg save area + 64 byte parm save area
66
+ # + 128 byte retval area + 13*8 fpr save area + 12*16 vec save area + round to 16
67
+ # define STACKFRAME 528
68
+ # else
69
+ # 32 byte special reg save area + 64 byte parm save area
70
+ # + 64 byte retval area + 13*8 fpr save area + round to 16
71
+ # define STACKFRAME 272
72
+ # endif
67
73
  # define PARMSAVE 32
68
74
  # define RETVAL PARMSAVE+64
69
75
  # else
@@ -143,9 +149,38 @@ ffi_closure_LINUX64:
143
149
  stfd %f12, -104+(11*8)(%r1)
144
150
  stfd %f13, -104+(12*8)(%r1)
145
151
 
146
- # load up the pointer to the saved fpr registers */
152
+ # load up the pointer to the saved fpr registers
147
153
  addi %r8, %r1, -104
148
154
 
155
+ # ifdef __VEC__
156
+ # load up the pointer to the saved vector registers
157
+ # 8 bytes padding for 16-byte alignment at -112(%r1)
158
+ addi %r9, %r8, -24
159
+ stvx %v13, 0, %r9
160
+ addi %r9, %r9, -16
161
+ stvx %v12, 0, %r9
162
+ addi %r9, %r9, -16
163
+ stvx %v11, 0, %r9
164
+ addi %r9, %r9, -16
165
+ stvx %v10, 0, %r9
166
+ addi %r9, %r9, -16
167
+ stvx %v9, 0, %r9
168
+ addi %r9, %r9, -16
169
+ stvx %v8, 0, %r9
170
+ addi %r9, %r9, -16
171
+ stvx %v7, 0, %r9
172
+ addi %r9, %r9, -16
173
+ stvx %v6, 0, %r9
174
+ addi %r9, %r9, -16
175
+ stvx %v5, 0, %r9
176
+ addi %r9, %r9, -16
177
+ stvx %v4, 0, %r9
178
+ addi %r9, %r9, -16
179
+ stvx %v3, 0, %r9
180
+ addi %r9, %r9, -16
181
+ stvx %v2, 0, %r9
182
+ # endif
183
+
149
184
  # load up the pointer to the result storage
150
185
  addi %r6, %r1, -STACKFRAME+RETVAL
151
186
 
@@ -313,6 +348,16 @@ ffi_closure_LINUX64:
313
348
  .cfi_def_cfa_offset 0
314
349
  blr
315
350
  .cfi_def_cfa_offset STACKFRAME
351
+ # case FFI_V2_TYPE_VECTOR
352
+ addi %r3, %r1, RETVAL
353
+ lvx %v2, 0, %r3
354
+ mtlr %r0
355
+ b .Lfinish
356
+ # case FFI_V2_TYPE_VECTOR_HOMOG
357
+ addi %r3, %r1, RETVAL
358
+ lvx %v2, 0, %r3
359
+ addi %r3, %r3, 16
360
+ b .Lmorevector
316
361
  # case FFI_V2_TYPE_FLOAT_HOMOG
317
362
  lfs %f1, RETVAL+0(%r1)
318
363
  lfs %f2, RETVAL+4(%r1)
@@ -332,6 +377,25 @@ ffi_closure_LINUX64:
332
377
  .cfi_def_cfa_offset 0
333
378
  blr
334
379
  .cfi_def_cfa_offset STACKFRAME
380
+ .Lmorevector:
381
+ lvx %v3, 0, %r3
382
+ addi %r3, %r3, 16
383
+ lvx %v4, 0, %r3
384
+ addi %r3, %r3, 16
385
+ lvx %v5, 0, %r3
386
+ mtlr %r0
387
+ addi %r3, %r3, 16
388
+ lvx %v6, 0, %r3
389
+ addi %r3, %r3, 16
390
+ lvx %v7, 0, %r3
391
+ addi %r3, %r3, 16
392
+ lvx %v8, 0, %r3
393
+ addi %r3, %r3, 16
394
+ lvx %v9, 0, %r3
395
+ addi %r1, %r1, STACKFRAME
396
+ .cfi_def_cfa_offset 0
397
+ blr
398
+ .cfi_def_cfa_offset STACKFRAME
335
399
  .Lmorefloat:
336
400
  lfs %f4, RETVAL+12(%r1)
337
401
  mtlr %r0
@@ -104,17 +104,16 @@ ENTRY(ffi_call_SYSV)
104
104
  bctrl
105
105
 
106
106
  /* Now, deal with the return value. */
107
- mtcrf 0x01,%r31 /* cr7 */
107
+ mtcrf 0x03,%r31 /* cr6-cr7 */
108
108
  bt- 31,L(small_struct_return_value)
109
109
  bt- 30,L(done_return_value)
110
110
  #ifndef __NO_FPRS__
111
111
  bt- 29,L(fp_return_value)
112
112
  #endif
113
113
  stw %r3,0(%r30)
114
- bf+ 28,L(done_return_value)
114
+ bf+ 27,L(done_return_value)
115
115
  stw %r4,4(%r30)
116
- mtcrf 0x02,%r31 /* cr6 */
117
- bf 27,L(done_return_value)
116
+ bf 26,L(done_return_value)
118
117
  stw %r5,8(%r30)
119
118
  stw %r6,12(%r30)
120
119
  /* Fall through... */
@@ -145,10 +144,9 @@ L(done_return_value):
145
144
  #ifndef __NO_FPRS__
146
145
  L(fp_return_value):
147
146
  .cfi_restore_state
148
- bf 28,L(float_return_value)
147
+ bf 27,L(float_return_value)
149
148
  stfd %f1,0(%r30)
150
- mtcrf 0x02,%r31 /* cr6 */
151
- bf 27,L(done_return_value)
149
+ bf 26,L(done_return_value)
152
150
  stfd %f2,8(%r30)
153
151
  b L(done_return_value)
154
152
  L(float_return_value):
@@ -129,7 +129,9 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
129
129
  cif->rtype = rtype;
130
130
 
131
131
  cif->flags = 0;
132
-
132
+ #ifdef _M_ARM64
133
+ cif->is_variadic = isvariadic;
134
+ #endif
133
135
  #if HAVE_LONG_DOUBLE_VARIANT
134
136
  ffi_prep_types (abi);
135
137
  #endif
@@ -199,7 +201,7 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
199
201
  bytes = 6*4;
200
202
  #endif
201
203
 
202
- bytes += STACK_ARG_SIZE((*ptr)->size);
204
+ bytes += (unsigned int)STACK_ARG_SIZE((*ptr)->size);
203
205
  }
204
206
  #endif
205
207
  }
@@ -324,9 +324,12 @@ ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsig
324
324
  }
325
325
 
326
326
  /* Low level routine for calling functions */
327
- extern void ffi_call_asm(void *stack, struct call_context *regs, void (*fn)(void)) FFI_HIDDEN;
327
+ extern void ffi_call_asm (void *stack, struct call_context *regs,
328
+ void (*fn) (void), void *closure) FFI_HIDDEN;
328
329
 
329
- void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
330
+ static void
331
+ ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
332
+ void *closure)
330
333
  {
331
334
  /* this is a conservative estimate, assuming a complex return value and
332
335
  that all remaining arguments are long long / __int128 */
@@ -366,13 +369,26 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
366
369
  for (i = 0; i < cif->nargs; i++)
367
370
  marshal(&cb, cif->arg_types[i], i >= cif->riscv_nfixedargs, avalue[i]);
368
371
 
369
- ffi_call_asm((void*)alloc_base, cb.aregs, fn);
372
+ ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure);
370
373
 
371
374
  cb.used_float = cb.used_integer = 0;
372
375
  if (!return_by_ref && rvalue)
373
376
  unmarshal(&cb, cif->rtype, 0, rvalue);
374
377
  }
375
378
 
379
+ void
380
+ ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
381
+ {
382
+ ffi_call_int(cif, fn, rvalue, avalue, NULL);
383
+ }
384
+
385
+ void
386
+ ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue,
387
+ void **avalue, void *closure)
388
+ {
389
+ ffi_call_int(cif, fn, rvalue, avalue, closure);
390
+ }
391
+
376
392
  extern void ffi_closure_asm(void) FFI_HIDDEN;
377
393
 
378
394
  ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc)
@@ -406,11 +422,31 @@ ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)(
406
422
  return FFI_OK;
407
423
  }
408
424
 
425
+ extern void ffi_go_closure_asm (void) FFI_HIDDEN;
426
+
427
+ ffi_status
428
+ ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
429
+ void (*fun) (ffi_cif *, void *, void **, void *))
430
+ {
431
+ if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI)
432
+ return FFI_BAD_ABI;
433
+
434
+ closure->tramp = (void *) ffi_go_closure_asm;
435
+ closure->cif = cif;
436
+ closure->fun = fun;
437
+
438
+ return FFI_OK;
439
+ }
440
+
409
441
  /* Called by the assembly code with aregs pointing to saved argument registers
410
442
  and stack pointing to the stacked arguments. Return values passed in
411
443
  registers will be reloaded from aregs. */
412
- void FFI_HIDDEN ffi_closure_inner(size_t *stack, call_context *aregs, ffi_closure *closure) {
413
- ffi_cif *cif = closure->cif;
444
+ void FFI_HIDDEN
445
+ ffi_closure_inner (ffi_cif *cif,
446
+ void (*fun) (ffi_cif *, void *, void **, void *),
447
+ void *user_data,
448
+ size_t *stack, call_context *aregs)
449
+ {
414
450
  void **avalue = alloca(cif->nargs * sizeof(void*));
415
451
  /* storage for arguments which will be copied by unmarshal(). We could
416
452
  theoretically avoid the copies in many cases and use at most 128 bytes
@@ -436,7 +472,7 @@ void FFI_HIDDEN ffi_closure_inner(size_t *stack, call_context *aregs, ffi_closur
436
472
  avalue[i] = unmarshal(&cb, cif->arg_types[i],
437
473
  i >= cif->riscv_nfixedargs, astorage + i*MAXCOPYARG);
438
474
 
439
- (closure->fun)(cif, rvalue, avalue, closure->user_data);
475
+ fun (cif, rvalue, avalue, user_data);
440
476
 
441
477
  if (!return_by_ref && cif->rtype->type != FFI_TYPE_VOID) {
442
478
  cb.used_integer = cb.used_float = 0;