ffi 1.9.25 → 1.12.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (285) hide show
  1. checksums.yaml +4 -4
  2. data/{appveyor.yml → .appveyor.yml} +7 -2
  3. data/.gitignore +3 -0
  4. data/.gitmodules +1 -0
  5. data/.travis.yml +22 -30
  6. data/CHANGELOG.md +107 -0
  7. data/Gemfile +2 -2
  8. data/README.md +29 -17
  9. data/Rakefile +17 -89
  10. data/ext/ffi_c/AbstractMemory.c +5 -9
  11. data/ext/ffi_c/Call.c +18 -39
  12. data/ext/ffi_c/Call.h +4 -7
  13. data/ext/ffi_c/DynamicLibrary.c +1 -1
  14. data/ext/ffi_c/Function.c +29 -113
  15. data/ext/ffi_c/LastError.c +47 -2
  16. data/ext/ffi_c/LongDouble.c +7 -7
  17. data/ext/ffi_c/Platform.c +0 -47
  18. data/ext/ffi_c/Struct.c +47 -51
  19. data/ext/ffi_c/Struct.h +12 -6
  20. data/ext/ffi_c/StructLayout.c +13 -12
  21. data/ext/ffi_c/Thread.c +6 -222
  22. data/ext/ffi_c/Thread.h +2 -13
  23. data/ext/ffi_c/Type.c +0 -18
  24. data/ext/ffi_c/Type.h +0 -1
  25. data/ext/ffi_c/Types.c +1 -1
  26. data/ext/ffi_c/Variadic.c +9 -15
  27. data/ext/ffi_c/extconf.rb +34 -21
  28. data/ext/ffi_c/ffi.c +3 -8
  29. data/ext/ffi_c/libffi/.appveyor.yml +29 -13
  30. data/ext/ffi_c/libffi/.gitattributes +4 -0
  31. data/ext/ffi_c/libffi/.travis/bfin-sim.exp +58 -0
  32. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +14 -0
  33. data/ext/ffi_c/libffi/.travis/build-in-container.sh +12 -0
  34. data/ext/ffi_c/libffi/.travis/build.sh +112 -8
  35. data/ext/ffi_c/libffi/.travis/install.sh +65 -16
  36. data/ext/ffi_c/libffi/.travis/m32r-sim.exp +58 -0
  37. data/ext/ffi_c/libffi/.travis/or1k-sim.exp +58 -0
  38. data/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +58 -0
  39. data/ext/ffi_c/libffi/.travis/site.exp +10 -1
  40. data/ext/ffi_c/libffi/.travis/wine-sim.exp +55 -0
  41. data/ext/ffi_c/libffi/.travis.yml +47 -2
  42. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  43. data/ext/ffi_c/libffi/LICENSE +1 -1
  44. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +5 -4
  45. data/ext/ffi_c/libffi/Makefile.am +33 -40
  46. data/ext/ffi_c/libffi/Makefile.in +392 -176
  47. data/ext/ffi_c/libffi/README.md +23 -8
  48. data/ext/ffi_c/libffi/configure +319 -343
  49. data/ext/ffi_c/libffi/configure.ac +6 -2
  50. data/ext/ffi_c/libffi/configure.host +26 -9
  51. data/ext/ffi_c/libffi/doc/Makefile.in +9 -5
  52. data/ext/ffi_c/libffi/doc/libffi.texi +26 -14
  53. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  54. data/ext/ffi_c/libffi/fficonfig.h.in +4 -0
  55. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +1 -3
  56. data/ext/ffi_c/libffi/include/Makefile.in +10 -6
  57. data/ext/ffi_c/libffi/include/ffi.h.in +11 -7
  58. data/ext/ffi_c/libffi/include/ffi_common.h +5 -1
  59. data/ext/ffi_c/libffi/install-sh +23 -13
  60. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  61. data/ext/ffi_c/libffi/ltmain.sh +153 -60
  62. data/ext/ffi_c/libffi/m4/asmcfi.m4 +1 -1
  63. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  64. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  65. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +2 -1
  66. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  67. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  68. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  69. data/ext/ffi_c/libffi/man/Makefile.in +9 -5
  70. data/ext/ffi_c/libffi/missing +8 -8
  71. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  72. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  73. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  74. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  75. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  76. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  77. data/ext/ffi_c/libffi/msvcc.sh +27 -2
  78. data/ext/ffi_c/libffi/src/aarch64/ffi.c +126 -58
  79. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +13 -2
  80. data/ext/ffi_c/libffi/src/aarch64/sysv.S +8 -6
  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 +41 -9
  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/linux.S +23 -2
  92. data/ext/ffi_c/libffi/src/powerpc/ffi.c +6 -4
  93. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +211 -32
  94. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  95. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  96. data/ext/ffi_c/libffi/src/powerpc/linux64.S +83 -28
  97. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +68 -4
  98. data/ext/ffi_c/libffi/src/prep_cif.c +4 -2
  99. data/ext/ffi_c/libffi/src/riscv/ffi.c +42 -6
  100. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  101. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  102. data/ext/ffi_c/libffi/src/x86/ffi.c +14 -6
  103. data/ext/ffi_c/libffi/src/x86/ffi64.c +5 -3
  104. data/ext/ffi_c/libffi/src/x86/ffiw64.c +5 -2
  105. data/ext/ffi_c/libffi/src/x86/sysv.S +90 -4
  106. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +995 -0
  107. data/ext/ffi_c/libffi/src/x86/unix64.S +41 -0
  108. data/ext/ffi_c/libffi/src/x86/win64.S +5 -0
  109. data/ext/ffi_c/libffi/testsuite/Makefile.am +114 -109
  110. data/ext/ffi_c/libffi/testsuite/Makefile.in +124 -84
  111. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +26 -22
  112. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  113. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -1
  114. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +1 -1
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +9 -8
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -1
  118. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  119. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +138 -0
  120. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +1 -1
  121. data/ext/ffi_c/libffi.darwin.mk +1 -1
  122. data/ext/ffi_c/rbffi.h +0 -2
  123. data/ffi.gemspec +12 -5
  124. data/lib/ffi/data_converter.rb +67 -0
  125. data/lib/ffi/ffi.rb +2 -0
  126. data/lib/ffi/library.rb +6 -6
  127. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  128. data/lib/ffi/platform/aarch64-freebsd12/types.conf +128 -0
  129. data/lib/ffi/platform/aarch64-linux/types.conf +81 -81
  130. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  131. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  132. data/lib/ffi/platform/arm-linux/types.conf +79 -79
  133. data/lib/ffi/platform/i386-cygwin/types.conf +1 -1
  134. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  135. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  136. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  137. data/lib/ffi/platform/i386-gnu/types.conf +84 -84
  138. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  139. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  140. data/lib/ffi/platform/i386-openbsd/types.conf +89 -89
  141. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  142. data/lib/ffi/platform/i386-windows/types.conf +84 -84
  143. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  144. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  145. data/lib/ffi/platform/mips64-linux/types.conf +81 -81
  146. data/lib/ffi/platform/mips64el-linux/types.conf +81 -81
  147. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  148. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +79 -79
  149. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +79 -79
  150. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +81 -81
  151. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +81 -81
  152. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  153. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  154. data/lib/ffi/platform/powerpc-linux/types.conf +77 -77
  155. data/lib/ffi/platform/powerpc64-linux/types.conf +81 -81
  156. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  157. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  158. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  159. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  160. data/lib/ffi/platform/sparc64-linux/types.conf +79 -79
  161. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  162. data/lib/ffi/platform/x86_64-cygwin/types.conf +1 -1
  163. data/lib/ffi/platform/x86_64-darwin/types.conf +84 -84
  164. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +148 -0
  165. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -90
  166. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  167. data/lib/ffi/platform/x86_64-linux/types.conf +86 -77
  168. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -89
  169. data/lib/ffi/platform/x86_64-openbsd/types.conf +86 -86
  170. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  171. data/lib/ffi/platform/x86_64-windows/types.conf +99 -99
  172. data/lib/ffi/platform.rb +13 -2
  173. data/lib/ffi/pointer.rb +5 -6
  174. data/lib/ffi/struct.rb +5 -66
  175. data/lib/ffi/struct_by_reference.rb +72 -0
  176. data/lib/ffi/struct_layout.rb +96 -0
  177. data/lib/ffi/tools/const_generator.rb +5 -4
  178. data/lib/ffi/tools/generator.rb +47 -2
  179. data/lib/ffi/tools/generator_task.rb +13 -17
  180. data/lib/ffi/tools/struct_generator.rb +4 -4
  181. data/lib/ffi/tools/types_generator.rb +5 -4
  182. data/lib/ffi/types.rb +1 -1
  183. data/lib/ffi/version.rb +1 -1
  184. metadata +144 -115
  185. data/ext/ffi_c/DataConverter.c +0 -91
  186. data/ext/ffi_c/StructByReference.c +0 -190
  187. data/ext/ffi_c/StructByReference.h +0 -50
  188. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  189. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  190. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  191. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +0 -0
  192. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +0 -0
  193. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +0 -0
  194. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +0 -0
  195. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +0 -0
  196. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +0 -0
  197. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +0 -0
  198. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +0 -0
  199. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +0 -0
  200. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +0 -0
  201. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +0 -0
  202. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +0 -0
  203. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +0 -0
  204. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +0 -0
  205. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +0 -0
  206. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +0 -0
  207. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +0 -0
  208. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +0 -0
  209. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +0 -0
  210. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +0 -0
  211. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +0 -0
  212. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +0 -0
  213. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +0 -0
  214. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +0 -0
  215. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +0 -0
  216. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +0 -0
  217. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +0 -0
  218. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +0 -0
  219. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +0 -0
  220. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +0 -0
  221. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +0 -0
  222. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +0 -0
  223. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +0 -0
  224. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +0 -0
  225. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +0 -0
  226. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +0 -0
  227. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +0 -0
  228. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +0 -0
  229. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +0 -0
  230. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +0 -0
  231. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +0 -0
  232. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +0 -0
  233. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +0 -0
  234. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +0 -0
  235. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +0 -0
  236. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +0 -0
  237. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +0 -0
  238. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  239. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +0 -0
  240. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +0 -0
  241. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +0 -0
  242. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +0 -0
  243. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  244. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  245. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +0 -0
  246. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +0 -0
  247. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +0 -0
  248. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +0 -0
  249. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +0 -0
  250. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +0 -0
  251. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +0 -0
  252. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +0 -0
  253. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +0 -0
  254. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +0 -0
  255. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +0 -0
  256. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +0 -0
  257. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +0 -0
  258. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar_va.c +0 -0
  259. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +0 -0
  260. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +0 -0
  261. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +0 -0
  262. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +0 -0
  263. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +0 -0
  264. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort_va.c +0 -0
  265. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  266. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +0 -0
  267. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +0 -0
  268. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +0 -0
  269. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +0 -0
  270. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +0 -0
  271. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +0 -0
  272. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +0 -0
  273. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +0 -0
  274. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +0 -0
  275. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +0 -0
  276. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +0 -0
  277. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +0 -0
  278. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  279. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  280. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  281. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +0 -0
  282. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +0 -0
  283. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +0 -0
  284. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +0 -0
  285. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +0 -0
