ffi 1.1.2 → 1.17.0

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