ffi 1.0.0 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (694) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +4 -0
  3. data/CHANGELOG.md +465 -0
  4. data/COPYING +49 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE +21 -11
  7. data/LICENSE.SPECS +22 -0
  8. data/README.md +137 -0
  9. data/Rakefile +165 -148
  10. data/ext/ffi_c/AbstractMemory.c +716 -97
  11. data/ext/ffi_c/AbstractMemory.h +38 -17
  12. data/ext/ffi_c/ArrayType.c +102 -33
  13. data/ext/ffi_c/ArrayType.h +20 -18
  14. data/ext/ffi_c/Buffer.c +229 -54
  15. data/ext/ffi_c/Call.c +211 -100
  16. data/ext/ffi_c/Call.h +46 -28
  17. data/ext/ffi_c/ClosurePool.c +110 -81
  18. data/ext/ffi_c/ClosurePool.h +31 -1
  19. data/ext/ffi_c/DynamicLibrary.c +216 -54
  20. data/ext/ffi_c/DynamicLibrary.h +76 -0
  21. data/ext/ffi_c/Function.c +527 -164
  22. data/ext/ffi_c/Function.h +24 -20
  23. data/ext/ffi_c/FunctionInfo.c +151 -50
  24. data/ext/ffi_c/LastError.c +112 -28
  25. data/ext/ffi_c/LastError.h +29 -0
  26. data/ext/ffi_c/LongDouble.c +65 -0
  27. data/ext/ffi_c/LongDouble.h +47 -0
  28. data/ext/ffi_c/MappedType.c +107 -42
  29. data/ext/ffi_c/MappedType.h +20 -20
  30. data/ext/ffi_c/MemoryPointer.c +108 -46
  31. data/ext/ffi_c/MemoryPointer.h +33 -4
  32. data/ext/ffi_c/MethodHandle.c +71 -67
  33. data/ext/ffi_c/MethodHandle.h +26 -23
  34. data/ext/ffi_c/Platform.c +42 -25
  35. data/ext/ffi_c/Platform.h +32 -3
  36. data/ext/ffi_c/Pointer.c +324 -51
  37. data/ext/ffi_c/Pointer.h +29 -18
  38. data/ext/ffi_c/Struct.c +434 -161
  39. data/ext/ffi_c/Struct.h +47 -27
  40. data/ext/ffi_c/StructByValue.c +74 -37
  41. data/ext/ffi_c/StructByValue.h +20 -18
  42. data/ext/ffi_c/StructLayout.c +358 -87
  43. data/ext/ffi_c/Thread.c +129 -0
  44. data/ext/ffi_c/Thread.h +76 -0
  45. data/ext/ffi_c/Type.c +241 -76
  46. data/ext/ffi_c/Type.h +27 -11
  47. data/ext/ffi_c/Types.c +54 -34
  48. data/ext/ffi_c/Types.h +24 -24
  49. data/ext/ffi_c/Variadic.c +151 -55
  50. data/ext/ffi_c/compat.h +48 -38
  51. data/ext/ffi_c/extconf.rb +106 -34
  52. data/ext/ffi_c/ffi.c +35 -26
  53. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  54. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  55. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  56. data/ext/ffi_c/libffi/.appveyor.yml +84 -0
  57. data/ext/ffi_c/libffi/.ci/ar-lib +270 -0
  58. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  60. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  61. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  62. data/ext/ffi_c/libffi/.ci/compile +351 -0
  63. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  64. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  65. data/ext/ffi_c/libffi/.ci/moxie-sim.exp +60 -0
  66. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  67. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  68. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  69. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  70. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  71. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  72. data/ext/ffi_c/libffi/.gitattributes +4 -0
  73. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  74. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  75. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  76. data/ext/ffi_c/libffi/.gitignore +46 -0
  77. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6528 -3180
  78. data/ext/ffi_c/libffi/LICENSE +3 -3
  79. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  80. data/ext/ffi_c/libffi/Makefile.am +132 -162
  81. data/ext/ffi_c/libffi/Makefile.in +1339 -1003
  82. data/ext/ffi_c/libffi/README.md +531 -0
  83. data/ext/ffi_c/libffi/acinclude.m4 +289 -4
  84. data/ext/ffi_c/libffi/autogen.sh +2 -0
  85. data/ext/ffi_c/libffi/compile +227 -21
  86. data/ext/ffi_c/libffi/config.guess +1034 -778
  87. data/ext/ffi_c/libffi/config.sub +1394 -1204
  88. data/ext/ffi_c/libffi/configure +14327 -8503
  89. data/ext/ffi_c/libffi/configure.ac +294 -247
  90. data/ext/ffi_c/libffi/configure.host +330 -4
  91. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  92. data/ext/ffi_c/libffi/doc/Makefile.in +818 -0
  93. data/ext/ffi_c/libffi/doc/libffi.texi +572 -67
  94. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  95. data/ext/ffi_c/libffi/fficonfig.h.in +53 -46
  96. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +312 -0
  97. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  98. data/ext/ffi_c/libffi/include/Makefile.in +219 -79
  99. data/ext/ffi_c/libffi/include/ffi.h.in +230 -111
  100. data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
  101. data/ext/ffi_c/libffi/include/ffi_common.h +78 -16
  102. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  103. data/ext/ffi_c/libffi/install-sh +402 -184
  104. data/ext/ffi_c/libffi/libffi.map.in +81 -0
  105. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  106. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
  107. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  108. data/ext/ffi_c/libffi/libtool-version +2 -2
  109. data/ext/ffi_c/libffi/ltmain.sh +5752 -2722
  110. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  111. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
  112. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +198 -0
  113. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +158 -0
  114. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
  115. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +119 -0
  116. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +49 -0
  117. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  118. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +267 -0
  119. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  120. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  121. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  122. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  123. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  124. data/ext/ffi_c/libffi/man/Makefile.in +174 -57
  125. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  126. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  127. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  128. data/ext/ffi_c/libffi/missing +155 -300
  129. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  130. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  131. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  132. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  133. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  134. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  135. data/ext/ffi_c/libffi/msvcc.sh +353 -0
  136. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1142 -0
  137. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
  138. data/ext/ffi_c/libffi/src/aarch64/internal.h +100 -0
  139. data/ext/ffi_c/libffi/src/aarch64/sysv.S +695 -0
  140. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  141. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  142. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  143. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  144. data/ext/ffi_c/libffi/src/alpha/osf.S +162 -246
  145. data/ext/ffi_c/libffi/src/arc/arcompact.S +210 -0
  146. data/ext/ffi_c/libffi/src/arc/ffi.c +443 -0
  147. data/ext/ffi_c/libffi/src/arc/ffitarget.h +67 -0
  148. data/ext/ffi_c/libffi/src/arm/ffi.c +806 -194
  149. data/ext/ffi_c/libffi/src/arm/ffitarget.h +43 -3
  150. data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
  151. data/ext/ffi_c/libffi/src/arm/sysv.S +381 -231
  152. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  153. data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
  154. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +8 -3
  155. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  156. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  157. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  158. data/ext/ffi_c/libffi/src/closures.c +574 -100
  159. data/ext/ffi_c/libffi/src/cris/ffi.c +11 -8
  160. data/ext/ffi_c/libffi/src/cris/ffitarget.h +8 -3
  161. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  162. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  163. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  164. data/ext/ffi_c/libffi/src/debug.c +8 -3
  165. data/ext/ffi_c/libffi/src/dlmalloc.c +89 -17
  166. data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
  167. data/ext/ffi_c/libffi/src/frv/ffitarget.h +8 -7
  168. data/ext/ffi_c/libffi/src/ia64/ffi.c +48 -12
  169. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +10 -4
  170. data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
  171. data/ext/ffi_c/libffi/src/java_raw_api.c +24 -6
  172. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  173. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  174. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  175. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  176. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  177. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  178. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  179. data/ext/ffi_c/libffi/src/m32r/ffi.c +32 -15
  180. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +8 -3
  181. data/ext/ffi_c/libffi/src/m68k/ffi.c +97 -13
  182. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +8 -3
  183. data/ext/ffi_c/libffi/src/m68k/sysv.S +148 -25
  184. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  185. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  186. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  187. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  188. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  189. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  190. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  191. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  192. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  193. data/ext/ffi_c/libffi/src/mips/ffi.c +392 -104
  194. data/ext/ffi_c/libffi/src/mips/ffitarget.h +40 -24
  195. data/ext/ffi_c/libffi/src/mips/n32.S +325 -93
  196. data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
  197. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  198. data/ext/ffi_c/libffi/src/moxie/ffi.c +310 -0
  199. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  200. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  201. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  202. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  203. data/ext/ffi_c/libffi/src/or1k/ffi.c +341 -0
  204. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  205. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  206. data/ext/ffi_c/libffi/src/pa/ffi.c +68 -111
  207. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  208. data/ext/ffi_c/libffi/src/pa/ffitarget.h +34 -17
  209. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  210. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  211. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  212. data/ext/ffi_c/libffi/src/powerpc/aix.S +250 -8
  213. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +255 -4
  214. data/ext/ffi_c/libffi/src/powerpc/asm.h +3 -3
  215. data/ext/ffi_c/libffi/src/powerpc/darwin.S +211 -78
  216. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +356 -102
  217. data/ext/ffi_c/libffi/src/powerpc/ffi.c +108 -1375
  218. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +746 -210
  219. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
  220. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
  221. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  222. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +126 -48
  223. data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
  224. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
  225. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  226. data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
  227. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  228. data/ext/ffi_c/libffi/src/prep_cif.c +141 -32
  229. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  230. data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
  231. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  232. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  233. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  234. data/ext/ffi_c/libffi/src/s390/ffitarget.h +13 -3
  235. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  236. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  237. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  238. data/ext/ffi_c/libffi/src/sh/ffitarget.h +8 -3
  239. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  240. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +8 -3
  241. data/ext/ffi_c/libffi/src/sparc/ffi.c +334 -491
  242. data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
  243. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -5
  244. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  245. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  246. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  247. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  248. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  249. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  250. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  251. data/ext/ffi_c/libffi/src/types.c +48 -19
  252. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  253. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  254. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  255. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  256. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  257. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  258. data/ext/ffi_c/libffi/src/x86/ffi.c +690 -540
  259. data/ext/ffi_c/libffi/src/x86/ffi64.c +450 -126
  260. data/ext/ffi_c/libffi/src/x86/ffitarget.h +86 -42
  261. data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
  262. data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
  263. data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
  264. data/ext/ffi_c/libffi/src/x86/sysv.S +1199 -381
  265. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  266. data/ext/ffi_c/libffi/src/x86/unix64.S +587 -298
  267. data/ext/ffi_c/libffi/src/x86/win64.S +251 -457
  268. data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
  269. data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
  270. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
  271. data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
  272. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  273. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
  274. data/ext/ffi_c/libffi/testsuite/Makefile.in +251 -117
  275. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  276. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  277. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  278. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  279. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  280. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  281. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +682 -0
  282. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
  283. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -10
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +4 -3
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +88 -42
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +6 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +9 -10
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +134 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  350. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  351. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  352. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  353. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  354. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  355. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  356. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  357. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  358. data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
  359. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
  360. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
  361. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
  362. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
  363. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
  364. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
  365. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
  366. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
  367. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
  368. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
  369. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
  370. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
  371. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
  372. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
  373. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
  374. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
  375. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
  376. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
  377. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
  378. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
  379. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
  380. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
  381. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
  382. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
  383. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
  384. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
  385. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
  386. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
  387. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
  388. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
  389. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
  390. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
  391. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
  392. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +23 -5
  393. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
  394. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
  395. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +24 -5
  396. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
  397. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +21 -9
  398. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  399. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +13 -3
  400. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +34 -11
  401. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
  403. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  404. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  405. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  406. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  407. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  408. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  409. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +7 -2
  410. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +22 -10
  411. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  412. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  413. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
  415. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  416. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
  419. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +8 -5
  420. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  421. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +2 -3
  422. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  423. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +57 -56
  424. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
  425. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
  426. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
  427. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  430. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +15 -6
  431. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
  432. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
  433. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
  434. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
  435. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
  436. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
  437. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
  438. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  441. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
  442. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
  443. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
  444. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +7 -6
  445. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
  446. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
  447. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  457. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  458. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  459. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  460. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  461. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  462. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  463. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  464. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -10
  465. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  466. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  467. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  468. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  469. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  470. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  471. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  472. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  473. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  474. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  475. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  476. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  477. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  478. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  479. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  480. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  481. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  482. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  483. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  484. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  485. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  486. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  487. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  488. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  489. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  490. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  491. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  492. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  493. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  494. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  495. data/ext/ffi_c/libffi.bsd.mk +14 -8
  496. data/ext/ffi_c/libffi.darwin.mk +56 -26
  497. data/ext/ffi_c/libffi.gnu.mk +9 -6
  498. data/ext/ffi_c/libffi.mk +13 -8
  499. data/ext/ffi_c/libffi.vc.mk +26 -0
  500. data/ext/ffi_c/libffi.vc64.mk +26 -0
  501. data/ext/ffi_c/rbffi.h +34 -6
  502. data/ext/ffi_c/{endian.h → rbffi_endian.h} +21 -2
  503. data/ffi.gemspec +42 -0
  504. data/lib/ffi/abstract_memory.rb +44 -0
  505. data/lib/ffi/autopointer.rb +111 -52
  506. data/lib/ffi/compat.rb +43 -0
  507. data/lib/ffi/data_converter.rb +67 -0
  508. data/lib/ffi/dynamic_library.rb +118 -0
  509. data/lib/ffi/enum.rb +203 -22
  510. data/lib/ffi/errno.rb +27 -12
  511. data/lib/ffi/ffi.rb +88 -11
  512. data/lib/ffi/function.rb +71 -0
  513. data/lib/ffi/io.rb +35 -14
  514. data/lib/ffi/library.rb +382 -96
  515. data/lib/ffi/library_path.rb +109 -0
  516. data/lib/ffi/managedstruct.rb +64 -35
  517. data/lib/ffi/memorypointer.rb +1 -33
  518. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  519. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  520. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  521. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  522. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  523. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  524. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  525. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  526. data/lib/ffi/platform/arm-linux/types.conf +132 -0
  527. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  528. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  529. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  530. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  531. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  532. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  533. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  534. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  535. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  536. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  537. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  538. data/lib/ffi/platform/i386-windows/types.conf +52 -0
  539. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  540. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  541. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  542. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  543. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  544. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  545. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  546. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  547. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  548. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  549. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  550. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  551. data/lib/ffi/platform/powerpc-linux/types.conf +130 -0
  552. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  553. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  554. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  555. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  556. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  557. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  558. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  559. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  560. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  561. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  562. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  563. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  564. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  565. data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
  566. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  567. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  568. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  569. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  570. data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
  571. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  572. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  573. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  574. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  575. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  576. data/lib/ffi/platform.rb +110 -34
  577. data/lib/ffi/pointer.rb +117 -90
  578. data/lib/ffi/struct.rb +101 -70
  579. data/lib/ffi/struct_by_reference.rb +72 -0
  580. data/lib/ffi/struct_layout.rb +96 -0
  581. data/lib/ffi/struct_layout_builder.rb +90 -21
  582. data/lib/ffi/tools/const_generator.rb +86 -31
  583. data/lib/ffi/tools/generator.rb +49 -2
  584. data/lib/ffi/tools/generator_task.rb +13 -16
  585. data/lib/ffi/tools/struct_generator.rb +6 -5
  586. data/lib/ffi/tools/types_generator.rb +25 -11
  587. data/lib/ffi/types.rb +105 -36
  588. data/lib/ffi/union.rb +23 -12
  589. data/lib/ffi/variadic.rb +44 -29
  590. data/lib/ffi/version.rb +3 -0
  591. data/lib/ffi.rb +25 -9
  592. data/rakelib/ffi_gem_helper.rb +65 -0
  593. data/samples/getlogin.rb +8 -0
  594. data/samples/getpid.rb +8 -0
  595. data/samples/gettimeofday.rb +18 -0
  596. data/samples/hello.rb +8 -0
  597. data/samples/hello_ractor.rb +11 -0
  598. data/samples/inotify.rb +60 -0
  599. data/samples/pty.rb +75 -0
  600. data/samples/qsort.rb +20 -0
  601. data/samples/qsort_ractor.rb +28 -0
  602. data/sig/ffi/abstract_memory.rbs +165 -0
  603. data/sig/ffi/auto_pointer.rbs +26 -0
  604. data/sig/ffi/buffer.rbs +18 -0
  605. data/sig/ffi/data_converter.rbs +10 -0
  606. data/sig/ffi/dynamic_library.rbs +9 -0
  607. data/sig/ffi/enum.rbs +38 -0
  608. data/sig/ffi/function.rbs +39 -0
  609. data/sig/ffi/library.rbs +42 -0
  610. data/sig/ffi/native_type.rbs +86 -0
  611. data/sig/ffi/pointer.rbs +42 -0
  612. data/sig/ffi/struct.rbs +76 -0
  613. data/sig/ffi/struct_by_reference.rbs +11 -0
  614. data/sig/ffi/struct_by_value.rbs +7 -0
  615. data/sig/ffi/struct_layout.rbs +9 -0
  616. data/sig/ffi/struct_layout_builder.rbs +5 -0
  617. data/sig/ffi/type.rbs +39 -0
  618. data/sig/ffi.rbs +26 -0
  619. data.tar.gz.sig +0 -0
  620. metadata +547 -248
  621. metadata.gz.sig +0 -0
  622. data/History.txt +0 -109
  623. data/README.rdoc +0 -70
  624. data/ext/ffi_c/DataConverter.c +0 -62
  625. data/ext/ffi_c/StructByReference.c +0 -150
  626. data/ext/ffi_c/StructByReference.h +0 -50
  627. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -658
  628. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  629. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  630. data/ext/ffi_c/libffi/README +0 -306
  631. data/ext/ffi_c/libffi/aclocal.m4 +0 -8998
  632. data/ext/ffi_c/libffi/depcomp +0 -584
  633. data/ext/ffi_c/libffi/doc/libffi.info +0 -533
  634. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  635. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7360
  636. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -368
  637. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  638. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  639. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -92
  640. data/ext/ffi_c/libffi/mdate-sh +0 -201
  641. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  642. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  643. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  644. data/ext/ffi_c/libffi/src/x86/win32.S +0 -877
  645. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  646. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  647. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  648. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  649. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  650. data/gen/Rakefile +0 -14
  651. data/spec/ffi/async_callback_spec.rb +0 -23
  652. data/spec/ffi/bool_spec.rb +0 -24
  653. data/spec/ffi/buffer_spec.rb +0 -202
  654. data/spec/ffi/callback_spec.rb +0 -653
  655. data/spec/ffi/custom_param_type.rb +0 -31
  656. data/spec/ffi/custom_type_spec.rb +0 -73
  657. data/spec/ffi/enum_spec.rb +0 -183
  658. data/spec/ffi/errno_spec.rb +0 -13
  659. data/spec/ffi/ffi_spec.rb +0 -24
  660. data/spec/ffi/function_spec.rb +0 -73
  661. data/spec/ffi/library_spec.rb +0 -174
  662. data/spec/ffi/managed_struct_spec.rb +0 -56
  663. data/spec/ffi/number_spec.rb +0 -231
  664. data/spec/ffi/pointer_spec.rb +0 -210
  665. data/spec/ffi/rbx/attach_function_spec.rb +0 -28
  666. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -109
  667. data/spec/ffi/rbx/spec_helper.rb +0 -1
  668. data/spec/ffi/rbx/struct_spec.rb +0 -13
  669. data/spec/ffi/spec_helper.rb +0 -21
  670. data/spec/ffi/string_spec.rb +0 -103
  671. data/spec/ffi/strptr_spec.rb +0 -36
  672. data/spec/ffi/struct_callback_spec.rb +0 -64
  673. data/spec/ffi/struct_initialize_spec.rb +0 -30
  674. data/spec/ffi/struct_packed_spec.rb +0 -46
  675. data/spec/ffi/struct_spec.rb +0 -638
  676. data/spec/ffi/typedef_spec.rb +0 -62
  677. data/spec/ffi/union_spec.rb +0 -60
  678. data/spec/ffi/variadic_spec.rb +0 -84
  679. data/spec/spec.opts +0 -4
  680. data/tasks/ann.rake +0 -80
  681. data/tasks/extension.rake +0 -25
  682. data/tasks/gem.rake +0 -200
  683. data/tasks/git.rake +0 -41
  684. data/tasks/notes.rake +0 -27
  685. data/tasks/post_load.rake +0 -34
  686. data/tasks/rdoc.rake +0 -50
  687. data/tasks/rubyforge.rake +0 -55
  688. data/tasks/setup.rb +0 -301
  689. data/tasks/spec.rake +0 -54
  690. data/tasks/svn.rake +0 -47
  691. data/tasks/test.rake +0 -40
  692. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  693. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  694. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