@@ -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
@@ -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;
@@ -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
@@ -29,7 +29,7 @@
29
29
  DEALINGS IN THE SOFTWARE.
30
30
  ----------------------------------------------------------------------- */
31
31
 
32
- #ifndef __x86_64__
32
+ #if defined(__i386__) || defined(_M_IX86)
33
33
  #include <ffi.h>
34
34
  #include <ffi_common.h>
35
35
  #include <stdint.h>
@@ -51,6 +51,13 @@
51
51
  # define __declspec(x) __attribute__((x))
52
52
  #endif
53
53
 
54
+ #if defined(_MSC_VER) && defined(_M_IX86)
55
+ /* Stack is not 16-byte aligned on Windows. */
56
+ #define STACK_ALIGN(bytes) (bytes)
57
+ #else
58
+ #define STACK_ALIGN(bytes) FFI_ALIGN (bytes, 16)
59
+ #endif
60
+
54
61
  /* Perform machine dependent cif processing. */
55
62
  ffi_status FFI_HIDDEN
56
63
  ffi_prep_cif_machdep(ffi_cif *cif)
@@ -177,7 +184,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
177
184
  bytes = FFI_ALIGN (bytes, t->alignment);
178
185
  bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG);
179
186
  }
180
- cif->bytes = FFI_ALIGN (bytes, 16);
187
+ cif->bytes = bytes;
181
188
 
