ffi 1.10.0 → 1.15.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (349) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +240 -0
  3. data/Gemfile +3 -4
  4. data/README.md +42 -18
  5. data/Rakefile +68 -145
  6. data/ext/ffi_c/AbstractMemory.c +29 -34
  7. data/ext/ffi_c/Buffer.c +4 -9
  8. data/ext/ffi_c/Call.c +17 -50
  9. data/ext/ffi_c/Call.h +4 -7
  10. data/ext/ffi_c/ClosurePool.c +75 -25
  11. data/ext/ffi_c/ClosurePool.h +3 -1
  12. data/ext/ffi_c/DynamicLibrary.c +2 -7
  13. data/ext/ffi_c/Function.c +47 -131
  14. data/ext/ffi_c/Function.h +0 -4
  15. data/ext/ffi_c/FunctionInfo.c +3 -8
  16. data/ext/ffi_c/LastError.c +2 -6
  17. data/ext/ffi_c/LongDouble.c +12 -10
  18. data/ext/ffi_c/LongDouble.h +0 -4
  19. data/ext/ffi_c/MemoryPointer.c +3 -8
  20. data/ext/ffi_c/MemoryPointer.h +0 -4
  21. data/ext/ffi_c/MethodHandle.c +21 -31
  22. data/ext/ffi_c/MethodHandle.h +3 -2
  23. data/ext/ffi_c/Platform.c +5 -56
  24. data/ext/ffi_c/Pointer.c +25 -26
  25. data/ext/ffi_c/Pointer.h +0 -4
  26. data/ext/ffi_c/Struct.c +49 -56
  27. data/ext/ffi_c/Struct.h +12 -6
  28. data/ext/ffi_c/StructByValue.c +2 -7
  29. data/ext/ffi_c/StructLayout.c +22 -20
  30. data/ext/ffi_c/Thread.c +4 -228
  31. data/ext/ffi_c/Thread.h +1 -20
  32. data/ext/ffi_c/Type.c +1 -19
  33. data/ext/ffi_c/Type.h +0 -1
  34. data/ext/ffi_c/Types.c +7 -8
  35. data/ext/ffi_c/Types.h +3 -4
  36. data/ext/ffi_c/Variadic.c +23 -24
  37. data/ext/ffi_c/compat.h +4 -0
  38. data/ext/ffi_c/extconf.rb +56 -30
  39. data/ext/ffi_c/ffi.c +3 -8
  40. data/ext/ffi_c/libffi/.appveyor.yml +29 -13
  41. data/ext/ffi_c/libffi/.gitattributes +4 -0
  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/moxie-sim.exp +1 -1
  49. data/ext/ffi_c/libffi/.travis/or1k-sim.exp +58 -0
  50. data/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +58 -0
  51. data/ext/ffi_c/libffi/.travis/site.exp +10 -1
  52. data/ext/ffi_c/libffi/.travis/wine-sim.exp +55 -0
  53. data/ext/ffi_c/libffi/.travis.yml +51 -2
  54. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  55. data/ext/ffi_c/libffi/LICENSE +1 -1
  56. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +5 -4
  57. data/ext/ffi_c/libffi/Makefile.am +56 -72
  58. data/ext/ffi_c/libffi/Makefile.in +458 -207
  59. data/ext/ffi_c/libffi/README.md +33 -8
  60. data/ext/ffi_c/libffi/config.guess +552 -331
  61. data/ext/ffi_c/libffi/config.sub +1321 -1306
  62. data/ext/ffi_c/libffi/configure +414 -342
  63. data/ext/ffi_c/libffi/configure.ac +37 -12
  64. data/ext/ffi_c/libffi/configure.host +56 -27
  65. data/ext/ffi_c/libffi/doc/Makefile.in +9 -5
  66. data/ext/ffi_c/libffi/doc/libffi.texi +26 -14
  67. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  68. data/ext/ffi_c/libffi/fficonfig.h.in +13 -0
  69. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +2 -4
  70. data/ext/ffi_c/libffi/include/Makefile.in +10 -6
  71. data/ext/ffi_c/libffi/include/ffi.h.in +19 -7
  72. data/ext/ffi_c/libffi/include/ffi_common.h +5 -1
  73. data/ext/ffi_c/libffi/install-sh +23 -13
  74. data/ext/ffi_c/libffi/libffi.map.in +8 -12
  75. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  76. data/ext/ffi_c/libffi/libtool-version +1 -1
  77. data/ext/ffi_c/libffi/ltmain.sh +156 -61
  78. data/ext/ffi_c/libffi/m4/asmcfi.m4 +1 -1
  79. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  80. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  81. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +2 -1
  82. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  83. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  84. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  85. data/ext/ffi_c/libffi/man/Makefile.in +9 -5
  86. data/ext/ffi_c/libffi/missing +8 -8
  87. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  88. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  89. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  90. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  91. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  92. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  93. data/ext/ffi_c/libffi/msvcc.sh +38 -13
  94. data/ext/ffi_c/libffi/src/aarch64/ffi.c +153 -69
  95. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +19 -3
  96. data/ext/ffi_c/libffi/src/aarch64/internal.h +1 -0
  97. data/ext/ffi_c/libffi/src/aarch64/sysv.S +22 -9
  98. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  99. data/ext/ffi_c/libffi/src/arm/ffi.c +62 -5
  100. data/ext/ffi_c/libffi/src/arm/ffitarget.h +8 -1
  101. data/ext/ffi_c/libffi/src/arm/sysv.S +6 -4
  102. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  103. data/ext/ffi_c/libffi/src/closures.c +69 -14
  104. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  105. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  106. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  107. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  108. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  109. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  110. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  111. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  112. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  113. data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
  114. data/ext/ffi_c/libffi/src/mips/ffi.c +5 -1
  115. data/ext/ffi_c/libffi/src/mips/ffitarget.h +1 -1
  116. data/ext/ffi_c/libffi/src/mips/o32.S +2 -0
  117. data/ext/ffi_c/libffi/src/moxie/ffi.c +1 -1
  118. data/ext/ffi_c/libffi/src/pa/ffi.c +46 -91
  119. data/ext/ffi_c/libffi/src/pa/ffitarget.h +1 -6
  120. data/ext/ffi_c/libffi/src/pa/hpux32.S +4 -2
  121. data/ext/ffi_c/libffi/src/pa/linux.S +27 -4
  122. data/ext/ffi_c/libffi/src/powerpc/ffi.c +6 -4
  123. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +13 -1
  124. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +211 -32
  125. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  126. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  127. data/ext/ffi_c/libffi/src/powerpc/linux64.S +91 -28
  128. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +81 -5
  129. data/ext/ffi_c/libffi/src/powerpc/sysv.S +5 -7
  130. data/ext/ffi_c/libffi/src/prep_cif.c +4 -2
  131. data/ext/ffi_c/libffi/src/riscv/ffi.c +42 -6
  132. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  133. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  134. data/ext/ffi_c/libffi/src/x86/ffi.c +29 -12
  135. data/ext/ffi_c/libffi/src/x86/ffi64.c +22 -11
  136. data/ext/ffi_c/libffi/src/x86/ffitarget.h +15 -2
  137. data/ext/ffi_c/libffi/src/x86/ffiw64.c +20 -10
  138. data/ext/ffi_c/libffi/src/x86/sysv.S +105 -10
  139. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +995 -0
  140. data/ext/ffi_c/libffi/src/x86/unix64.S +100 -4
  141. data/ext/ffi_c/libffi/src/x86/win64.S +12 -3
  142. data/ext/ffi_c/libffi/src/x86/win64_intel.S +3 -2
  143. data/ext/ffi_c/libffi/testsuite/Makefile.am +114 -109
  144. data/ext/ffi_c/libffi/testsuite/Makefile.in +124 -84
  145. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +32 -8
  146. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  147. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +4 -4
  148. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2 -2
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +9 -8
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -1
  152. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  153. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +138 -0
  154. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +3 -1
  155. data/ext/ffi_c/libffi.darwin.mk +1 -1
  156. data/ext/ffi_c/rbffi.h +0 -2
  157. data/ffi.gemspec +13 -7
  158. data/lib/ffi/abstract_memory.rb +44 -0
  159. data/lib/ffi/autopointer.rb +1 -1
  160. data/lib/ffi/data_converter.rb +67 -0
  161. data/lib/ffi/ffi.rb +3 -0
  162. data/lib/ffi/io.rb +3 -3
  163. data/lib/ffi/library.rb +13 -9
  164. data/lib/ffi/managedstruct.rb +2 -2
  165. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  166. data/lib/ffi/platform/aarch64-freebsd/types.conf +89 -89
  167. data/lib/ffi/platform/aarch64-freebsd12/types.conf +162 -109
  168. data/lib/ffi/platform/aarch64-linux/types.conf +81 -81
  169. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  170. data/lib/ffi/platform/arm-freebsd/types.conf +87 -87
  171. data/lib/ffi/platform/arm-freebsd12/types.conf +87 -87
  172. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  173. data/lib/ffi/platform/i386-cygwin/types.conf +1 -1
  174. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  175. data/lib/ffi/platform/i386-freebsd/types.conf +87 -87
  176. data/lib/ffi/platform/i386-freebsd12/types.conf +87 -87
  177. data/lib/ffi/platform/i386-gnu/types.conf +84 -84
  178. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  179. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  180. data/lib/ffi/platform/i386-openbsd/types.conf +89 -89
  181. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  182. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  183. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  184. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  185. data/lib/ffi/platform/mips64-linux/types.conf +81 -81
  186. data/lib/ffi/platform/mips64el-linux/types.conf +81 -81
  187. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  188. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +79 -79
  189. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +79 -79
  190. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +81 -81
  191. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +81 -81
  192. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  193. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  194. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  195. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  196. data/lib/ffi/platform/powerpc64-linux/types.conf +81 -81
  197. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  198. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  199. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  200. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  201. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  202. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  203. data/lib/ffi/platform/sparc64-linux/types.conf +79 -79
  204. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  205. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  206. data/lib/ffi/platform/x86_64-cygwin/types.conf +1 -1
  207. data/lib/ffi/platform/x86_64-darwin/types.conf +88 -84
  208. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  209. data/lib/ffi/platform/x86_64-freebsd/types.conf +89 -89
  210. data/lib/ffi/platform/x86_64-freebsd12/types.conf +139 -109
  211. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  212. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  213. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  214. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -89
  215. data/lib/ffi/platform/x86_64-openbsd/types.conf +86 -86
  216. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  217. data/lib/ffi/platform/x86_64-windows/types.conf +42 -110
  218. data/lib/ffi/platform.rb +24 -9
  219. data/lib/ffi/pointer.rb +22 -15
  220. data/lib/ffi/struct.rb +13 -68
  221. data/lib/ffi/struct_by_reference.rb +72 -0
  222. data/lib/ffi/struct_layout.rb +96 -0
  223. data/lib/ffi/tools/const_generator.rb +11 -8
  224. data/lib/ffi/tools/generator.rb +47 -2
  225. data/lib/ffi/tools/generator_task.rb +13 -17
  226. data/lib/ffi/tools/struct_generator.rb +6 -5
  227. data/lib/ffi/tools/types_generator.rb +7 -4
  228. data/lib/ffi/types.rb +1 -1
  229. data/lib/ffi/variadic.rb +1 -10
  230. data/lib/ffi/version.rb +1 -1
  231. data/lib/ffi.rb +10 -3
  232. data/rakelib/ffi_gem_helper.rb +65 -0
  233. data/samples/getlogin.rb +1 -1
  234. data/samples/getpid.rb +1 -1
  235. data/samples/gettimeofday.rb +8 -8
  236. data/samples/hello.rb +2 -1
  237. data/samples/inotify.rb +1 -1
  238. data/samples/pty.rb +1 -2
  239. data/samples/qsort.rb +0 -1
  240. metadata +157 -139
  241. data/.gitignore +0 -22
  242. data/.gitmodules +0 -3
  243. data/.travis.yml +0 -43
  244. data/.yardopts +0 -5
  245. data/appveyor.yml +0 -22
  246. data/ext/ffi_c/DataConverter.c +0 -91
  247. data/ext/ffi_c/StructByReference.c +0 -190
  248. data/ext/ffi_c/StructByReference.h +0 -50
  249. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  250. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  251. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  252. data/ext/ffi_c/win32/stdbool.h +0 -8
  253. data/ext/ffi_c/win32/stdint.h +0 -201
  254. data/samples/sample_helper.rb +0 -6
  255. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +0 -0
  256. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +0 -0
  257. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +0 -0
  258. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +0 -0
  259. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +0 -0
  260. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +0 -0
  261. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +0 -0
  262. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +0 -0
  263. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +0 -0
  264. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +0 -0
  265. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +0 -0
  266. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +0 -0
  267. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +0 -0
  268. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +0 -0
  269. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +0 -0
  270. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +0 -0
  271. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +0 -0
  272. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +0 -0
  273. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +0 -0
  274. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +0 -0
  275. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +0 -0
  276. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +0 -0
  277. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +0 -0
  278. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +0 -0
  279. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +0 -0
  280. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +0 -0
  281. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +0 -0
  282. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +0 -0
  283. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +0 -0
  284. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +0 -0
  285. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +0 -0
  286. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +0 -0
  287. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +0 -0
  288. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +0 -0
  289. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +0 -0
  290. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +0 -0
  291. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +0 -0
  292. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +0 -0
  293. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +0 -0
  294. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +0 -0
  295. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +0 -0
  296. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +0 -0
  297. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +0 -0
  298. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +0 -0
  299. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +0 -0
  300. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +0 -0
  301. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +0 -0
  302. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  303. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +0 -0
  304. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +0 -0
  305. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +0 -0
  306. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +0 -0
  307. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  308. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  309. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +0 -0
  310. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +0 -0
  311. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +0 -0
  312. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +0 -0
  313. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +0 -0
  314. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +0 -0
  315. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +0 -0
  316. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +0 -0
  317. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +0 -0
  318. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +0 -0
  319. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +0 -0
  320. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +0 -0
  321. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +0 -0
  322. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar_va.c +0 -0
  323. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +0 -0
  324. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +0 -0
  325. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +0 -0
  326. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +0 -0
  327. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +0 -0
  328. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort_va.c +0 -0
  329. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  330. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +0 -0
  331. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +0 -0
  332. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +0 -0
  333. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +0 -0
  334. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +0 -0
  335. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +0 -0
  336. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +0 -0
  337. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +0 -0
  338. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +0 -0
  339. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +0 -0
  340. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +0 -0
  341. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +0 -0
  342. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  343. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  344. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  345. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +0 -0
  346. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +0 -0
  347. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +0 -0
  348. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +0 -0
  349. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +0 -0