@@ -1,6 +1,7 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi.c - Copyright (c) 1996, 2007, 2008 Red Hat, Inc.
3
- Copyright (c) 2008 David Daney
2
+ ffi.c - Copyright (c) 2011 Anthony Green
3
+ Copyright (c) 2008 David Daney
4
+ Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc.
4
5
 
5
6
  MIPS Foreign Function Interface
6
7
 
@@ -28,7 +29,9 @@
28
29
  #include <ffi.h>
29
30
  #include <ffi_common.h>
30
31
 
32
+ #include <stdint.h>
31
33
  #include <stdlib.h>
34
+ #include <stdio.h>
32
35
 
33
36
  #ifdef __GNUC__
34
37
  # if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
@@ -37,7 +40,13 @@
37
40
  #endif
38
41
 
39
42
  #ifndef USE__BUILTIN___CLEAR_CACHE
40
- #include <sys/cachectl.h>
43
+ # if defined(__FreeBSD__)
44
+ # include <machine/sysarch.h>
45
+ # elif defined(__OpenBSD__)
46
+ # include <mips64/sysarch.h>
47
+ # else
48
+ # include <sys/cachectl.h>
49
+ # endif
41
50
  #endif
42
51
 
43
52
  #ifdef FFI_DEBUG
@@ -69,22 +78,39 @@ static void ffi_prep_args(char *stack,
69
78
  {
70
79
  int i;
71
80
  void **p_argv;
72
- char *argp;
81
+ char *argp, *argp_f;
73
82
  ffi_type **p_arg;
74
83
 
84
+ memset(stack, 0, bytes);
85
+
75
86
  #ifdef FFI_MIPS_N32
87
+ int soft_float = (ecif->cif->abi == FFI_N32_SOFT_FLOAT
88
+ || ecif->cif->abi == FFI_N64_SOFT_FLOAT);
76
89
  /* If more than 8 double words are used, the remainder go
77
90
  on the stack. We reorder stuff on the stack here to
78
91
  support this easily. */
79
- if (bytes > 8 * sizeof(ffi_arg))
80
- argp = &stack[bytes - (8 * sizeof(ffi_arg))];
92
+ /* if ret is _Complex long double, args reg shift2, and a0 should holds pointer to rvalue */
93
+ if (ecif->cif->rtype->type == FFI_TYPE_COMPLEX && ecif->cif->rtype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
94
+ {
95
+ if (bytes + 16 > 8 * sizeof(ffi_arg))
96
+ argp = &stack[bytes - (8 * sizeof(ffi_arg))];
97
+ else
98
+ argp = stack;
99
+ * (unsigned long *) argp = (unsigned long) ecif->rvalue;
100
+ argp += 16;
101
+ }
81
102
  else
82
- argp = stack;
103
+ {
104
+ if (bytes > 8 * sizeof(ffi_arg))
105
+ argp = &stack[bytes - (8 * sizeof(ffi_arg))];
106
+ else
107
+ argp = stack;
108
+ }
83
109
  #else
84
110
  argp = stack;
85
111
  #endif
86
112
 
87
- memset(stack, 0, bytes);
113
+ argp_f = argp;
88
114
 
89
115
  #ifdef FFI_MIPS_N32
90
116
  if ( ecif->cif->rstruct_flag != 0 )
@@ -111,7 +137,7 @@ static void ffi_prep_args(char *stack,
111
137
 
112
138
  if ((a - 1) & (unsigned long) argp)
113
139
  {
114
- argp = (char *) ALIGN(argp, a);
140
+ argp = (char *) FFI_ALIGN(argp, a);
115
141
  FIX_ARGP;
116
142
  }
117
143
 
@@ -125,7 +151,7 @@ static void ffi_prep_args(char *stack,
125
151
  if (type == FFI_TYPE_POINTER)
126
152
  type = (ecif->cif->abi == FFI_N64
127
153
  || ecif->cif->abi == FFI_N64_SOFT_FLOAT)
128
- ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
154
+ ? FFI_TYPE_SINT64 : FFI_TYPE_UINT32;
129
155
 
130
156
  if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT
131
157
  || ecif->cif->abi == FFI_N64_SOFT_FLOAT))
@@ -165,9 +191,35 @@ static void ffi_prep_args(char *stack,
165
191
  break;
166
192
 
167
193
  case FFI_TYPE_UINT32:
194
+ #ifdef FFI_MIPS_N32
195
+ /* The N32 ABI requires that 32-bit integers
196
+ be sign-extended to 64-bits, regardless of
197
+ whether they are signed or unsigned. */
198
+ *(ffi_arg *)argp = *(SINT32 *)(* p_argv);
199
+ #else
168
200
  *(ffi_arg *)argp = *(UINT32 *)(* p_argv);
201
+ #endif
169
202
  break;
170
203
 
204
+ #ifdef FFI_MIPS_N32
205
+ case FFI_TYPE_COMPLEX:
206
+ /* expand from 4+4 to 8+8 if pass with fpr reg */
207
+ /* argp will wind back to stack when we process all of reg args */
208
+ /* all var_args passed with gpr, should be expand */
209
+ if(!soft_float
210
+ && (*p_arg)->elements[0]->type == FFI_TYPE_FLOAT
211
+ && argp>=argp_f
212
+ && i < ecif->cif->mips_nfixedargs)
213
+ {
214
+ *(float *) argp = *(float *)(* p_argv);
215
+ argp += z;
216
+ char *tmp = (void *) (*p_argv);
217
+ *(float *) argp = *(float *)(tmp+4);
218
+ }
219
+ else
220
+ memcpy(argp, *p_argv, (*p_arg)->size);
221
+ break;
222
+ #endif
171
223
  /* This can only happen with 64bit slots. */
172
224
  case FFI_TYPE_FLOAT:
173
225
  *(float *) argp = *(float *)(* p_argv);
@@ -220,6 +272,24 @@ static void ffi_prep_args(char *stack,
220
272
  passed in an integer register". This code traverses structure
221
273
  definitions and generates the appropriate flags. */
222
274
 
275
+ static int
276
+ calc_n32_struct_flags_element(unsigned *flags, ffi_type *e,
277
+ unsigned *loc, unsigned *arg_reg)
278
+ {
279
+ /* Align this object. */
280
+ *loc = FFI_ALIGN(*loc, e->alignment);
281
+ if (e->type == FFI_TYPE_DOUBLE)
282
+ {
283
+ /* Already aligned to FFI_SIZEOF_ARG. */
284
+ *arg_reg = *loc / FFI_SIZEOF_ARG;
285
+ if (*arg_reg > 7)
286
+ return 1;
287
+ *flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
288
+ }
289
+ *loc += e->size;
290
+ return 0;
291
+ }
292
+
223
293
  static unsigned
224
294
  calc_n32_struct_flags(int soft_float, ffi_type *arg,
225
295
  unsigned *loc, unsigned *arg_reg)
@@ -234,23 +304,20 @@ calc_n32_struct_flags(int soft_float, ffi_type *arg,
234
304
 
235
305
  while ((e = arg->elements[index]))
236
306
  {
237
- /* Align this object. */
238
- *loc = ALIGN(*loc, e->alignment);
239
- if (e->type == FFI_TYPE_DOUBLE)
307
+ if (e->type == FFI_TYPE_COMPLEX)
240
308
  {
241
- /* Already aligned to FFI_SIZEOF_ARG. */
242
- *arg_reg = *loc / FFI_SIZEOF_ARG;
243
- if (*arg_reg > 7)
244
- break;
245
- flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
246
- *loc += e->size;
309
+ if (calc_n32_struct_flags_element(&flags, e->elements[0], loc, arg_reg))
310
+ break;
311
+ if (calc_n32_struct_flags_element(&flags, e->elements[0], loc, arg_reg))
312
+ break;
247
313
  }
248
314
  else
249
- *loc += e->size;
315
+ if (calc_n32_struct_flags_element(&flags, e, loc, arg_reg))
316
+ break;
250
317
  index++;
251
318
  }
252
319
  /* Next Argument register at alignment of FFI_SIZEOF_ARG. */
253
- *arg_reg = ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
320
+ *arg_reg = FFI_ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
254
321
 
255
322
  return flags;
256
323
  }
@@ -258,7 +325,7 @@ calc_n32_struct_flags(int soft_float, ffi_type *arg,
258
325
  static unsigned
259
326
  calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
260
327
  {
261
- unsigned flags = 0;
328
+ unsigned flags;
262
329
  unsigned small = FFI_TYPE_SMALLSTRUCT;
263
330
  ffi_type *e;
264
331
 
@@ -277,51 +344,67 @@ calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
277
344
 
278
345
  e = arg->elements[0];
279
346
 
280
- if (e->type == FFI_TYPE_DOUBLE)
281
- flags = FFI_TYPE_DOUBLE;
282
- else if (e->type == FFI_TYPE_FLOAT)
283
- flags = FFI_TYPE_FLOAT;
284
-
285
- if (flags && (e = arg->elements[1]))
347
+ if (e->type == FFI_TYPE_COMPLEX)
286
348
  {
287
- if (e->type == FFI_TYPE_DOUBLE)
288
- flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS;
289
- else if (e->type == FFI_TYPE_FLOAT)
290
- flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS;
291
- else
349
+ int type = e->elements[0]->type;
350
+
351
+ if (type != FFI_TYPE_DOUBLE && type != FFI_TYPE_FLOAT)
292
352
  return small;
293
353
 
294
- if (flags && (arg->elements[2]))
354
+ if (arg->elements[1])
295
355
  {
296
- /* There are three arguments and the first two are
297
- floats! This must be passed the old way. */
356
+ /* Two floating point fields with more fields!
357
+ This must be passed the old way. */
298
358
  return small;
299
359
  }
300
- if (soft_float)
301
- flags += FFI_TYPE_STRUCT_SOFT;
360
+
361
+ flags = (type << FFI_FLAG_BITS) + type;
302
362
  }
303
363
  else
304
- if (!flags)
305
- return small;
364
+ {
365
+ if (e->type != FFI_TYPE_DOUBLE && e->type != FFI_TYPE_FLOAT)
366
+ return small;
367
+
368
+ flags = e->type;
369
+
370
+ if (arg->elements[1])
371
+ {
372
+ e = arg->elements[1];
373
+ if (e->type != FFI_TYPE_DOUBLE && e->type != FFI_TYPE_FLOAT)
374
+ return small;
306
375
 
376
+ if (arg->elements[2])
377
+ {
378
+ /* There are three arguments and the first two are
379
+ floats! This must be passed the old way. */
380
+ return small;
381
+ }
382
+
383
+ flags += e->type << FFI_FLAG_BITS;
384
+ }
385
+ }
386
+
387
+ if (soft_float)
388
+ flags += FFI_TYPE_STRUCT_SOFT;
307
389
  return flags;
308
390
  }
309
391
 
310
392
  #endif
311
393
 
312
394
  /* Perform machine dependent cif processing */
313
- ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
395
+ static ffi_status ffi_prep_cif_machdep_int(ffi_cif *cif, unsigned nfixedargs)
314
396
  {
315
397
  cif->flags = 0;
398
+ cif->mips_nfixedargs = nfixedargs;
316
399
 
317
400
  #ifdef FFI_MIPS_O32
318
401
  /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT
319
402
  * does not have special handling for floating point args.
320
403
  */
321
404
 
322
- if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32)
405
+ if (cif->rtype->type != FFI_TYPE_STRUCT && cif->rtype->type != FFI_TYPE_COMPLEX && cif->abi == FFI_O32)
323
406
  {
324
- if (cif->nargs > 0)
407
+ if (cif->nargs > 0 && cif->nargs == nfixedargs)
325
408
  {
326
409
  switch ((cif->arg_types)[0]->type)
327
410
  {
@@ -387,7 +470,10 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
387
470
  case FFI_TYPE_STRUCT:
388
471
  case FFI_TYPE_FLOAT:
389
472
  case FFI_TYPE_DOUBLE:
473
+ case FFI_TYPE_COMPLEX:
390
474
  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
475
+ if (cif->rtype->type == FFI_TYPE_COMPLEX)
476
+ cif->flags += ((*cif->rtype->elements[0]).type) << (FFI_FLAG_BITS * 4);
391
477
  break;
392
478
 
393
479
  case FFI_TYPE_SINT64:
@@ -405,7 +491,6 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
405
491
  #ifdef FFI_MIPS_N32
406
492
  /* Set the flags necessary for N32 processing */
407
493
  {
408
- int type;
409
494
  unsigned arg_reg = 0;
410
495
  unsigned loc = 0;
411
496
  unsigned count = (cif->nargs < 8) ? cif->nargs : 8;
@@ -437,34 +522,21 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
437
522
 
438
523
  while (count-- > 0 && arg_reg < 8)
439
524
  {
440
- type = (cif->arg_types)[index]->type;
441
- if (soft_float)
442
- {
443
- switch (type)
444
- {
445
- case FFI_TYPE_FLOAT:
446
- type = FFI_TYPE_UINT32;
447
- break;
448
- case FFI_TYPE_DOUBLE:
449
- type = FFI_TYPE_UINT64;
450
- break;
451
- default:
452
- break;
453
- }
454
- }
455
- switch (type)
525
+ ffi_type *t = cif->arg_types[index];
526
+
527
+ switch (t->type)
456
528
  {
457
529
  case FFI_TYPE_FLOAT:
458
530
  case FFI_TYPE_DOUBLE:
459
- cif->flags +=
460
- ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS));
531
+ if (!soft_float && index < nfixedargs)
532
+ cif->flags += t->type << (arg_reg * FFI_FLAG_BITS);
461
533
  arg_reg++;
462
534
  break;
463
535
  case FFI_TYPE_LONGDOUBLE:
464
536
  /* Align it. */
465
- arg_reg = ALIGN(arg_reg, 2);
537
+ arg_reg = FFI_ALIGN(arg_reg, 2);
466
538
  /* Treat it as two adjacent doubles. */
467
- if (soft_float)
539
+ if (soft_float || index >= nfixedargs)
468
540
  {
469
541
  arg_reg += 2;
470
542
  }
@@ -473,17 +545,71 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
473
545
  cif->flags +=
474
546
  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
475
547
  arg_reg++;
548
+ if (arg_reg >= 8)
549
+ continue;
476
550
  cif->flags +=
477
551
  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
478
552
  arg_reg++;
479
553
  }
480
554
  break;
481
555
 
556
+ case FFI_TYPE_COMPLEX:
557
+ switch (t->elements[0]->type)
558
+ {
559
+ case FFI_TYPE_LONGDOUBLE:
560
+ arg_reg = FFI_ALIGN(arg_reg, 2);
561
+ if (soft_float || index >= nfixedargs)
562
+ {
563
+ arg_reg += 2;
564
+ }
565
+ else
566
+ {
567
+ cif->flags +=
568
+ (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
569
+ arg_reg++;
570
+ if (arg_reg >= 8)
571
+ continue;
572
+ cif->flags +=
573
+ (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
574
+ arg_reg++;
575
+ if (arg_reg >= 8)
576
+ continue;
577
+ }
578
+ /* passthrough */
579
+ case FFI_TYPE_FLOAT:
580
+ // one fpr can only holds one arg even it is single
581
+ cif->bytes += 16;
582
+ /* passthrough */
583
+ case FFI_TYPE_SINT32:
584
+ case FFI_TYPE_UINT32:
585
+ case FFI_TYPE_DOUBLE:
586
+ if (soft_float || index >= nfixedargs)
587
+ {
588
+ arg_reg += 2;
589
+ }
590
+ else
591
+ {
592
+ uint32_t type = t->elements[0]->type != FFI_TYPE_LONGDOUBLE? t->elements[0]->type: FFI_TYPE_DOUBLE;
593
+ cif->flags +=
594
+ (type << (arg_reg * FFI_FLAG_BITS));
595
+ arg_reg++;
596
+ if (arg_reg >= 8)
597
+ continue;
598
+ cif->flags +=
599
+ (type << (arg_reg * FFI_FLAG_BITS));
600
+ arg_reg++;
601
+ }
602
+ break;
603
+ default:
604
+ arg_reg += 2;
605
+ break;
606
+ }
607
+ break;
608
+
482
609
  case FFI_TYPE_STRUCT:
483
610
  loc = arg_reg * FFI_SIZEOF_ARG;
484
- cif->flags += calc_n32_struct_flags(soft_float,
485
- (cif->arg_types)[index],
486
- &loc, &arg_reg);
611
+ cif->flags += calc_n32_struct_flags(soft_float || index >= nfixedargs,
612
+ t, &loc, &arg_reg);
487
613
  break;
488
614
 
489
615
  default:
@@ -523,7 +649,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
523
649
  if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32)
524
650
  cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
525
651
  else
526
- cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
652
+ cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
527
653
  break;
528
654
 
529
655
  case FFI_TYPE_FLOAT:
@@ -535,7 +661,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
535
661
  /* else fall through */
536
662
  case FFI_TYPE_DOUBLE:
537
663
  if (soft_float)
538
- cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
664
+ cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
539
665
  else
540
666
  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
541
667
  break;
@@ -545,8 +671,9 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
545
671
  two doubles. */
546
672
  if (soft_float)
547
673
  {
548
- cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
549
- cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8));
674
+ /* if ret is long double, the ret is given by v0 and a0, no idea why
675
+ * Let's us VOID | VOID | LONGDOUBLE for it*/
676
+ cif->flags += FFI_TYPE_LONGDOUBLE << (FFI_FLAG_BITS * 8);
550
677
  }
551
678
  else
552
679
  {
@@ -556,27 +683,79 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
556
683
  << (4 + (FFI_FLAG_BITS * 8));
557
684
  }
558
685
  break;
686
+ case FFI_TYPE_COMPLEX:
687
+ {
688
+ int type = cif->rtype->elements[0]->type;
689
+
690
+ cif->flags += (FFI_TYPE_COMPLEX << (FFI_FLAG_BITS * 8));
691
+ if (soft_float || (type != FFI_TYPE_FLOAT && type != FFI_TYPE_DOUBLE && type != FFI_TYPE_LONGDOUBLE))
692
+ {
693
+ switch (type)
694
+ {
695
+ case FFI_TYPE_DOUBLE:
696
+ case FFI_TYPE_SINT64:
697
+ case FFI_TYPE_UINT64:
698
+ case FFI_TYPE_INT:
699
+ type = FFI_TYPE_SMALLSTRUCT2;
700
+ break;
701
+ case FFI_TYPE_LONGDOUBLE:
702
+ type = FFI_TYPE_LONGDOUBLE;
703
+ break;
704
+ case FFI_TYPE_FLOAT:
705
+ default:
706
+ type = FFI_TYPE_SMALLSTRUCT;
707
+ }
708
+ cif->flags += type << (4 + (FFI_FLAG_BITS * 8));
709
+ }
710
+ else
711
+ {
712
+ //cif->flags += (type + (type << FFI_FLAG_BITS))
713
+ // << (4 + (FFI_FLAG_BITS * 8));
714
+ cif->flags += type << (4 + (FFI_FLAG_BITS * 8));
715
+ }
716
+ break;
717
+ }
718
+ case FFI_TYPE_UINT32:
719
+ /* In the N32 or N64 ABI unsigned 32-bit integer should be
720
+ *sign*-extended. */
721
+ cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
722
+ break;
723
+ case FFI_TYPE_SINT64:
724
+ cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
725
+ break;
559
726
  default:
560
- cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
727
+ cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
561
728
  break;
562
729
  }
563
730
  }
564
731
  #endif
565
-
566
732
  return FFI_OK;
567
733
  }
568
734
 
735
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
736
+ {
737
+ return ffi_prep_cif_machdep_int(cif, cif->nargs);
738
+ }
739
+
740
+ ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
741
+ unsigned nfixedargs,
742
+ unsigned ntotalargs MAYBE_UNUSED)
743
+ {
744
+ return ffi_prep_cif_machdep_int(cif, nfixedargs);
745
+ }
746
+
569
747
  /* Low level routine for calling O32 functions */
570
748
  extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int),
571
749
  extended_cif *, unsigned,
572
- unsigned, unsigned *, void (*)(void));
750
+ unsigned, unsigned *, void (*)(void), void *closure);
573
751
 
574
752
  /* Low level routine for calling N32 functions */
575
753
  extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int),
