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,5 +1,5 @@
1
1
  /* -----------------------------------------------------------------------
2
- n32.S - Copyright (c) 1996, 1998, 2005 Red Hat, Inc.
2
+ n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc.
3
3
 
4
4
  MIPS Foreign Function Interface
5
5
 
@@ -37,35 +37,43 @@
37
37
  #define flags a3
38
38
  #define raddr a4
39
39
  #define fn a5
40
+ #define closure a6
40
41
 
41
- #define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG )
42
+ /* Note: to keep stack 16 byte aligned we need even number slots
43
+ used 9 slots here
44
+ */
45
+ #define SIZEOF_FRAME ( 10 * FFI_SIZEOF_ARG )
42
46
 
43
- #ifdef linux
47
+ #ifdef __GNUC__
44
48
  .abicalls
49
+ #endif
50
+ #if !defined(__mips_isa_rev) || (__mips_isa_rev<6)
51
+ .set mips4
45
52
  #endif
46
53
  .text
47
54
  .align 2
48
55
  .globl ffi_call_N32
49
56
  .ent ffi_call_N32
50
57
  ffi_call_N32:
51
- .LFB3:
58
+ .LFB0:
52
59
  .frame $fp, SIZEOF_FRAME, ra
53
60
  .mask 0xc0000000,-FFI_SIZEOF_ARG
54
61
  .fmask 0x00000000,0
55
62
 
56
63
  # Prologue
57
64
  SUBU $sp, SIZEOF_FRAME # Frame size
58
- .LCFI0:
65
+ .LCFI00:
59
66
  REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer
60
67
  REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address
61
- .LCFI1:
68
+ .LCFI01:
62
69
  move $fp, $sp
63
- .LCFI3:
70
+ .LCFI02:
64
71
  move t9, callback # callback function pointer
65
72
  REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes
66
73
  REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags
67
74
  REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr
68
75
  REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn
76
+ REG_S closure, 6*FFI_SIZEOF_ARG($fp) # closure
69
77
 
70
78
  # Allocate at least 4 words in the argstack
71
79
  move v0, bytes
@@ -106,11 +114,29 @@ loadregs:
106
114
 
107
115
  REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6.
108
116
 
109
- and t4, t6, ((1<<FFI_FLAG_BITS)-1)
110
- bnez t4, arg1_floatp
117
+ # when retval is _Complex long double, $f12/$a0, $f13/$a1 will be skipped
118
+ # no idea why, but gcc does it.
119
+ SRL t4, t6, 8*FFI_FLAG_BITS
120
+ move t8, t6
121
+ bne t4, FFI_TYPE_COMPLEX_LDLD, loadregs1
122
+
123
+ SLL t8, t6, 2*FFI_FLAG_BITS
124
+
125
+
126
+ loadregs1:
127
+ #ifdef __mips_soft_float
111
128
  REG_L a0, 0*FFI_SIZEOF_ARG(t9)
112
- b arg1_next
113
- arg1_floatp:
129
+ REG_L a1, 1*FFI_SIZEOF_ARG(t9)
130
+ REG_L a2, 2*FFI_SIZEOF_ARG(t9)
131
+ REG_L a3, 3*FFI_SIZEOF_ARG(t9)
132
+ REG_L a4, 4*FFI_SIZEOF_ARG(t9)
133
+ REG_L a5, 5*FFI_SIZEOF_ARG(t9)
134
+ REG_L a6, 6*FFI_SIZEOF_ARG(t9)
135
+ REG_L a7, 7*FFI_SIZEOF_ARG(t9)
136
+ #else
137
+ and t4, t8, ((1<<FFI_FLAG_BITS)-1)
138
+ REG_L a0, 0*FFI_SIZEOF_ARG(t9)
139
+ beqz t4, arg1_next
114
140
  bne t4, FFI_TYPE_FLOAT, arg1_doublep
115
141
  l.s $f12, 0*FFI_SIZEOF_ARG(t9)
116
142
  b arg1_next
@@ -118,12 +144,10 @@ arg1_doublep:
118
144
  l.d $f12, 0*FFI_SIZEOF_ARG(t9)