@@ -36,8 +36,10 @@
36
36
  .cfi_startproc
37
37
  # if _CALL_ELF == 2
38
38
  ffi_call_LINUX64:
39
+ # ifndef __PCREL__
39
40
  addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha
40
41
  addi %r2, %r2, .TOC.-ffi_call_LINUX64@l
42
+ # endif
41
43
  .localentry ffi_call_LINUX64, . - ffi_call_LINUX64
42
44
  # else
43
45
  .section ".opd","aw"
@@ -89,9 +91,15 @@ ffi_call_LINUX64:
89
91
  /* Call ffi_prep_args64. */
90
92
  mr %r4, %r1
91
93
  # if defined _CALL_LINUX || _CALL_ELF == 2
94
+ # ifdef __PCREL__
95
+ bl ffi_prep_args64@notoc
96
+ # else
92
97
  bl ffi_prep_args64
98
+ nop
99
+ # endif
93
100
  # else
94
101
  bl .ffi_prep_args64
102
+ nop
95
103
  # endif
96
104
 
97
105
  # if _CALL_ELF == 2
@@ -101,40 +109,70 @@ ffi_call_LINUX64:
101
109
  ld %r2, 8(%r29)
102
110
  # endif
103
111
  /* Now do the call. */
104
- /* Set up cr1 with bits 4-7 of the flags. */
105
- mtcrf 0x40, %r31
112
+ /* Set up cr1 with bits 3-7 of the flags. */
113
+ mtcrf 0xc0, %r31
106
114
 