576
754
  extended_cif *, unsigned,
577
- unsigned, void *, void (*)(void));
755
+ unsigned, void *, void (*)(void), void *closure);
578
756
 
579
- void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
757
+ void ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue,
758
+ void **avalue, void *closure)
580
759
  {
581
760
  extended_cif ecif;
582
761
 
@@ -587,7 +766,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
587
766
  /* value address then we need to make one */
588
767
 
589
768
  if ((rvalue == NULL) &&
590
- (cif->rtype->type == FFI_TYPE_STRUCT))
769
+ (cif->rtype->type == FFI_TYPE_STRUCT || cif->rtype->type == FFI_TYPE_COMPLEX))
591
770
  ecif.rvalue = alloca(cif->rtype->size);
592
771
  else
593
772
  ecif.rvalue = rvalue;
@@ -598,7 +777,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
598
777
  case FFI_O32:
599
778
  case FFI_O32_SOFT_FLOAT:
600
779
  ffi_call_O32(ffi_prep_args, &ecif, cif->bytes,
601
- cif->flags, ecif.rvalue, fn);
780
+ cif->flags, ecif.rvalue, fn, closure);
602
781
  break;
603
782
  #endif
604
783
 
@@ -630,7 +809,7 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
630
809
  #endif
631
810
  }