182
189
  return FFI_OK;
183
190
  }
@@ -285,7 +292,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
285
292
  }
286
293
  }
287
294
 
288
- bytes = cif->bytes;
295
+ bytes = STACK_ALIGN (cif->bytes);
289
296
  stack = alloca(bytes + sizeof(*frame) + rsize);
290
297
  argp = (dir < 0 ? stack + bytes : stack);
291
298
  frame = (struct call_frame *)(stack + bytes);
@@ -429,7 +436,7 @@ ffi_closure_inner (struct closure_frame *frame, char *stack)
429
436
  rvalue = frame->rettemp;
430
437
  pabi = &abi_params[cabi];
431
438
  dir = pabi->dir;
432
- argp = (dir < 0 ? stack + cif->bytes : stack);
439
+ argp = (dir < 0 ? stack + STACK_ALIGN (cif->bytes) : stack);
433
440
 
434
441
  switch (flags)
435
442
  {
@@ -545,6 +552,7 @@ ffi_prep_closure_loc (ffi_closure* closure,
545
552
  case FFI_REGISTER:
546
553
  dest = ffi_closure_REGISTER;
547
554
  op = 0x68; /* pushl imm */
555
+ break;
548
556
  default:
549
557
  return FFI_BAD_ABI;
550
558
  }
@@ -692,7 +700,7 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue)
692
700
  }
