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,8 +1,10 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
3
- Copyright (c) 2008 Red Hat, Inc.
4
-
5
- x86-64 Foreign Function Interface
2
+ ffi64.c - Copyright (c) 2011, 2018, 2022 Anthony Green
3
+ Copyright (c) 2013 The Written Word, Inc.
4
+ Copyright (c) 2008, 2010 Red Hat, Inc.
5
+ Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
6
+
7
+ x86-64 Foreign Function Interface
6
8
 
7
9
  Permission is hereby granted, free of charge, to any person obtaining
8
10
  a copy of this software and associated documentation files (the
@@ -30,29 +32,54 @@
30
32
 
31
33
  #include <stdlib.h>
32
34
  #include <stdarg.h>
35
+ #include <stdint.h>
36
+ #include <tramp.h>
37
+ #include "internal64.h"
33
38
 
34
39
  #ifdef __x86_64__
35
40
 
36
41
  #define MAX_GPR_REGS 6
37
42
  #define MAX_SSE_REGS 8
38
43
 
44
+ #if defined(__INTEL_COMPILER)
45
+ #include "xmmintrin.h"
46
+ #define UINT128 __m128
47
+ #else
48
+ #if defined(__SUNPRO_C)
49
+ #include <sunmedia_types.h>
50
+ #define UINT128 __m128i
51
+ #else
52
+ #define UINT128 __int128_t
53
+ #endif
54
+ #endif
55
+
56
+ union big_int_union
57
+ {
58
+ UINT32 i32;
59
+ UINT64 i64;
60
+ UINT128 i128;
61
+ };
62
+
39
63
  struct register_args
40
64
  {
41
65
  /* Registers for argument passing. */
42
66
  UINT64 gpr[MAX_GPR_REGS];
43
- __int128_t sse[MAX_SSE_REGS];
67
+ union big_int_union sse[MAX_SSE_REGS];
68
+ UINT64 rax; /* ssecount */
69
+ UINT64 r10; /* static chain */
44
70
  };
45
71
 
46
72
  extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
47
- void *raddr, void (*fnaddr)(void), unsigned ssecount);
73
+ void *raddr, void (*fnaddr)(void)) FFI_HIDDEN;
48
74
 
49
75
  /* All reference to register classes here is identical to the code in
50
76
  gcc/config/i386/i386.c. Do *not* change one without the other. */
51
77
 
52
78
  /* Register class used for passing given 64bit part of the argument.
53
- These represent classes as documented by the PS ABI, with the exception
54
- of SSESF, SSEDF classes, that are basically SSE class, just gcc will
55
- use SF or DFmode move instead of DImode to avoid reformating penalties.
79
+ These represent classes as documented by the PS ABI, with the
80
+ exception of SSESF, SSEDF classes, that are basically SSE class,
81
+ just gcc will use SF or DFmode move instead of DImode to avoid
82
+ reformatting penalties.
56
83
 
57
84
  Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
58
85
  whenever possible (upper half does contain padding). */
@@ -130,7 +157,7 @@ merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
130
157
 
131
158
  See the x86-64 PS ABI for details.
132
159
  */
133
- static int
160
+ static size_t
134
161
  classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
135
162
  size_t byte_offset)