632
811
  ffi_call_N32(ffi_prep_args, &ecif, cif->bytes,
633
- cif->flags, rvalue_copy, fn);
812
+ cif->flags, rvalue_copy, fn, closure);
634
813
  if (copy_rvalue)
635
814
  memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size);
636
815
  }
@@ -643,11 +822,27 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
643
822
  }
644
823
  }
645
824
 
825
+ void
826
+ ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
827
+ {
828
+ ffi_call_int (cif, fn, rvalue, avalue, NULL);
829
+ }
830
+
831
+ void
832
+ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
833
+ void **avalue, void *closure)
834
+ {
835
+ ffi_call_int (cif, fn, rvalue, avalue, closure);
836
+ }
837
+
838
+
646
839
  #if FFI_CLOSURES
647
840
  #if defined(FFI_MIPS_O32)
648
841
  extern void ffi_closure_O32(void);
842
+ extern void ffi_go_closure_O32(void);
649
843
  #else
650
844
  extern void ffi_closure_N32(void);
845
+ extern void ffi_go_closure_N32(void);
651
846
  #endif /* FFI_MIPS_O32 */
652
847
 
653
848
  ffi_status
@@ -662,10 +857,19 @@ ffi_prep_closure_loc (ffi_closure *closure,
662
857
  char *clear_location = (char *) codeloc;
663
858
 
664
859
  #if defined(FFI_MIPS_O32)
665
- FFI_ASSERT(cif->abi == FFI_O32 || cif->abi == FFI_O32_SOFT_FLOAT);
860
+ if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
861
+ return FFI_BAD_ABI;
666
862
  fn = ffi_closure_O32;
667
- #else /* FFI_MIPS_N32 */
668
- FFI_ASSERT(cif->abi == FFI_N32 || cif->abi == FFI_N64);
863
+ #else
864
+ #if _MIPS_SIM ==_ABIN32
865
+ if (cif->abi != FFI_N32
866
+ && cif->abi != FFI_N32_SOFT_FLOAT)
867
+ return FFI_BAD_ABI;
868
+ #else
869
+ if (cif->abi != FFI_N64
870
+ && cif->abi != FFI_N64_SOFT_FLOAT)
871
+ return FFI_BAD_ABI;
872
+ #endif
669
873
  fn = ffi_closure_N32;
670
874
  #endif /* FFI_MIPS_O32 */
671
875
 
@@ -677,7 +881,11 @@ ffi_prep_closure_loc (ffi_closure *closure,
677
881
  /* lui $12,high(codeloc) */
678
882
  tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16);
679
883
  /* jr $25 */
884
+ #if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
680
885
  tramp[3] = 0x03200008;
886
+ #else
887
+ tramp[3] = 0x03200009;
888
+ #endif
681
889
  /* ori $12,low(codeloc) */
682
890
  tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff);