107
115
  /* Get the address to call into CTR. */
108
116
  mtctr %r12
109
117
  /* 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)
118
+ addi %r29, %r28, -32-(8*8)
119
+ ld %r3, (0*8)(%r29)
120
+ ld %r4, (1*8)(%r29)
121
+ ld %r5, (2*8)(%r29)
122
+ ld %r6, (3*8)(%r29)
114
123
  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)
124
+ ld %r7, (4*8)(%r29)
125
+ ld %r8, (5*8)(%r29)
126
+ ld %r9, (6*8)(%r29)
127
+ ld %r10, (7*8)(%r29)
119
128
  1:
120
129
 
121
130
  /* Load all the FP registers. */
122
131
  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)
132
+ addi %r29, %r29, -(14*8)
133
+ lfd %f1, ( 1*8)(%r29)
134
+ lfd %f2, ( 2*8)(%r29)
135
+ lfd %f3, ( 3*8)(%r29)
136
+ lfd %f4, ( 4*8)(%r29)
137
+ lfd %f5, ( 5*8)(%r29)
138
+ lfd %f6, ( 6*8)(%r29)
139
+ lfd %f7, ( 7*8)(%r29)
140
+ lfd %f8, ( 8*8)(%r29)
141
+ lfd %f9, ( 9*8)(%r29)
142
+ lfd %f10, (10*8)(%r29)
143
+ lfd %f11, (11*8)(%r29)
144
+ lfd %f12, (12*8)(%r29)
145
+ lfd %f13, (13*8)(%r29)
136
146
  2:
137
147
 
148
+ /* Load all the vector registers. */
149
+ bf- 3, 3f
150
+ addi %r29, %r29, -16
151
+ lvx %v13, 0, %r29
152
+ addi %r29, %r29, -16
153
+ lvx %v12, 0, %r29
154
+ addi %r29, %r29, -16
155
+ lvx %v11, 0, %r29
156
+ addi %r29, %r29, -16
157
+ lvx %v10, 0, %r29
158
+ addi %r29, %r29, -16
159
+ lvx %v9, 0, %r29
160
+ addi %r29, %r29, -16
161
+ lvx %v8, 0, %r29
162
+ addi %r29, %r29, -16
163
+ lvx %v7, 0, %r29
164
+ addi %r29, %r29, -16
165
+ lvx %v6, 0, %r29
166
+ addi %r29, %r29, -16
167
+ lvx %v5, 0, %r29
168
+ addi %r29, %r29, -16
169
+ lvx %v4, 0, %r29
170
+ addi %r29, %r29, -16
171
+ lvx %v3, 0, %r29
172
+ addi %r29, %r29, -16
173
+ lvx %v2, 0, %r29
174
+ 3:
175
+
138
176
  /* Make the call. */
139
177
  ld %r11, 8(%r28)
140
178
  bctrl