136
163
  {
@@ -145,8 +172,9 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
145
172
  case FFI_TYPE_UINT64:
146
173
  case FFI_TYPE_SINT64:
147
174
  case FFI_TYPE_POINTER:
175
+ do_integer:
148
176
  {
149
- int size = byte_offset + type->size;
177
+ size_t size = byte_offset + type->size;
150
178
 
151
179
  if (size <= 4)
152
180
  {
@@ -166,7 +194,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
166
194
  }
167
195
  else if (size <= 16)
168
196
  {
169
- classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
197
+ classes[0] = classes[1] = X86_64_INTEGER_CLASS;
170
198
  return 2;
171
199
  }
172
200
  else
@@ -181,16 +209,19 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
181
209
  case FFI_TYPE_DOUBLE:
182
210
  classes[0] = X86_64_SSEDF_CLASS;
183
211
  return 1;
212
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
184
213
  case FFI_TYPE_LONGDOUBLE:
185
214
  classes[0] = X86_64_X87_CLASS;
186
215
  classes[1] = X86_64_X87UP_CLASS;
187
216
  return 2;
217
+ #endif
188
218
  case FFI_TYPE_STRUCT:
189
219
  {
190
- const int UNITS_PER_WORD = 8;
191
- int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
192
- ffi_type **ptr;
193
- int i;
220
+ const size_t UNITS_PER_WORD = 8;
221
+ size_t words = (type->size + byte_offset + UNITS_PER_WORD - 1)
222
+ / UNITS_PER_WORD;
223
+ ffi_type **ptr;
224
+ unsigned int i;
194
225
  enum x86_64_reg_class subclasses[MAX_CLASSES];
195
226
 
196
227
  /* If the struct is larger than 32 bytes, pass it on the stack. */
@@ -204,6 +235,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
204
235
  signalize memory class, so handle it as special case. */
205
236
  if (!words)
206
237
  {
238
+ case FFI_TYPE_VOID:
207
239
  classes[0] = X86_64_NO_CLASS;
208
240
  return 1;
209
241
  }
@@ -211,16 +243,17 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
211
243
  /* Merge the fields of structure. */
212
244
  for (ptr = type->elements; *ptr != NULL; ptr++)
213
245
  {
214
- int num;
246
+ size_t num, pos;
215
247
 
216
- byte_offset = ALIGN (byte_offset, (*ptr)->alignment);
248
+ byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment);
217
249
 
218
250
  num = classify_argument (*ptr, subclasses, byte_offset % 8);
219
251
  if (num == 0)
220
252
  return 0;
221
- for (i = 0; i < num; i++)
253
+ pos = byte_offset / 8;
254
+ for (i = 0; i < num && (i + pos) < words; i++)
222
255
  {
223
- int pos = byte_offset / 8;
256
+ size_t pos = byte_offset / 8;
224
257
  classes[i + pos] =
225
258
  merge_classes (subclasses[i], classes[i + pos]);
226
259
  }
@@ -252,7 +285,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
252
285
 
253
286
  /* The X86_64_SSEUP_CLASS should be always preceded by
254
287
  X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
255
- if (classes[i] == X86_64_SSEUP_CLASS
288
+ if (i > 1 && classes[i] == X86_64_SSEUP_CLASS
256
289
  && classes[i - 1] != X86_64_SSE_CLASS
257
290
  && classes[i - 1] != X86_64_SSEUP_CLASS)
258
291
  {
@@ -263,7 +296,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
263
296
 
264
297
  /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
265
298
  everything should be passed in memory. */
266
- if (classes[i] == X86_64_X87UP_CLASS
299
+ if (i > 1 && classes[i] == X86_64_X87UP_CLASS
267
300
  && (classes[i - 1] != X86_64_X87_CLASS))
268
301
  {
269
302
  /* The first one should never be X86_64_X87UP_CLASS. */
@@ -273,22 +306,55 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
273
306
  }
274
307
  return words;
275
308
  }
276
-
277
- default:
278
- FFI_ASSERT(0);
309
+ case FFI_TYPE_COMPLEX:
310
+ {
311
+ ffi_type *inner = type->elements[0];
312
+ switch (inner->type)
313
+ {
314
+ case FFI_TYPE_INT:
315
+ case FFI_TYPE_UINT8:
316
+ case FFI_TYPE_SINT8:
317
+ case FFI_TYPE_UINT16:
318
+ case FFI_TYPE_SINT16:
319
+ case FFI_TYPE_UINT32:
320
+ case FFI_TYPE_SINT32:
321
+ case FFI_TYPE_UINT64:
322
+ case FFI_TYPE_SINT64:
323
+ goto do_integer;
324
+
325
+ case FFI_TYPE_FLOAT:
326
+ classes[0] = X86_64_SSE_CLASS;
327
+ if (byte_offset % 8)
328
+ {
329
+ classes[1] = X86_64_SSESF_CLASS;
330
+ return 2;
331
+ }
332
+ return 1;
333
+ case FFI_TYPE_DOUBLE:
334
+ classes[0] = classes[1] = X86_64_SSEDF_CLASS;
335
+ return 2;
336
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
337
+ case FFI_TYPE_LONGDOUBLE:
338
+ classes[0] = X86_64_COMPLEX_X87_CLASS;
339
+ return 1;
340
+ #endif
341
+ }
342
+ }
279
343
  }
280
- return 0; /* Never reached. */
344
+ abort();
281
345
  }
282
346
 
283
347
  /* Examine the argument and return set number of register required in each
284
348
  class. Return zero iff parameter should be passed in memory, otherwise
285
349
  the number of registers. */
286
350
 
287
- static int
351
+ static size_t
288
352
  examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
289
353
  _Bool in_return, int *pngpr, int *pnsse)