683
891
  #else
@@ -705,7 +913,11 @@ ffi_prep_closure_loc (ffi_closure *closure,
705
913
  /* ori $25,low(fn) */
706
914
  tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff);
707
915
  /* jr $25 */
916
+ #if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
708
917
  tramp[11] = 0x03200008;
918
+ #else
919
+ tramp[11] = 0x03200009;
920
+ #endif
709
921
  /* ori $12,low(codeloc) */
710
922
  tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff);
711
923
 
@@ -715,11 +927,13 @@ ffi_prep_closure_loc (ffi_closure *closure,
715
927
  closure->fun = fun;
716
928
  closure->user_data = user_data;
717
929
 
930
+ #if !defined(__FreeBSD__)
718
931
  #ifdef USE__BUILTIN___CLEAR_CACHE
719
932
  __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);
720
933
  #else
721
934
  cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE);
722
935
  #endif
936
+ #endif /* ! __FreeBSD__ */
723
937
  return FFI_OK;
724
938
  }
725
939
 
@@ -741,26 +955,32 @@ ffi_prep_closure_loc (ffi_closure *closure,
741
955
  * Based on the similar routine for sparc.
742
956
  */
743
957
  int
744
- ffi_closure_mips_inner_O32 (ffi_closure *closure,
958
+ ffi_closure_mips_inner_O32 (ffi_cif *cif,
959
+ void (*fun)(ffi_cif*, void*, void**, void*),
960
+ void *user_data,
745
961
  void *rvalue, ffi_arg *ar,
746
962
  double *fpr)
747
963
  {
748
- ffi_cif *cif;
749
964
  void **avaluep;
750
965
  ffi_arg *avalue;
751
966
  ffi_type **arg_types;
752
967
  int i, avn, argn, seen_int;
753
968
 
754
- cif = closure->cif;
755
969
  avalue = alloca (cif->nargs * sizeof (ffi_arg));
756
970
  avaluep = alloca (cif->nargs * sizeof (ffi_arg));
757
971
 
758
- seen_int = (cif->abi == FFI_O32_SOFT_FLOAT);
972
+ seen_int = (cif->abi == FFI_O32_SOFT_FLOAT) || (cif->mips_nfixedargs != cif->nargs);
759
973
  argn = 0;
760
974
 
761
975
  if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT)
762
976
  {
763
- rvalue = (void *)(UINT32)ar[0];
977
+ rvalue = (void *)(uintptr_t)ar[0];
978
+ argn = 1;
979
+ seen_int = 1;
980
+ }
981
+ if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_COMPLEX)
982
+ {
983
+ rvalue = fpr;
764
984
  argn = 1;
765
985
  }
766
986
 
@@ -770,6 +990,8 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
770
990
 
771
991
  while (i < avn)
772
992
  {
993
+ if (arg_types[i]->alignment == 8 && (argn & 0x1))
994
+ argn++;
773
995
  if (i < 2 && !seen_int &&
774
996
  (arg_types[i]->type == FFI_TYPE_FLOAT ||
775
997
  arg_types[i]->type == FFI_TYPE_DOUBLE ||
@@ -784,8 +1006,6 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
784
1006
  }
785
1007
  else
786
1008
  {
787
- if (arg_types[i]->alignment == 8 && (argn & 0x1))
788
- argn++;
789
1009
  switch (arg_types[i]->type)
790
1010
  {
791
1011
  case FFI_TYPE_SINT8:
@@ -814,12 +1034,12 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
814
1034
  }
815
1035
  seen_int = 1;
816
1036
  }
817
- argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
1037
+ argn += FFI_ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
818
1038
  i++;
819
1039
  }
820
1040
 
821
1041
  /* Invoke the closure. */
822
- (closure->fun) (cif, rvalue, avaluep, closure->user_data);
1042
+ fun(cif, rvalue, avaluep, user_data);
823
1043
 
824
1044
  if (cif->abi == FFI_O32_SOFT_FLOAT)
825
1045
  {
@@ -835,6 +1055,9 @@ ffi_closure_mips_inner_O32 (ffi_closure *closure,
835
1055
  }
836
1056
  else
837
1057
  {
1058
+ if (cif->rtype->type == FFI_TYPE_COMPLEX) {
1059
+ __asm__ volatile ("move $v1, %0" : : "r"(cif->rtype->size));
1060
+ }
838
1061
  return cif->rtype->type;
839
1062
  }
840
1063
  }
@@ -855,7 +1078,7 @@ copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type,
855
1078
  char *argp;
856
1079
  char *fpp;
857
1080
 
858
- o = ALIGN(offset, elt_type->alignment);
1081
+ o = FFI_ALIGN(offset, elt_type->alignment);
859
1082
  arg_offset += o - offset;
860
1083
  offset = o;
861
1084
  argn += arg_offset / sizeof(ffi_arg);
@@ -895,11 +1118,12 @@ copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type,
895
1118
  *
896
1119
  */
897
1120
  int
898
- ffi_closure_mips_inner_N32 (ffi_closure *closure,
1121
+ ffi_closure_mips_inner_N32 (ffi_cif *cif,
1122
+ void (*fun)(ffi_cif*, void*, void**, void*),
1123
+ void *user_data,
899
1124
  void *rvalue, ffi_arg *ar,
900
1125
  ffi_arg *fpr)
901
1126
  {
902
- ffi_cif *cif;
903
1127
  void **avaluep;
904
1128
  ffi_arg *avalue;
905
1129
  ffi_type **arg_types;
@@ -907,7 +1131,6 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
907
1131
  int soft_float;
908
1132
  ffi_arg *argp;
909
1133
 
910
- cif = closure->cif;
911
1134
  soft_float = cif->abi == FFI_N64_SOFT_FLOAT
912
1135
  || cif->abi == FFI_N32_SOFT_FLOAT;
913
1136
  avalue = alloca (cif->nargs * sizeof (ffi_arg));
@@ -924,6 +1147,8 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
924
1147
  #endif
925
1148
  argn = 1;
926
1149
  }
1150
+ if (cif->rtype->type == FFI_TYPE_COMPLEX && cif->rtype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
1151
+ argn = 2;
927
1152
 
928
1153
  i = 0;
929
1154
  avn = cif->nargs;
@@ -935,10 +1160,10 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
935
1160
  || arg_types[i]->type == FFI_TYPE_DOUBLE
936
1161
  || arg_types[i]->type == FFI_TYPE_LONGDOUBLE)
937
1162
  {
938
- argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn;
939
- if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1)))
1163
+ argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
1164
+ if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((uintptr_t)argp & (arg_types[i]->alignment-1)))
940
1165
  {
941
- argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment);
1166
+ argp=(ffi_arg*)FFI_ALIGN(argp,arg_types[i]->alignment);
942
1167
  argn++;