@@ -152,6 +190,7 @@ ffi_call_LINUX64:
152
190
  bt 31, .Lstruct_return_value
153
191
  bt 30, .Ldone_return_value
154
192
  bt 29, .Lfp_return_value
193
+ bt 28, .Lvec_return_value
155
194
  std %r3, 0(%r30)
156
195
  /* Fall through... */
157
196
 
@@ -167,12 +206,16 @@ ffi_call_LINUX64:
167
206
  ld %r31, -8(%r1)
168
207
  blr
169
208
 
209
+ .Lvec_return_value:
210
+ stvx %v2, 0, %r30
211
+ b .Ldone_return_value
212
+
170
213
  .Lfp_return_value:
171
214
  .cfi_def_cfa_register 28
172
- bf 28, .Lfloat_return_value
173
- stfd %f1, 0(%r30)
174
215
  mtcrf 0x02, %r31 /* cr6 */
175
- bf 27, .Ldone_return_value
216
+ bf 27, .Lfloat_return_value
217
+ stfd %f1, 0(%r30)
218
+ bf 26, .Ldone_return_value
176
219
  stfd %f2, 8(%r30)
177
220
  b .Ldone_return_value
178
221
  .Lfloat_return_value:
@@ -180,8 +223,9 @@ ffi_call_LINUX64:
180
223
  b .Ldone_return_value
181
224
 
182
225
  .Lstruct_return_value:
183
- bf 29, .Lsmall_struct
184
- bf 28, .Lfloat_homog_return_value
226
+ bf 29, .Lvec_homog_or_small_struct
227
+ mtcrf 0x02, %r31 /* cr6 */
228
+ bf 27, .Lfloat_homog_return_value
185
229
  stfd %f1, 0(%r30)
186
230
  stfd %f2, 8(%r30)
187
231
  stfd %f3, 16(%r30)
@@ -203,6 +247,25 @@ ffi_call_LINUX64:
203
247
  stfs %f8, 28(%r30)
204
248
  b .Ldone_return_value
205
249
 
250
+ .Lvec_homog_or_small_struct:
251
+ bf 28, .Lsmall_struct
252
+ stvx %v2, 0, %r30
253
+ addi %r30, %r30, 16
254
+ stvx %v3, 0, %r30
255
+ addi %r30, %r30, 16
256
+ stvx %v4, 0, %r30
257
+ addi %r30, %r30, 16
258
+ stvx %v5, 0, %r30
259
+ addi %r30, %r30, 16
260
+ stvx %v6, 0, %r30
261
+ addi %r30, %r30, 16
262
+ stvx %v7, 0, %r30
263
+ addi %r30, %r30, 16
264
+ stvx %v8, 0, %r30
265
+ addi %r30, %r30, 16
266
+ stvx %v9, 0, %r30
267
+ b .Ldone_return_value
268
+
206
269
  .Lsmall_struct:
207
270
  std %r3, 0(%r30)
208
271
  std %r4, 8(%r30)
@@ -37,8 +37,10 @@
37
37
  .cfi_startproc
38
38
  # if _CALL_ELF == 2
39
39
  ffi_closure_LINUX64:
40
+ # ifndef __PCREL__
40
41
  addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha
41
42
  addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l
43
+ # endif
42
44
  .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64
43
45
  # else
44
46
  .section ".opd","aw"
@@ -61,9 +63,15 @@ ffi_closure_LINUX64:
61
63
  # endif
62
64
 
63
65
  # 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