290
354
  {
291
- int i, n, ngpr, nsse;
355
+ size_t n;
356
+ unsigned int i;
357
+ int ngpr, nsse;
292
358
 
293
359
  n = classify_argument (type, classes, 0);
294
360
  if (n == 0)
@@ -326,18 +392,74 @@ examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
326
392
 
327
393
  /* Perform machine dependent cif processing. */
328
394
 
329
- ffi_status
395
+ #ifndef __ILP32__
396
+ extern ffi_status
397
+ ffi_prep_cif_machdep_efi64(ffi_cif *cif);
398
+ #endif
399
+
400
+ ffi_status FFI_HIDDEN
330
401
  ffi_prep_cif_machdep (ffi_cif *cif)
331
402
  {
332
- int gprcount, ssecount, i, avn, n, ngpr, nsse, flags;
403
+ int gprcount, ssecount, i, avn, ngpr, nsse;
404
+ unsigned flags;
333
405
  enum x86_64_reg_class classes[MAX_CLASSES];
334
- size_t bytes;
406
+ size_t bytes, n, rtype_size;
407
+ ffi_type *rtype;
408
+
409
+ #ifndef __ILP32__
410
+ if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
411
+ return ffi_prep_cif_machdep_efi64(cif);
412
+ #endif
413
+ if (cif->abi != FFI_UNIX64)
414
+ return FFI_BAD_ABI;
335
415
 
336
416
  gprcount = ssecount = 0;
337
417
 
338
- flags = cif->rtype->type;
339
- if (flags != FFI_TYPE_VOID)
418
+ rtype = cif->rtype;
419
+ rtype_size = rtype->size;
420
+ switch (rtype->type)
340
421
  {
422
+ case FFI_TYPE_VOID:
423
+ flags = UNIX64_RET_VOID;
424
+ break;
425
+ case FFI_TYPE_UINT8:
426
+ flags = UNIX64_RET_UINT8;
427
+ break;
428
+ case FFI_TYPE_SINT8:
429
+ flags = UNIX64_RET_SINT8;
430
+ break;
431
+ case FFI_TYPE_UINT16:
432
+ flags = UNIX64_RET_UINT16;
433
+ break;
434
+ case FFI_TYPE_SINT16:
435
+ flags = UNIX64_RET_SINT16;
436
+ break;
437
+ case FFI_TYPE_UINT32:
438
+ flags = UNIX64_RET_UINT32;
439
+ break;
440
+ case FFI_TYPE_INT:
441
+ case FFI_TYPE_SINT32:
442
+ flags = UNIX64_RET_SINT32;
443
+ break;
444
+ case FFI_TYPE_UINT64:
445
+ case FFI_TYPE_SINT64:
446
+ flags = UNIX64_RET_INT64;
447
+ break;
448
+ case FFI_TYPE_POINTER:
449
+ flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64);
450
+ break;
451
+ case FFI_TYPE_FLOAT:
452
+ flags = UNIX64_RET_XMM32;
453
+ break;
454
+ case FFI_TYPE_DOUBLE:
455
+ flags = UNIX64_RET_XMM64;
456
+ break;
457
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
458
+ case FFI_TYPE_LONGDOUBLE:
459
+ flags = UNIX64_RET_X87;
460
+ break;
461
+ #endif
462
+ case FFI_TYPE_STRUCT:
341
463
  n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
342
464
  if (n == 0)
343
465
  {
@@ -345,22 +467,62 @@ ffi_prep_cif_machdep (ffi_cif *cif)
345
467
  memory is the first argument. Allocate a register for it. */
346
468
  gprcount++;
347
469
  /* We don't have to do anything in asm for the return. */
348
- flags = FFI_TYPE_VOID;
470
+ flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM;
349
471
  }
350
- else if (flags == FFI_TYPE_STRUCT)
472
+ else
351
473
  {
352
- /* Mark which registers the result appears in. */
353
474
  _Bool sse0 = SSE_CLASS_P (classes[0]);
354
- _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
355
- if (sse0 && !sse1)
356
- flags |= 1 << 8;
357
- else if (!sse0 && sse1)
358
- flags |= 1 << 9;
359
- else if (sse0 && sse1)
360
- flags |= 1 << 10;
361
- /* Mark the true size of the structure. */
362
- flags |= cif->rtype->size << 12;
475
+
476
+ if (rtype_size == 4 && sse0)
477
+ flags = UNIX64_RET_XMM32;
478
+ else if (rtype_size == 8)
479
+ flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64;
480
+ else
481
+ {
482
+ _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
483
+ if (sse0 && sse1)
484
+ flags = UNIX64_RET_ST_XMM0_XMM1;
485
+ else if (sse0)
486
+ flags = UNIX64_RET_ST_XMM0_RAX;
487
+ else if (sse1)
488
+ flags = UNIX64_RET_ST_RAX_XMM0;
489
+ else
490
+ flags = UNIX64_RET_ST_RAX_RDX;
491
+ flags |= rtype_size << UNIX64_SIZE_SHIFT;
492
+ }
493
+ }
494
+ break;
495
+ case FFI_TYPE_COMPLEX:
496
+ switch (rtype->elements[0]->type)
497
+ {
498
+ case FFI_TYPE_UINT8:
499
+ case FFI_TYPE_SINT8:
500
+ case FFI_TYPE_UINT16:
501
+ case FFI_TYPE_SINT16:
502
+ case FFI_TYPE_INT:
503
+ case FFI_TYPE_UINT32:
504
+ case FFI_TYPE_SINT32:
505
+ case FFI_TYPE_UINT64:
506
+ case FFI_TYPE_SINT64:
507
+ flags = UNIX64_RET_ST_RAX_RDX | ((unsigned) rtype_size << UNIX64_SIZE_SHIFT);
508
+ break;
509
+ case FFI_TYPE_FLOAT:
510
+ flags = UNIX64_RET_XMM64;
511
+ break;
512
+ case FFI_TYPE_DOUBLE:
513
+ flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT);
514
+ break;
515
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
516
+ case FFI_TYPE_LONGDOUBLE:
517
+ flags = UNIX64_RET_X87_2;
518
+ break;
519
+ #endif
520
+ default:
521
+ return FFI_BAD_TYPEDEF;
363
522
  }
523
+ break;
524
+ default:
525
+ return FFI_BAD_TYPEDEF;
364
526
  }