943
1168
  }
944
1169
  #if defined(__MIPSEB__) || defined(_MIPSEB)
@@ -948,22 +1173,47 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
948
1173
  #endif
949
1174
  avaluep[i] = (char *) argp;
950
1175
  }
1176
+ else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
1177
+ {
1178
+ argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
1179
+ avaluep[i] = (char *) argp;
1180
+ }
1181
+ else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_LONGDOUBLE)
1182
+ {
1183
+ /* align long double */
1184
+ argn += ((argn & 0x1)? 1 : 0);
1185
+ argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
1186
+ avaluep[i] = (char *) argp;
1187
+ }
1188
+ else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT)
1189
+ {
1190
+ if (argn >= 8 || i >= cif->mips_nfixedargs || soft_float)
1191
+ argp = ar + argn;
1192
+ else
1193
+ {
1194
+ argp = fpr + argn;
1195
+ /* the normal args for function holds 8bytes, while here we convert it to ptr */
1196
+ uint32_t *tmp = (uint32_t *)argp;
1197
+ tmp[1] = tmp[2];
1198
+ }
1199
+ avaluep[i] = (char *) argp;
1200
+ }
951
1201
  else
952
1202
  {
953
1203
  unsigned type = arg_types[i]->type;
954
1204
 
955
1205
  if (arg_types[i]->alignment > sizeof(ffi_arg))
956
- argn = ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg));
1206
+ argn = FFI_ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg));
957
1207
 