66
+ # ifdef __VEC__
67
+ # 32 byte special reg save area + 64 byte parm save area
68
+ # + 128 byte retval area + 13*8 fpr save area + 12*16 vec save area + round to 16
69
+ # define STACKFRAME 528
70
+ # else
71
+ # 32 byte special reg save area + 64 byte parm save area
72
+ # + 64 byte retval area + 13*8 fpr save area + round to 16
73
+ # define STACKFRAME 272
74
+ # endif
67
75
  # define PARMSAVE 32
68
76
  # define RETVAL PARMSAVE+64
69
77
  # else
@@ -143,9 +151,38 @@ ffi_closure_LINUX64:
143
151
  stfd %f12, -104+(11*8)(%r1)
144
152
  stfd %f13, -104+(12*8)(%r1)
145
153
 
146
- # load up the pointer to the saved fpr registers */
154
+ # load up the pointer to the saved fpr registers
147
155
  addi %r8, %r1, -104
148
156
 
157
+ # ifdef __VEC__
158
+ # load up the pointer to the saved vector registers
159
+ # 8 bytes padding for 16-byte alignment at -112(%r1)
160
+ addi %r9, %r8, -24
161
+ stvx %v13, 0, %r9
162
+ addi %r9, %r9, -16
163
+ stvx %v12, 0, %r9
164
+ addi %r9, %r9, -16
165
+ stvx %v11, 0, %r9
166
+ addi %r9, %r9, -16
167
+ stvx %v10, 0, %r9
168
+ addi %r9, %r9, -16
169
+ stvx %v9, 0, %r9
170
+ addi %r9, %r9, -16
171
+ stvx %v8, 0, %r9
172
+ addi %r9, %r9, -16
173
+ stvx %v7, 0, %r9
174
+ addi %r9, %r9, -16
175
+ stvx %v6, 0, %r9
176
+ addi %r9, %r9, -16
177
+ stvx %v5, 0, %r9
178
+ addi %r9, %r9, -16
179
+ stvx %v4, 0, %r9
180
+ addi %r9, %r9, -16
181
+ stvx %v3, 0, %r9
182
+ addi %r9, %r9, -16
183
+ stvx %v2, 0, %r9
184
+ # endif
185
+
149
186
  # load up the pointer to the result storage
150
187
  addi %r6, %r1, -STACKFRAME+RETVAL
151
188
 
@@ -155,11 +192,19 @@ ffi_closure_LINUX64:
155
192
 
156
193
  # make the call
157
194
  # if defined _CALL_LINUX || _CALL_ELF == 2
195
+ # ifdef __PCREL__
196
+ bl ffi_closure_helper_LINUX64@notoc
197
+ .Lret:
198
+ # else
158
199
  bl ffi_closure_helper_LINUX64
200
+ .Lret:
201
+ nop
202
+ # endif
159
203
  # else
160
204
  bl .ffi_closure_helper_LINUX64
161
- # endif
162
205
  .Lret:
206
+ nop
207
+ # endif
163
208
 
164
209
  # now r3 contains the return type
165
210
  # so use it to look up in a table
@@ -313,6 +358,16 @@ ffi_closure_LINUX64:
313
358
  .cfi_def_cfa_offset 0
314
359
  blr
315
360
  .cfi_def_cfa_offset STACKFRAME
361
+ # case FFI_V2_TYPE_VECTOR
362
+ addi %r3, %r1, RETVAL
363
+ lvx %v2, 0, %r3
364
+ mtlr %r0
365
+ b .Lfinish
366
+ # case FFI_V2_TYPE_VECTOR_HOMOG
367
+ addi %r3, %r1, RETVAL
368
+ lvx %v2, 0, %r3
369
+ addi %r3, %r3, 16
370
+ b .Lmorevector
316
371
  # case FFI_V2_TYPE_FLOAT_HOMOG
317
372
  lfs %f1, RETVAL+0(%r1)
318
373
  lfs %f2, RETVAL+4(%r1)
@@ -332,6 +387,25 @@ ffi_closure_LINUX64:
332
387
  .cfi_def_cfa_offset 0
333
388
  blr
334
389
  .cfi_def_cfa_offset STACKFRAME