693
701
  }
694
702
 
695
- bytes = cif->bytes;
703
+ bytes = STACK_ALIGN (cif->bytes);
696
704
  argp = stack =
697
705
  (void *)((uintptr_t)alloca(bytes + sizeof(*frame) + rsize + 15) & ~16);
698
706
  frame = (struct call_frame *)(stack + bytes);
@@ -750,4 +758,4 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue)
750
758
  ffi_call_i386 (frame, stack);
751
759
  }
752
760
  #endif /* !FFI_NO_RAW_API */
753
- #endif /* !__x86_64__ */
761
+ #endif /* __i386__ */
@@ -282,7 +282,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
282
282
 
283
283
  /* The X86_64_SSEUP_CLASS should be always preceded by
284
284
  X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
285
- if (classes[i] == X86_64_SSEUP_CLASS
285
+ if (i > 1 && classes[i] == X86_64_SSEUP_CLASS
286
286
  && classes[i - 1] != X86_64_SSE_CLASS
287
287
  && classes[i - 1] != X86_64_SSEUP_CLASS)
288
288
  {
@@ -293,7 +293,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
293
293
 
294
294
  /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
295
295
  everything should be passed in memory. */
296
- if (classes[i] == X86_64_X87UP_CLASS
296
+ if (i > 1 && classes[i] == X86_64_X87UP_CLASS
297
297
  && (classes[i - 1] != X86_64_X87_CLASS))
298
298
  {
299
299
  /* The first one should never be X86_64_X87UP_CLASS. */
@@ -394,7 +394,7 @@ extern ffi_status
394
394
  ffi_prep_cif_machdep_efi64(ffi_cif *cif);
395
395
  #endif
396
396
 
397
- ffi_status
397
+ ffi_status FFI_HIDDEN
398
398
  ffi_prep_cif_machdep (ffi_cif *cif)
399
399
  {
400
400
  int gprcount, ssecount, i, avn, ngpr, nsse;
@@ -451,9 +451,11 @@ ffi_prep_cif_machdep (ffi_cif *cif)
451
451
  case FFI_TYPE_DOUBLE:
452
452
  flags = UNIX64_RET_XMM64;
453
453
  break;
454
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
454
455
  case FFI_TYPE_LONGDOUBLE:
455
456
  flags = UNIX64_RET_X87;
456
457
  break;
458
+ #endif
457
459
  case FFI_TYPE_STRUCT:
458
460
  n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
459
461
  if (n == 0)
@@ -25,6 +25,7 @@
25
25
  DEALINGS IN THE SOFTWARE.
26
26
  ----------------------------------------------------------------------- */
27
27
 
28
+ #if defined(__x86_64__) || defined(_M_AMD64)
28
29
  #include <ffi.h>
29
30
  #include <ffi_common.h>
30
31
  #include <stdlib.h>
@@ -33,7 +34,7 @@
33
34
  #ifdef X86_WIN64
34
35
  #define EFI64(name) name
35
36
  #else
36
- #define EFI64(name) name##_efi64
37
+ #define EFI64(name) FFI_HIDDEN name##_efi64
37
38
  #endif
38
39
 
39
40
  struct win64_call_frame
@@ -48,7 +49,7 @@ struct win64_call_frame
48
49
  extern void ffi_call_win64 (void *stack, struct win64_call_frame *,
49
50
  void *closure) FFI_HIDDEN;
50
51
 
51
- ffi_status
52
+ ffi_status FFI_HIDDEN
52
53
  EFI64(ffi_prep_cif_machdep)(ffi_cif *cif)
53
54
  {
54
55
  int flags, n;
@@ -306,3 +307,5 @@ ffi_closure_win64_inner(ffi_cif *cif,
306
307
  fun (cif, rvalue, avalue, user_data);
307
308
  return flags;
308
309
  }
310
+
311
+ #endif /* __x86_64__ */