365
527
 
366
528
  /* Go over all arguments and determine the way they should be passed.
@@ -377,7 +539,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
377
539
  if (align < 8)
378
540
  align = 8;
379
541
 
380
- bytes = ALIGN(bytes, align);
542
+ bytes = FFI_ALIGN (bytes, align);
381
543
  bytes += cif->arg_types[i]->size;
382
544
  }
383
545
  else
@@ -387,53 +549,58 @@ ffi_prep_cif_machdep (ffi_cif *cif)
387
549
  }
388
550
  }
389
551
  if (ssecount)
390
- flags |= 1 << 11;
552
+ flags |= UNIX64_FLAG_XMM_ARGS;
553
+
391
554
  cif->flags = flags;
392
- cif->bytes = bytes;
555
+ cif->bytes = (unsigned) FFI_ALIGN (bytes, 8);
393
556
 
394
557
  return FFI_OK;
395
558
  }
396
559
 
397
- void
398
- ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
560
+ static void
561
+ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
562
+ void **avalue, void *closure)
399
563
  {
400
564
  enum x86_64_reg_class classes[MAX_CLASSES];
401
565
  char *stack, *argp;
402
566
  ffi_type **arg_types;
403
- int gprcount, ssecount, ngpr, nsse, i, avn;
404
- _Bool ret_in_memory;
567
+ int gprcount, ssecount, ngpr, nsse, i, avn, flags;
405
568
  struct register_args *reg_args;
406
569
 
407
570
  /* Can't call 32-bit mode from 64-bit mode. */