390
+ .Lmorevector:
391
+ lvx %v3, 0, %r3
392
+ addi %r3, %r3, 16
393
+ lvx %v4, 0, %r3
394
+ addi %r3, %r3, 16
395
+ lvx %v5, 0, %r3
396
+ mtlr %r0
397
+ addi %r3, %r3, 16
398
+ lvx %v6, 0, %r3
399
+ addi %r3, %r3, 16
400
+ lvx %v7, 0, %r3
401
+ addi %r3, %r3, 16
402
+ lvx %v8, 0, %r3
403
+ addi %r3, %r3, 16
404
+ lvx %v9, 0, %r3
405
+ addi %r1, %r1, STACKFRAME
406
+ .cfi_def_cfa_offset 0
407
+ blr
408
+ .cfi_def_cfa_offset STACKFRAME
335
409
  .Lmorefloat:
336
410
  lfs %f4, RETVAL+12(%r1)
337
411
  mtlr %r0
@@ -396,8 +470,10 @@ ffi_closure_LINUX64:
396
470
  .cfi_startproc
397
471
  # if _CALL_ELF == 2
398
472
  ffi_go_closure_linux64:
473
+ # ifndef __PCREL__
399
474
  addis %r2, %r12, .TOC.-ffi_go_closure_linux64@ha
400
475
  addi %r2, %r2, .TOC.-ffi_go_closure_linux64@l
476
+ # endif
401
477
  .localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64
402
478
  # else
403
479
  .section ".opd","aw"
@@ -104,17 +104,16 @@ ENTRY(ffi_call_SYSV)
104
104
  bctrl
105
105
 
106
106
  /* Now, deal with the return value. */
107
- mtcrf 0x01,%r31 /* cr7 */
107
+ mtcrf 0x03,%r31 /* cr6-cr7 */
108
108
  bt- 31,L(small_struct_return_value)
109
109
  bt- 30,L(done_return_value)
110
110
  #ifndef __NO_FPRS__
111
111
  bt- 29,L(fp_return_value)
112
112
  #endif
113
113
  stw %r3,0(%r30)
114
- bf+ 28,L(done_return_value)
114
+ bf+ 27,L(done_return_value)
115
115
  stw %r4,4(%r30)
116
- mtcrf 0x02,%r31 /* cr6 */
117
- bf 27,L(done_return_value)
116
+ bf 26,L(done_return_value)
118
117
  stw %r5,8(%r30)
119
118
  stw %r6,12(%r30)
120
119
  /* Fall through... */
@@ -145,10 +144,9 @@ L(done_return_value):
145
144
  #ifndef __NO_FPRS__
146
145
  L(fp_return_value):
147
146
  .cfi_restore_state
148
- bf 28,L(float_return_value)
147
+ bf 27,L(float_return_value)
149
148
  stfd %f1,0(%r30)
150
- mtcrf 0x02,%r31 /* cr6 */
151
- bf 27,L(done_return_value)
149
+ bf 26,L(done_return_value)
152
150
  stfd %f2,8(%r30)
153
151
  b L(done_return_value)
154
152
  L(float_return_value):
@@ -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
+ #if (defined(_M_ARM64) || defined(__aarch64__)) && defined(_WIN32)
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;
@@ -59,6 +59,7 @@ typedef enum ffi_abi {
59
59
  /* ---- Definitions for closures ----------------------------------------- */
60
60
 
61
61
  #define FFI_CLOSURES 1
62
+ #define FFI_GO_CLOSURES 1
62
63
  #define FFI_TRAMPOLINE_SIZE 24
63
64
  #define FFI_NATIVE_RAW_API 0
64
65
  #define FFI_EXTRA_CIF_FIELDS unsigned riscv_nfixedargs; unsigned riscv_unused;
@@ -67,8 +67,8 @@
67
67
  intreg pad[rv32 ? 2 : 0];
68
68
  intreg save_fp, save_ra;
69
69
  }
70
- void ffi_call_asm(size_t *stackargs, struct call_context *regargs,
71
- void (*fn)(void));
70
+ void ffi_call_asm (size_t *stackargs, struct call_context *regargs,
71
+ void (*fn) (void), void *closure);
72
72
  */
73
73
 
74
74
  #define FRAME_LEN (8 * FLTS + 8 * PTRS + 16)
@@ -98,6 +98,7 @@ ffi_call_asm:
98
98
 
99
99
  # Load arguments
100
100
  mv t1, a2
101
+ mv t2, a3
101
102
 
102
103
  #if FLTS
103
104
  FLARG fa0, -FRAME_LEN+0*FLTS(fp)
@@ -145,8 +146,10 @@ ffi_call_asm:
145
146
 
146
147
  /*
147
148
  ffi_closure_asm. Expects address of the passed-in ffi_closure in t1.
148
- void ffi_closure_inner(size_t *stackargs, struct call_context *regargs,
149
- ffi_closure *closure);
149
+ void ffi_closure_inner (ffi_cif *cif,
150
+ void (*fun) (ffi_cif *, void *, void **, void *),
151
+ void *user_data,
152
+ size_t *stackargs, struct call_context *regargs)
150
153
  */