958
1208
  argp = ar + argn;
959
1209
 
960
1210
  /* The size of a pointer depends on the ABI */
961
1211
  if (type == FFI_TYPE_POINTER)
962
1212
  type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT)
963
- ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
1213
+ ? FFI_TYPE_SINT64 : FFI_TYPE_UINT32;
964
1214
 
965
1215
  if (soft_float && type == FFI_TYPE_FLOAT)
966
- type = FFI_TYPE_UINT32;
1216
+ type = FFI_TYPE_SINT32;
967
1217
 
968
1218
  switch (type)
969
1219
  {
@@ -1004,7 +1254,7 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
1004
1254
  it was passed in registers. */
1005
1255
  avaluep[i] = alloca(arg_types[i]->size);
1006
1256
  copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i],
1007
- argn, 0, ar, fpr, soft_float);
1257
+ argn, 0, ar, fpr, i >= cif->mips_nfixedargs || soft_float);
1008
1258
 
1009
1259
  break;
1010
1260
  }
@@ -1014,16 +1264,54 @@ ffi_closure_mips_inner_N32 (ffi_closure *closure,
1014
1264
  break;
1015
1265
  }
1016
1266
  }
1017
- argn += ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg);
1267
+ argn += FFI_ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg);
1018
1268
  i++;