408
571
  FFI_ASSERT (cif->abi == FFI_UNIX64);
409
572
 
410
573
  /* If the return value is a struct and we don't have a return value
411
- address then we need to make one. Note the setting of flags to
412
- VOID above in ffi_prep_cif_machdep. */
413
- ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT
414
- && (cif->flags & 0xff) == FFI_TYPE_VOID);
415
- if (rvalue == NULL && ret_in_memory)
416
- rvalue = alloca (cif->rtype->size);
574
+ address then we need to make one. Otherwise we can ignore it. */
575
+ flags = cif->flags;
576
+ if (rvalue == NULL)
577
+ {
578
+ if (flags & UNIX64_FLAG_RET_IN_MEM)
579
+ rvalue = alloca (cif->rtype->size);
580
+ else
581
+ flags = UNIX64_RET_VOID;
582
+ }
583
+
584
+ arg_types = cif->arg_types;
585
+ avn = cif->nargs;
417
586
 
418
587
  /* Allocate the space for the arguments, plus 4 words of temp space. */
419
588
  stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
420
589
  reg_args = (struct register_args *) stack;
421
590
  argp = stack + sizeof (struct register_args);
422
591
 
592
+ reg_args->r10 = (uintptr_t) closure;
593
+
423
594
  gprcount = ssecount = 0;
424
595
 
425
596
  /* If the return value is passed in memory, add the pointer as the
426
597
  first integer argument. */
427
- if (ret_in_memory)
428
- reg_args->gpr[gprcount++] = (long) rvalue;
429
-
430
- avn = cif->nargs;
431
- arg_types = cif->arg_types;
598
+ if (flags & UNIX64_FLAG_RET_IN_MEM)
599
+ reg_args->gpr[gprcount++] = (unsigned long) rvalue;
432
600
 
433
601
  for (i = 0; i < avn; ++i)
434
602
  {
435
- size_t size = arg_types[i]->size;
436
- int n;
603
+ size_t n, size = arg_types[i]->size;
437
604
 
438
605
  n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
439
606
  if (n == 0
@@ -446,33 +613,54 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
446
613
  if (align < 8)
447
614
  align = 8;
448
615
 
449
- /* Pass this argument in memory. */
450
- argp = (void *) ALIGN (argp, align);
451
- memcpy (argp, avalue[i], size);
452
- argp += size;
453
- }
616
+ /* Pass this argument in memory. */
617
+ argp = (void *) FFI_ALIGN (argp, align);
618
+ memcpy (argp, avalue[i], size);
619
+
620
+ argp += size;
621
+ }
454
622
  else
455
623
  {
456
624
  /* The argument is passed entirely in registers. */
457
625
  char *a = (char *) avalue[i];
458
- int j;
626
+ unsigned int j;
459
627
 
460
628
  for (j = 0; j < n; j++, a += 8, size -= 8)
461
629
  {
462
630
  switch (classes[j])
463
631
  {
632
+ case X86_64_NO_CLASS:
633
+ case X86_64_SSEUP_CLASS:
634
+ break;
464
635
  case X86_64_INTEGER_CLASS:
465
636
  case X86_64_INTEGERSI_CLASS:
466
- reg_args->gpr[gprcount] = 0;
467
- memcpy (&reg_args->gpr[gprcount], a, size < 8 ? size : 8);
637
+ /* Sign-extend integer arguments passed in general
638
+ purpose registers, to cope with the fact that
639
+ LLVM incorrectly assumes that this will be done
640
+ (the x86-64 PS ABI does not specify this). */
641
+ switch (arg_types[i]->type)
642
+ {
643
+ case FFI_TYPE_SINT8:
644
+ reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a);
645
+ break;
646
+ case FFI_TYPE_SINT16:
647
+ reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a);
648
+ break;
649
+ case FFI_TYPE_SINT32:
650
+ reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a);
651
+ break;
652
+ default:
653
+ reg_args->gpr[gprcount] = 0;
654
+ memcpy (&reg_args->gpr[gprcount], a, size);
655
+ }
468
656
  gprcount++;