119
145
  arg1_next:
120
146
 
121
- SRL t4, t6, 1*FFI_FLAG_BITS
147
+ SRL t4, t8, 1*FFI_FLAG_BITS
122
148
  and t4, ((1<<FFI_FLAG_BITS)-1)
123
- bnez t4, arg2_floatp
124
149
  REG_L a1, 1*FFI_SIZEOF_ARG(t9)
125
- b arg2_next
126
- arg2_floatp:
150
+ beqz t4, arg2_next
127
151
  bne t4, FFI_TYPE_FLOAT, arg2_doublep
128
152
  l.s $f13, 1*FFI_SIZEOF_ARG(t9)
129
153
  b arg2_next
@@ -131,12 +155,10 @@ arg2_doublep:
131
155
  l.d $f13, 1*FFI_SIZEOF_ARG(t9)
132
156
  arg2_next:
133
157
 
134
- SRL t4, t6, 2*FFI_FLAG_BITS
158
+ SRL t4, t8, 2*FFI_FLAG_BITS
135
159
  and t4, ((1<<FFI_FLAG_BITS)-1)
136
- bnez t4, arg3_floatp
137
160
  REG_L a2, 2*FFI_SIZEOF_ARG(t9)
138
- b arg3_next
139
- arg3_floatp:
161
+ beqz t4, arg3_next
140
162
  bne t4, FFI_TYPE_FLOAT, arg3_doublep
141
163
  l.s $f14, 2*FFI_SIZEOF_ARG(t9)
142
164
  b arg3_next
@@ -144,12 +166,10 @@ arg3_doublep:
144
166
  l.d $f14, 2*FFI_SIZEOF_ARG(t9)
145
167
  arg3_next:
146
168
 
147
- SRL t4, t6, 3*FFI_FLAG_BITS
169
+ SRL t4, t8, 3*FFI_FLAG_BITS
148
170
  and t4, ((1<<FFI_FLAG_BITS)-1)
149
- bnez t4, arg4_floatp
150
171
  REG_L a3, 3*FFI_SIZEOF_ARG(t9)
151
- b arg4_next
152
- arg4_floatp:
172
+ beqz t4, arg4_next
153
173
  bne t4, FFI_TYPE_FLOAT, arg4_doublep
154
174
  l.s $f15, 3*FFI_SIZEOF_ARG(t9)
155
175
  b arg4_next
@@ -157,12 +177,10 @@ arg4_doublep:
157
177
  l.d $f15, 3*FFI_SIZEOF_ARG(t9)
158
178
  arg4_next:
159
179
 
160
- SRL t4, t6, 4*FFI_FLAG_BITS
180
+ SRL t4, t8, 4*FFI_FLAG_BITS
161
181
  and t4, ((1<<FFI_FLAG_BITS)-1)
162
- bnez t4, arg5_floatp
163
182
  REG_L a4, 4*FFI_SIZEOF_ARG(t9)
164
- b arg5_next
165
- arg5_floatp:
183
+ beqz t4, arg5_next
166
184
  bne t4, FFI_TYPE_FLOAT, arg5_doublep
167
185
  l.s $f16, 4*FFI_SIZEOF_ARG(t9)
168
186
  b arg5_next
@@ -170,12 +188,10 @@ arg5_doublep:
170
188
  l.d $f16, 4*FFI_SIZEOF_ARG(t9)
171
189
  arg5_next:
172
190
 
173
- SRL t4, t6, 5*FFI_FLAG_BITS
191
+ SRL t4, t8, 5*FFI_FLAG_BITS
174
192
  and t4, ((1<<FFI_FLAG_BITS)-1)
175
- bnez t4, arg6_floatp
176
193
  REG_L a5, 5*FFI_SIZEOF_ARG(t9)
177
- b arg6_next
178
- arg6_floatp:
194
+ beqz t4, arg6_next
179
195
  bne t4, FFI_TYPE_FLOAT, arg6_doublep
180
196
  l.s $f17, 5*FFI_SIZEOF_ARG(t9)
181
197
  b arg6_next
@@ -183,12 +199,10 @@ arg6_doublep:
183
199
  l.d $f17, 5*FFI_SIZEOF_ARG(t9)