1019
1269
  }
1020
1270
 
1021
1271
  /* Invoke the closure. */
1022
- (closure->fun) (cif, rvalue, avaluep, closure->user_data);
1272
+ fun (cif, rvalue, avaluep, user_data);
1023
1273
 
1024
1274
  return cif->flags >> (FFI_FLAG_BITS * 8);
1025
1275
  }
1026
1276
 
1027
1277
  #endif /* FFI_MIPS_N32 */
1028
1278
 
1279
+ #if defined(FFI_MIPS_O32)
1280
+ extern void ffi_closure_O32(void);
1281
+ extern void ffi_go_closure_O32(void);
1282
+ #else
1283
+ extern void ffi_closure_N32(void);
1284
+ extern void ffi_go_closure_N32(void);
1285
+ #endif /* FFI_MIPS_O32 */
1286
+
1287
+ ffi_status
1288
+ ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
1289
+ void (*fun)(ffi_cif*,void*,void**,void*))
1290
+ {
1291
+ void * fn;
1292
+
1293
+ #if defined(FFI_MIPS_O32)
1294
+ if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
1295
+ return FFI_BAD_ABI;
1296
+ fn = ffi_go_closure_O32;
1297
+ #else
1298
+ #if _MIPS_SIM ==_ABIN32
1299
+ if (cif->abi != FFI_N32
1300
+ && cif->abi != FFI_N32_SOFT_FLOAT)
1301
+ return FFI_BAD_ABI;
1302
+ #else
1303
+ if (cif->abi != FFI_N64
1304
+ && cif->abi != FFI_N64_SOFT_FLOAT)
1305
+ return FFI_BAD_ABI;
1306
+ #endif
1307
+ fn = ffi_go_closure_N32;
1308
+ #endif /* FFI_MIPS_O32 */
1309
+
1310
+ closure->tramp = (void *)fn;
1311
+ closure->cif = cif;
1312
+ closure->fun = fun;
1313
+
1314
+ return FFI_OK;
1315
+ }
1316
+
1029
1317
  #endif /* FFI_CLOSURES */