469
657
  break;
470
658
  case X86_64_SSE_CLASS:
471
659
  case X86_64_SSEDF_CLASS:
472
- reg_args->sse[ssecount++] = *(UINT64 *) a;
660
+ memcpy (&reg_args->sse[ssecount++].i64, a, sizeof(UINT64));
473
661
  break;
474
662
  case X86_64_SSESF_CLASS:
475
- reg_args->sse[ssecount++] = *(UINT32 *) a;
663
+ memcpy (&reg_args->sse[ssecount++].i32, a, sizeof(UINT32));
476
664
  break;
477
665
  default:
478
666
  abort();
@@ -480,13 +668,87 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
480
668
  }
481
669
  }
482
670
  }
671
+ reg_args->rax = ssecount;
483
672
 
484
673
  ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args),
485
- cif->flags, rvalue, fn, ssecount);
674
+ flags, rvalue, fn);
675
+ }
676
+
677
+ #ifndef __ILP32__
678
+ extern void
679
+ ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
680
+ #endif
681
+
682
+ void
683
+ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
684
+ {
685
+ ffi_type **arg_types = cif->arg_types;
686
+ int i, nargs = cif->nargs;
687
+ const int max_reg_struct_size = cif->abi == FFI_GNUW64 ? 8 : 16;
688
+
689
+ /* If we have any large structure arguments, make a copy so we are passing
690
+ by value. */
691
+ for (i = 0; i < nargs; i++)
692
+ {
693
+ ffi_type *at = arg_types[i];
694
+ int size = at->size;
695
+ if (at->type == FFI_TYPE_STRUCT && size > max_reg_struct_size)
696
+ {
697
+ char *argcopy = alloca (size);
698
+ memcpy (argcopy, avalue[i], size);
699
+ avalue[i] = argcopy;
700
+ }
701
+ }
702
+
703
+ #ifndef __ILP32__
704
+ if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
705
+ {
706
+ ffi_call_efi64(cif, fn, rvalue, avalue);
707
+ return;
708
+ }
709
+ #endif
710
+ ffi_call_int (cif, fn, rvalue, avalue, NULL);
711
+ }
712
+
713
+ #ifdef FFI_GO_CLOSURES
714
+
715
+ #ifndef __ILP32__
716
+ extern void
717
+ ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue,
718
+ void **avalue, void *closure);
719
+ #endif
720
+
721
+ void
722
+ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
723
+ void **avalue, void *closure)
724
+ {
725
+ #ifndef __ILP32__
726
+ if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
727
+ {
728
+ ffi_call_go_efi64(cif, fn, rvalue, avalue, closure);
729
+ return;
730
+ }
731
+ #endif
732
+ ffi_call_int (cif, fn, rvalue, avalue, closure);
486
733
  }
487
734
 
735
+ #endif /* FFI_GO_CLOSURES */
488
736
 
489
- extern void ffi_closure_unix64(void);
737
+ extern void ffi_closure_unix64(void) FFI_HIDDEN;
738
+ extern void ffi_closure_unix64_sse(void) FFI_HIDDEN;
739
+ #if defined(FFI_EXEC_STATIC_TRAMP)
740
+ extern void ffi_closure_unix64_alt(void) FFI_HIDDEN;
741
+ extern void ffi_closure_unix64_sse_alt(void) FFI_HIDDEN;
742
+ #endif
743
+
744
+ #ifndef __ILP32__
745
+ extern ffi_status
746
+ ffi_prep_closure_loc_efi64(ffi_closure* closure,
747
+ ffi_cif* cif,
748
+ void (*fun)(ffi_cif*, void*, void**, void*),
749
+ void *user_data,
750
+ void *codeloc);
751
+ #endif
490
752
 
491
753
  ffi_status