184
200
  arg6_next:
185
201
 
186
- SRL t4, t6, 6*FFI_FLAG_BITS
202
+ SRL t4, t8, 6*FFI_FLAG_BITS
187
203
  and t4, ((1<<FFI_FLAG_BITS)-1)
188
- bnez t4, arg7_floatp
189
204
  REG_L a6, 6*FFI_SIZEOF_ARG(t9)
190
- b arg7_next
191
- arg7_floatp:
205
+ beqz t4, arg7_next
192
206
  bne t4, FFI_TYPE_FLOAT, arg7_doublep
193
207
  l.s $f18, 6*FFI_SIZEOF_ARG(t9)
194
208
  b arg7_next
@@ -196,23 +210,25 @@ arg7_doublep:
196
210
  l.d $f18, 6*FFI_SIZEOF_ARG(t9)
197
211
  arg7_next:
198
212
 
199
- SRL t4, t6, 7*FFI_FLAG_BITS
213
+ SRL t4, t8, 7*FFI_FLAG_BITS
200
214
  and t4, ((1<<FFI_FLAG_BITS)-1)
201
- bnez t4, arg8_floatp
202
215
  REG_L a7, 7*FFI_SIZEOF_ARG(t9)
203
- b arg8_next
204
- arg8_floatp:
216
+ beqz t4, arg8_next
205
217
  bne t4, FFI_TYPE_FLOAT, arg8_doublep
206
218
  l.s $f19, 7*FFI_SIZEOF_ARG(t9)
207
219
  b arg8_next
208
220
  arg8_doublep:
209
221
  l.d $f19, 7*FFI_SIZEOF_ARG(t9)
210
222
  arg8_next:
223
+ #endif
211
224
 
212
- callit:
225
+ callit:
213
226
  # Load the function pointer
214
227
  REG_L t9, 5*FFI_SIZEOF_ARG($fp)
215
228
 
229
+ # install the static chain(t7=$15)
230
+ REG_L t7, 6*FFI_SIZEOF_ARG($fp)
231
+
216
232
  # If the return value pointer is NULL, assume no return value.
217
233
  REG_L t5, 4*FFI_SIZEOF_ARG($fp)
218
234
  beqz t5, noretval
@@ -220,15 +236,58 @@ callit:
220
236
  # Shift the return type flag over
221
237
  SRL t6, 8*FFI_FLAG_BITS
222
238
 
223
- beq t6, FFI_TYPE_SINT32, retint
224
- bne t6, FFI_TYPE_INT, retfloat
225
- retint:
239
+ bne t6, FFI_TYPE_UINT64, retsint32
240
+
241
+ retuint64:
226
242
  jal t9
227
243
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
228
- REG_S v0, 0(t4)
244
+ sd v0, 0(t4)
245
+ b epilogue
246
+
247
+ retsint32:
248
+ bne t6, FFI_TYPE_SINT32, retuint16
249
+ jal t9
250
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
251
+ sll v0, v0, 0
252
+ sd v0, 0(t4)
253
+ b epilogue
254
+
255
+ retuint16:
256
+ bne t6, FFI_TYPE_UINT16, retsint16
257
+ jal t9
258
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
259
+ andi v0, v0, 0xffff
260
+ sd v0, 0(t4)
261
+ b epilogue
262
+
263
+ retsint16:
264
+ bne t6, FFI_TYPE_SINT16, retuint8
265
+ jal t9
266
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
267
+ dsll v0, v0, 48
268
+ dsra v0, v0, 48
269
+ sd v0, 0(t4)
270
+ b epilogue
271
+
272
+ retuint8:
273
+ bne t6, FFI_TYPE_UINT8, retsint8
274
+ jal t9
275
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
276
+ andi v0, v0, 0xff
277
+ sd v0, 0(t4)
278
+ b epilogue
279
+
280
+ retsint8:
281
+ bne t6, FFI_TYPE_SINT8, retfloat
282
+ jal t9
283
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
284
+ sd v0, 0(t4)
285
+ dsll v0, v0, 56
286
+ dsra v0, v0, 56
229
287
  b epilogue
230
288
 
231
289
  retfloat:
290
+ #ifndef __mips_soft_float
232
291
  bne t6, FFI_TYPE_FLOAT, retdouble
233
292
  jal t9
234
293
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
@@ -242,7 +301,7 @@ retdouble:
242
301
  s.d $f0, 0(t4)
243
302
  b epilogue
244
303
 
245
- retstruct_d:
304
+ retstruct_d:
246
305
  bne t6, FFI_TYPE_STRUCT_D, retstruct_f
247
306
  jal t9
248
307
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
@@ -256,16 +315,37 @@ retstruct_f:
256
315
  s.s $f0, 0(t4)
257
316
  b epilogue
258
317
 
259
- retstruct_d_d:
260
- bne t6, FFI_TYPE_STRUCT_DD, retstruct_f_f
318
+ retstruct_d_d:
319
+ bne t6, FFI_TYPE_STRUCT_DD, retcomplex_d_d
261
320
  jal t9
262
321
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
263
322
  s.d $f0, 0(t4)
264
323
  s.d $f2, 8(t4)
265
324
  b epilogue
325
+
326
+ retcomplex_d_d:
327
+ bne t6, FFI_TYPE_COMPLEX_DD, retcomplex_ld_ld
328
+ jal t9
329
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
330
+ s.d $f0, 0(t4)
331
+ s.d $f2, 8(t4)
332
+ b epilogue
333
+
334
+ retcomplex_ld_ld:
335
+ bne t6, FFI_TYPE_COMPLEX_LDLD, retstruct_f_f
336
+ jal t9
337
+ b epilogue
266
338
 
267
- retstruct_f_f:
268
- bne t6, FFI_TYPE_STRUCT_FF, retstruct_d_f
339
+ retstruct_f_f:
340
+ bne t6, FFI_TYPE_STRUCT_FF, retcomplex_f_f
341
+ jal t9
342
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
343
+ s.s $f0, 0(t4)
344
+ s.s $f2, 4(t4)
345
+ b epilogue
346
+
347
+ retcomplex_f_f:
348
+ bne t6, FFI_TYPE_COMPLEX_FF, retstruct_d_f
269
349
  jal t9
270
350
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
271
351
  s.s $f0, 0(t4)
@@ -287,6 +367,7 @@ retstruct_f_d:
287
367
  s.s $f0, 0(t4)
288
368
  s.d $f2, 8(t4)
289
369
  b epilogue
370
+ #endif
290
371
 
291
372
  retstruct_d_soft:
292
373
  bne t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft
@@ -307,7 +388,7 @@ retstruct_d_d_soft:
307
388
  jal t9
308
389
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
309
390
  sd v0, 0(t4)
310
- sd v1, 8(t4)
391
+ sd a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
311
392
  b epilogue
312
393
 
313
394
  retstruct_f_f_soft:
@@ -331,7 +412,7 @@ retstruct_f_d_soft:
331
412
  jal t9
332
413
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
333
414
  sw v0, 0(t4)
334
- sd v1, 8(t4)
415
+ sd a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
335
416
  b epilogue
336
417
 
337
418
  retstruct_small:
@@ -342,14 +423,37 @@ retstruct_small:
342
423
  b epilogue
343
424
 
344
425
  retstruct_small2:
345
- bne t6, FFI_TYPE_STRUCT_SMALL2, retstruct
426
+ bne t6, FFI_TYPE_STRUCT_SMALL2, retlongdouble_soft
346
427
  jal t9
347
428
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
348
429
  REG_S v0, 0(t4)
349
430
  REG_S v1, 8(t4)
350
431
  b epilogue
351
432
 
352
- retstruct:
433
+ retlongdouble_soft:
434
+ bne t6, FFI_TYPE_LONGDOUBLE, retcomplex_small
435
+ jal t9
436
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
437
+ REG_S v0, 0(t4)
438
+ REG_S a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
439
+ b epilogue
440
+
441
+ retcomplex_small:
442
+ bne t6, FFI_TYPE_COMPLEX_SMALL, retcomplex_small2
443
+ jal t9
444
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
445
+ REG_S v0, 0(t4)
446
+ b epilogue
447
+
448
+ retcomplex_small2:
449
+ bne t6, FFI_TYPE_COMPLEX_SMALL2, retstruct
450
+ jal t9
451
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
452
+ REG_S v0, 0(t4)
453
+ REG_S v1, 8(t4)
454
+ b epilogue
455
+
456
+ retstruct:
353
457
  noretval:
354
458
  jal t9
355
459
 
@@ -361,7 +465,7 @@ epilogue:
361
465
  ADDU $sp, SIZEOF_FRAME # Fix stack pointer
362
466
  j ra
363
467
 
364
- .LFE3:
468
+ .LFE0:
365
469
  .end ffi_call_N32
366
470
 
367
471
  /* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0
@@ -395,7 +499,7 @@ epilogue:
395
499
  */
396
500
 
397
501
  #define SIZEOF_FRAME2 (20 * FFI_SIZEOF_ARG)
398
-
502
+
399
503
  #define A7_OFF2 (19 * FFI_SIZEOF_ARG)
400
504
  #define A6_OFF2 (18 * FFI_SIZEOF_ARG)
401
505
  #define A5_OFF2 (17 * FFI_SIZEOF_ARG)
@@ -420,6 +524,46 @@ epilogue:
420
524
  #define RA_OFF2 (1 * FFI_SIZEOF_ARG)
421
525
  #define GP_OFF2 (0 * FFI_SIZEOF_ARG)
422
526
 
527
+ .align 2
528
+ .globl ffi_go_closure_N32
529
+ .ent ffi_go_closure_N32
530
+ ffi_go_closure_N32:
531
+ .LFB1:
532
+ .frame $sp, SIZEOF_FRAME2, ra
533
+ .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
534
+ .fmask 0x00000000,0
535
+ SUBU $sp, SIZEOF_FRAME2
536
+ .LCFI10:
537
+ .cpsetup t9, GP_OFF2, ffi_go_closure_N32
538
+ REG_S ra, RA_OFF2($sp) # Save return address
539
+ .LCFI11:
540
+
541
+ REG_S a0, A0_OFF2($sp)
542
+ REG_S a1, A1_OFF2($sp)
543
+ REG_S a2, A2_OFF2($sp)
544
+ REG_S a3, A3_OFF2($sp)
545
+ REG_S a4, A4_OFF2($sp)
546
+ REG_S a5, A5_OFF2($sp)
547
+
548
+ # Call ffi_closure_mips_inner_N32 to do the real work.
549
+ LA t9, ffi_closure_mips_inner_N32
550
+ #if _MIPS_SIM==_ABIN32
551
+ lw a0, 4($15) # cif
552
+ lw a1, 8($15) # fun
553
+ #else
554
+ REG_L a0, 8($15) # cif
555
+ REG_L a1, 16($15) # fun
556
+ #endif
557
+ move a2, t7 # userdata=closure
558
+ ADDU a3, $sp, V0_OFF2 # rvalue
559
+ ADDU a4, $sp, A0_OFF2 # ar
560
+ ADDU a5, $sp, F12_OFF2 # fpr
561
+
562
+ b $do_closure
563
+
564
+ .LFE1:
565
+ .end ffi_go_closure_N32
566
+
423
567
  .align 2
424
568
  .globl ffi_closure_N32
425
569
  .ent ffi_closure_N32
@@ -429,21 +573,40 @@ ffi_closure_N32:
429
573
  .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
430
574
  .fmask 0x00000000,0
431
575
  SUBU $sp, SIZEOF_FRAME2
432
- .LCFI5:
576
+ .LCFI20:
433
577
  .cpsetup t9, GP_OFF2, ffi_closure_N32
434
578
  REG_S ra, RA_OFF2($sp) # Save return address
435
- .LCFI6:
436
- # Store all possible argument registers. If there are more than
437
- # fit in registers, then they were stored on the stack.
579
+ .LCFI21:
438
580
  REG_S a0, A0_OFF2($sp)
439
581
  REG_S a1, A1_OFF2($sp)
440
582
  REG_S a2, A2_OFF2($sp)
441
583
  REG_S a3, A3_OFF2($sp)
442
584
  REG_S a4, A4_OFF2($sp)