151
154
 
152
155
  .globl ffi_closure_asm
@@ -187,9 +190,11 @@ ffi_closure_asm:
187
190
  SARG a7, 8*FLTS+7*PTRS(sp)
188
191
 
189
192
  /* enter C */
190
- addi a0, sp, FRAME_LEN
191
- mv a1, sp
192
- mv a2, t1
193
+ LARG a0, FFI_TRAMPOLINE_SIZE+0*PTRS(t1)
194
+ LARG a1, FFI_TRAMPOLINE_SIZE+1*PTRS(t1)
195
+ LARG a2, FFI_TRAMPOLINE_SIZE+2*PTRS(t1)
196
+ addi a3, sp, FRAME_LEN
197
+ mv a4, sp
193
198
 
194
199
  call ffi_closure_inner
195
200
 
@@ -212,3 +217,77 @@ ffi_closure_asm:
212
217
  ret
213
218
  .cfi_endproc
214
219
  .size ffi_closure_asm, .-ffi_closure_asm
220
+
221
+ /*
222
+ ffi_go_closure_asm. Expects address of the passed-in ffi_go_closure in t2.
223
+ void ffi_closure_inner (ffi_cif *cif,
224
+ void (*fun) (ffi_cif *, void *, void **, void *),
225
+ void *user_data,
226
+ size_t *stackargs, struct call_context *regargs)
227
+ */
228
+
229
+ .globl ffi_go_closure_asm
230
+ .hidden ffi_go_closure_asm
231
+ .type ffi_go_closure_asm, @function
232
+ ffi_go_closure_asm:
233
+ .cfi_startproc
234
+
235
+ addi sp, sp, -FRAME_LEN
236
+ .cfi_def_cfa_offset FRAME_LEN
237
+
238
+ /* make a frame */
239
+ SARG fp, FRAME_LEN - 2*PTRS(sp)
240
+ .cfi_offset 8, -2*PTRS
241
+ SARG ra, FRAME_LEN - 1*PTRS(sp)
242
+ .cfi_offset 1, -1*PTRS
243
+ addi fp, sp, FRAME_LEN
244
+
245
+ /* save arguments */
246
+ #if FLTS
247
+ FSARG fa0, 0*FLTS(sp)
248
+ FSARG fa1, 1*FLTS(sp)
249
+ FSARG fa2, 2*FLTS(sp)
250
+ FSARG fa3, 3*FLTS(sp)
251
+ FSARG fa4, 4*FLTS(sp)
252
+ FSARG fa5, 5*FLTS(sp)
253
+ FSARG fa6, 6*FLTS(sp)
254
+ FSARG fa7, 7*FLTS(sp)
255
+ #endif
256
+
257
+ SARG a0, 8*FLTS+0*PTRS(sp)
258
+ SARG a1, 8*FLTS+1*PTRS(sp)
259
+ SARG a2, 8*FLTS+2*PTRS(sp)
260
+ SARG a3, 8*FLTS+3*PTRS(sp)
261
+ SARG a4, 8*FLTS+4*PTRS(sp)
262
+ SARG a5, 8*FLTS+5*PTRS(sp)
263
+ SARG a6, 8*FLTS+6*PTRS(sp)
264
+ SARG a7, 8*FLTS+7*PTRS(sp)
265
+
266
+ /* enter C */
267
+ LARG a0, 1*PTRS(t2)
268
+ LARG a1, 2*PTRS(t2)
269
+ mv a2, t2
270
+ addi a3, sp, FRAME_LEN
271
+ mv a4, sp
272
+
273
+ call ffi_closure_inner
274
+
275
+ /* return values */
276
+ #if FLTS
277
+ FLARG fa0, 0*FLTS(sp)
278
+ FLARG fa1, 1*FLTS(sp)
279
+ #endif
280
+
281
+ LARG a0, 8*FLTS+0*PTRS(sp)
282
+ LARG a1, 8*FLTS+1*PTRS(sp)
283
+
284
+ /* restore and return */
285
+ LARG ra, FRAME_LEN-1*PTRS(sp)
286
+ .cfi_restore 1
287
+ LARG fp, FRAME_LEN-2*PTRS(sp)
288
+ .cfi_restore 8
289
+ addi sp, sp, FRAME_LEN
290
+ .cfi_def_cfa_offset 0
291
+ ret
292
+ .cfi_endproc
293
+ .size ffi_go_closure_asm, .-ffi_go_closure_asm