492
754
  ffi_prep_closure_loc (ffi_closure* closure,
@@ -495,21 +757,51 @@ ffi_prep_closure_loc (ffi_closure* closure,
495
757
  void *user_data,
496
758
  void *codeloc)
497
759
  {
498
- volatile unsigned short *tramp;
499
-
500
- tramp = (volatile unsigned short *) &closure->tramp[0];
501
-
502
- tramp[0] = 0xbb49; /* mov <code>, %r11 */
503
- *(void * volatile *) &tramp[1] = ffi_closure_unix64;
504
- tramp[5] = 0xba49; /* mov <data>, %r10 */
505
- *(void * volatile *) &tramp[6] = codeloc;
506
-
507
- /* Set the carry bit iff the function uses any sse registers.
508
- This is clc or stc, together with the first byte of the jmp. */
509
- tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8;
760
+ static const unsigned char trampoline[24] = {
761
+ /* endbr64 */
762
+ 0xf3, 0x0f, 0x1e, 0xfa,
763
+ /* leaq -0xb(%rip),%r10 # 0x0 */
764
+ 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff,
765
+ /* jmpq *0x7(%rip) # 0x18 */
766
+ 0xff, 0x25, 0x07, 0x00, 0x00, 0x00,
767
+ /* nopl 0(%rax) */
768
+ 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00
769
+ };
770
+ void (*dest)(void);
771
+ char *tramp = closure->tramp;
772
+
773
+ #ifndef __ILP32__
774
+ if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
775
+ return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc);
776
+ #endif
777
+ if (cif->abi != FFI_UNIX64)
778
+ return FFI_BAD_ABI;
779
+
780
+ if (cif->flags & UNIX64_FLAG_XMM_ARGS)
781
+ dest = ffi_closure_unix64_sse;
782
+ else
783
+ dest = ffi_closure_unix64;
784
+
785
+ #if defined(FFI_EXEC_STATIC_TRAMP)
786
+ if (ffi_tramp_is_present(closure))
787
+ {
788
+ /* Initialize the static trampoline's parameters. */
789
+ if (dest == ffi_closure_unix64_sse)
790
+ dest = ffi_closure_unix64_sse_alt;
791
+ else
792
+ dest = ffi_closure_unix64_alt;
793
+ ffi_tramp_set_parms (closure->ftramp, dest, closure);
794
+ goto out;
795
+ }
796
+ #endif
510
797
 
511
- tramp[11] = 0xe3ff; /* jmp *%r11 */
798
+ /* Initialize the dynamic trampoline. */
799
+ memcpy (tramp, trampoline, sizeof(trampoline));
800
+ *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
512
801
 
802
+ #if defined(FFI_EXEC_STATIC_TRAMP)
803
+ out:
804
+ #endif
513
805
  closure->cif = cif;
514
806
  closure->fun = fun;
515
807
  closure->user_data = user_data;
@@ -517,53 +809,40 @@ ffi_prep_closure_loc (ffi_closure* closure,
517
809
  return FFI_OK;
518
810
  }
519
811
 
520
- int
521
- ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
522
- struct register_args *reg_args, char *argp)
812
+ int FFI_HIDDEN
813
+ ffi_closure_unix64_inner(ffi_cif *cif,
814
+ void (*fun)(ffi_cif*, void*, void**, void*),
815
+ void *user_data,
816
+ void *rvalue,
817
+ struct register_args *reg_args,
818
+ char *argp)
523
819
  {
524
- ffi_cif *cif;
525
820
  void **avalue;
526
821
  ffi_type **arg_types;
527
822
  long i, avn;
528
823
  int gprcount, ssecount, ngpr, nsse;
529
- int ret;
824
+ int flags;
530
825
 
531
- cif = closure->cif;
532
- avalue = alloca(cif->nargs * sizeof(void *));
826
+ avn = cif->nargs;
827
+ flags = cif->flags;
828
+ avalue = alloca(avn * sizeof(void *));
533
829
  gprcount = ssecount = 0;
534
830
 
535
- ret = cif->rtype->type;
536
- if (ret != FFI_TYPE_VOID)
831
+ if (flags & UNIX64_FLAG_RET_IN_MEM)
537
832
  {
538
- enum x86_64_reg_class classes[MAX_CLASSES];
539
- int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
540
- if (n == 0)
541
- {
542
- /* The return value goes in memory. Arrange for the closure
543
- return value to go directly back to the original caller. */
544
- rvalue = (void *) reg_args->gpr[gprcount++];
545
- /* We don't have to do anything in asm for the return. */
546
- ret = FFI_TYPE_VOID;
547
- }
548
- else if (ret == FFI_TYPE_STRUCT && n == 2)
549
- {
550
- /* Mark which register the second word of the structure goes in. */
551
- _Bool sse0 = SSE_CLASS_P (classes[0]);
552
- _Bool sse1 = SSE_CLASS_P (classes[1]);
553
- if (!sse0 && sse1)
554
- ret |= 1 << 8;
555
- else if (sse0 && !sse1)
556
- ret |= 1 << 9;
557
- }
833
+ /* On return, %rax will contain the address that was passed
834
+ by the caller in %rdi. */
835
+ void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++];
836
+ *(void **)rvalue = r;
837
+ rvalue = r;
838
+ flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64);
558
839
  }