443
585
  REG_S a5, A5_OFF2($sp)
586
+
587
+ # Call ffi_closure_mips_inner_N32 to do the real work.
588
+ LA t9, ffi_closure_mips_inner_N32
589
+ #if _MIPS_SIM==_ABIN32
590
+ lw a0, 20($12) # cif
591
+ lw a1, 24($12) # fun
592
+ lw a2, 28($12) # user_data
593
+ #else
594
+ REG_L a0, 56($12) # cif
595
+ REG_L a1, 64($12) # fun
596
+ REG_L a2, 72($12) # user_data
597
+ #endif
598
+ ADDU a3, $sp, V0_OFF2
599
+ # FIXME: a4 does work, while if ret is _Complex long double, it will overwrite Fn_OFF2
600
+ ADDU a4, $sp, A0_OFF2
601
+ ADDU a5, $sp, F12_OFF2
602
+
603
+ $do_closure:
604
+ # Store all possible argument registers. If there are more than
605
+ # fit in registers, then they were stored on the stack.
444
606
  REG_S a6, A6_OFF2($sp)
445
607
  REG_S a7, A7_OFF2($sp)
446
608
 
609
+ #ifndef __mips_soft_float
447
610
  # Store all possible float/double registers.
448
611
  s.d $f12, F12_OFF2($sp)
449
612
  s.d $f13, F13_OFF2($sp)
@@ -453,26 +616,43 @@ ffi_closure_N32:
453
616
  s.d $f17, F17_OFF2($sp)
454
617
  s.d $f18, F18_OFF2($sp)
455
618
  s.d $f19, F19_OFF2($sp)
619
+ #endif
456
620
 
457
- # Call ffi_closure_mips_inner_N32 to do the real work.
458
- LA t9, ffi_closure_mips_inner_N32
459
- move a0, $12 # Pointer to the ffi_closure
460
- ADDU a1, $sp, V0_OFF2
461
- ADDU a2, $sp, A0_OFF2
462
- ADDU a3, $sp, F12_OFF2
463
621
  jalr t9
464
622
 
623
+ cls_retuint64:
465
624
  # Return flags are in v0
466
- bne v0, FFI_TYPE_SINT32, cls_retint
625
+ bne v0, FFI_TYPE_UINT64, cls_retsint32
626
+ ld v0, V0_OFF2($sp)
627
+ b cls_epilogue
628
+
629
+ cls_retsint32:
630
+ bne v0, FFI_TYPE_SINT32, cls_retsint16
467
631
  lw v0, V0_OFF2($sp)
468
632
  b cls_epilogue
469
633
 
470
- cls_retint:
471
- bne v0, FFI_TYPE_INT, cls_retfloat
472
- REG_L v0, V0_OFF2($sp)
634
+ cls_retsint16:
635
+ bne v0, FFI_TYPE_SINT16, cls_retuint16
636
+ lh v0, V0_OFF2($sp)
637
+ b cls_epilogue
638
+
639
+ cls_retuint16:
640
+ bne v0, FFI_TYPE_UINT16, cls_retsint8
641
+ lhu v0, V0_OFF2($sp)
642
+ b cls_epilogue
643
+
644
+ cls_retsint8:
645
+ bne v0, FFI_TYPE_SINT8, cls_retuint8
646
+ lb v0, V0_OFF2($sp)
647
+ b cls_epilogue
648
+
649
+ cls_retuint8:
650
+ bne v0, FFI_TYPE_UINT8, cls_retfloat
651
+ lbu v0, V0_OFF2($sp)
473
652
  b cls_epilogue
474
653
 
475
654
  cls_retfloat:
655
+ #ifndef __mips_soft_float
476
656
  bne v0, FFI_TYPE_FLOAT, cls_retdouble
477
657
  l.s $f0, V0_OFF2($sp)
478
658
  b cls_epilogue
@@ -493,17 +673,29 @@ cls_retstruct_f:
493
673
  b cls_epilogue
494
674
 
495
675
  cls_retstruct_d_d:
496
- bne v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f
676
+ bne v0, FFI_TYPE_STRUCT_DD, cls_retcomplex_d_d
677
+ l.d $f0, V0_OFF2($sp)
678
+ l.d $f2, V1_OFF2($sp)
679
+ b cls_epilogue
680
+
681
+ cls_retcomplex_d_d:
682
+ bne v0, FFI_TYPE_COMPLEX_DD, cls_retcomplex_f_f
497
683
  l.d $f0, V0_OFF2($sp)
498
684
  l.d $f2, V1_OFF2($sp)
499
685
  b cls_epilogue
500
686
 
501
- cls_retstruct_f_f:
502
- bne v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f
687
+ cls_retstruct_f_f:
688
+ bne v0, FFI_TYPE_STRUCT_FF, cls_retcomplex_f_f
503
689
  l.s $f0, V0_OFF2($sp)
504
690
  l.s $f2, V1_OFF2($sp)
505
691
  b cls_epilogue
506
692
 
693
+ cls_retcomplex_f_f:
694
+ bne v0, FFI_TYPE_COMPLEX_FF, cls_retstruct_d_f
695
+ l.s $f0, V0_OFF2($sp)
696
+ l.s $f2, (V0_OFF2+4)($sp)
697
+ b cls_epilogue
698
+
507
699
  cls_retstruct_d_f:
508
700
  bne v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
509
701
  l.d $f0, V0_OFF2($sp)
@@ -511,11 +703,31 @@ cls_retstruct_d_f:
511
703
  b cls_epilogue
512
704
 
513
705
  cls_retstruct_f_d:
514
- bne v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2
706
+ bne v0, FFI_TYPE_STRUCT_FD, cls_retcomplex_ld_ld
515
707
  l.s $f0, V0_OFF2($sp)
516
708
  l.d $f2, V1_OFF2($sp)
517
709
  b cls_epilogue
518
-
710
+ #else
711
+ cls_longdouble_soft:
712
+ bne v0, FFI_TYPE_LONGDOUBLE, cls_retcomplex_ld_ld
713
+ REG_L v0, V0_OFF2($sp)
714
+ REG_L a0, V1_OFF2($sp) # not typo, it is a0, I have no idea, gcc does do it
715
+ b cls_epilogue
716
+ #endif
717
+
718
+ cls_retcomplex_ld_ld:
719
+ bne v0, FFI_TYPE_COMPLEX_LDLD, cls_retstruct_small2
720
+ REG_L t8, A0_OFF2($sp)
721
+ REG_L t9, 16($sp)
722
+ REG_S t9, 0(t8)
723
+ REG_L t9, 24($sp)
724
+ REG_S t9, 8(t8)
725
+ REG_L t9, 32($sp)
726
+ REG_S t9, 16(t8)
727
+ REG_L t9, 40($sp)
728
+ REG_S t9, 24(t8)
729
+ b cls_epilogue
730
+
519
731
  cls_retstruct_small2:
520
732
  REG_L v0, V0_OFF2($sp)
521
733
  REG_L v1, V1_OFF2($sp)
@@ -529,8 +741,8 @@ cls_epilogue:
529
741
  .LFE2:
530
742
  .end ffi_closure_N32
531
743
 
532
- #ifdef linux
533
- .section .eh_frame,"aw",@progbits
744
+ #ifdef __GNUC__
745
+ .section .eh_frame,EH_FRAME_FLAGS,@progbits
534
746
  .Lframe1:
535
747
  .4byte .LECIE1-.LSCIE1 # length
536
748
  .LSCIE1:
@@ -546,46 +758,66 @@ cls_epilogue:
546
758
  .align EH_FRAME_ALIGN
547
759
  .LECIE1:
548
760
 
549
- .LSFDE1:
550
- .4byte .LEFDE1-.LASFDE1 # length.
551
- .LASFDE1:
552
- .4byte .LASFDE1-.Lframe1 # CIE_pointer.
553
- FDE_ADDR_BYTES .LFB3 # initial_location.
554
- FDE_ADDR_BYTES .LFE3-.LFB3 # address_range.
761
+ .LSFDE0:
762
+ .4byte .LEFDE0-.LASFDE0 # length.
763
+ .LASFDE0:
764
+ .4byte .LASFDE0-.Lframe1 # CIE_pointer.
765
+ FDE_ADDR_BYTES .LFB0 # initial_location.
766
+ FDE_ADDR_BYTES .LFE0-.LFB0 # address_range.
555
767
  .byte 0x4 # DW_CFA_advance_loc4
556
- .4byte .LCFI0-.LFB3 # to .LCFI0
768
+ .4byte .LCFI00-.LFB0 # to .LCFI00
557
769
  .byte 0xe # DW_CFA_def_cfa_offset
558
770
  .uleb128 SIZEOF_FRAME # adjust stack.by SIZEOF_FRAME
559
771
  .byte 0x4 # DW_CFA_advance_loc4
560
- .4byte .LCFI1-.LCFI0 # to .LCFI1
772
+ .4byte .LCFI01-.LCFI00 # to .LCFI01
561
773
  .byte 0x9e # DW_CFA_offset of $fp
562
774
  .uleb128 2*FFI_SIZEOF_ARG/4 #
563
775
  .byte 0x9f # DW_CFA_offset of ra
564
776
  .uleb128 1*FFI_SIZEOF_ARG/4 #
565
777
  .byte 0x4 # DW_CFA_advance_loc4
566
- .4byte .LCFI3-.LCFI1 # to .LCFI3
778
+ .4byte .LCFI02-.LCFI01 # to .LCFI02
567
779
  .byte 0xd # DW_CFA_def_cfa_register
568
780
  .uleb128 0x1e # in $fp
569
781
  .align EH_FRAME_ALIGN
782
+ .LEFDE0:
783
+
784
+ .LSFDE1:
785
+ .4byte .LEFDE1-.LASFDE1 # length
786
+ .LASFDE1:
787
+ .4byte .LASFDE1-.Lframe1 # CIE_pointer.
788
+ FDE_ADDR_BYTES .LFB1 # initial_location.
789
+ FDE_ADDR_BYTES .LFE1-.LFB1 # address_range.
790
+ .byte 0x4 # DW_CFA_advance_loc4
791
+ .4byte .LCFI10-.LFB1 # to .LCFI10
792
+ .byte 0xe # DW_CFA_def_cfa_offset
793
+ .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME
794
+ .byte 0x4 # DW_CFA_advance_loc4
795
+ .4byte .LCFI11-.LCFI10 # to .LCFI11
796
+ .byte 0x9c # DW_CFA_offset of $gp ($28)
797
+ .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
798
+ .byte 0x9f # DW_CFA_offset of ra ($31)
799
+ .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
800
+ .align EH_FRAME_ALIGN
570
801
  .LEFDE1:
571
- .LSFDE3:
572
- .4byte .LEFDE3-.LASFDE3 # length
573
- .LASFDE3:
574
- .4byte .LASFDE3-.Lframe1 # CIE_pointer.
802
+
803
+ .LSFDE2:
804
+ .4byte .LEFDE2-.LASFDE2 # length
805
+ .LASFDE2:
806
+ .4byte .LASFDE2-.Lframe1 # CIE_pointer.
575
807
  FDE_ADDR_BYTES .LFB2 # initial_location.
576
808
  FDE_ADDR_BYTES .LFE2-.LFB2 # address_range.
577
809
  .byte 0x4 # DW_CFA_advance_loc4
578
- .4byte .LCFI5-.LFB2 # to .LCFI5
810
+ .4byte .LCFI20-.LFB2 # to .LCFI20
579
811
  .byte 0xe # DW_CFA_def_cfa_offset
580
812
  .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME
581
813
  .byte 0x4 # DW_CFA_advance_loc4
582
- .4byte .LCFI6-.LCFI5 # to .LCFI6
814
+ .4byte .LCFI21-.LCFI20 # to .LCFI21
583
815
  .byte 0x9c # DW_CFA_offset of $gp ($28)
584
816
  .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
585
817
  .byte 0x9f # DW_CFA_offset of ra ($31)
586
818
  .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
587
819
  .align EH_FRAME_ALIGN
588
- .LEFDE3:
589
- #endif /* linux */
820
+ .LEFDE2:
821
+ #endif /* __GNUC__ */
590
822
 
591
823
  #endif