559
840
 
560
- avn = cif->nargs;
561
841
  arg_types = cif->arg_types;
562
-
563
842
  for (i = 0; i < avn; ++i)
564
843
  {
565
844
  enum x86_64_reg_class classes[MAX_CLASSES];
566
- int n;
845
+ size_t n;
567
846
 
568
847
  n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
569
848
  if (n == 0
@@ -577,7 +856,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
577
856
  align = 8;
578
857
 
579
858
  /* Pass this argument in memory. */
580
- argp = (void *) ALIGN (argp, align);
859
+ argp = (void *) FFI_ALIGN (argp, align);
581
860
  avalue[i] = argp;
582
861
  argp += arg_types[i]->size;
583
862
  }
@@ -603,7 +882,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
603
882
  else
604
883
  {
605
884
  char *a = alloca (16);
606
- int j;
885
+ unsigned int j;
607
886
 
608
887
  avalue[i] = a;
609
888
  for (j = 0; j < n; j++, a += 8)
@@ -617,10 +896,55 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
617
896
  }
618
897
 
619
898
  /* Invoke the closure. */
620
- closure->fun (cif, rvalue, avalue, closure->user_data);
899
+ fun (cif, rvalue, avalue, user_data);
621
900
 
622
901
  /* Tell assembly how to perform return type promotions. */
623
- return ret;
902
+ return flags;
903
+ }
904
+
905
+ #ifdef FFI_GO_CLOSURES
906
+
907
+ extern void ffi_go_closure_unix64(void) FFI_HIDDEN;
908
+ extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN;
909
+
910
+ #ifndef __ILP32__
911
+ extern ffi_status
912
+ ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif,
913
+ void (*fun)(ffi_cif*, void*, void**, void*));
914
+ #endif
915
+
916
+ ffi_status
917
+ ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
918
+ void (*fun)(ffi_cif*, void*, void**, void*))
919
+ {
920
+ #ifndef __ILP32__
921
+ if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
922
+ return ffi_prep_go_closure_efi64(closure, cif, fun);
923
+ #endif
924
+ if (cif->abi != FFI_UNIX64)
925
+ return FFI_BAD_ABI;
926
+
927
+ closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS
928
+ ? ffi_go_closure_unix64_sse
929
+ : ffi_go_closure_unix64);
930
+ closure->cif = cif;
931
+ closure->fun = fun;
932
+
933
+ return FFI_OK;
934
+ }
935
+
936
+ #endif /* FFI_GO_CLOSURES */
937
+
938
+ #if defined(FFI_EXEC_STATIC_TRAMP)
939
+ void *
940
+ ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
941
+ {
942
+ extern void *trampoline_code_table;
943
+
944
+ *map_size = UNIX64_TRAMP_MAP_SIZE;
945
+ *tramp_size = UNIX64_TRAMP_SIZE;
946
+ return &trampoline_code_table;
624
947
  }
948
+ #endif
625
949
 
626
950
  #endif /* __x86_64__ */