ffi 1.1.2 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (706) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +456 -0
  4. data/COPYING +49 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE +21 -11
  7. data/LICENSE.SPECS +22 -0
  8. data/README.md +137 -0
  9. data/Rakefile +166 -156
  10. data/ext/ffi_c/AbstractMemory.c +240 -140
  11. data/ext/ffi_c/AbstractMemory.h +25 -15
  12. data/ext/ffi_c/ArrayType.c +78 -29
  13. data/ext/ffi_c/ArrayType.h +22 -12
  14. data/ext/ffi_c/Buffer.c +121 -60
  15. data/ext/ffi_c/Call.c +184 -137
  16. data/ext/ffi_c/Call.h +46 -22
  17. data/ext/ffi_c/ClosurePool.c +101 -43
  18. data/ext/ffi_c/ClosurePool.h +24 -13
  19. data/ext/ffi_c/DynamicLibrary.c +139 -57
  20. data/ext/ffi_c/DynamicLibrary.h +70 -12
  21. data/ext/ffi_c/Function.c +372 -273
  22. data/ext/ffi_c/Function.h +25 -20
  23. data/ext/ffi_c/FunctionInfo.c +135 -49
  24. data/ext/ffi_c/LastError.c +97 -30
  25. data/ext/ffi_c/LastError.h +21 -12
  26. data/ext/ffi_c/LongDouble.c +15 -9
  27. data/ext/ffi_c/LongDouble.h +21 -16
  28. data/ext/ffi_c/MappedType.c +88 -38
  29. data/ext/ffi_c/MappedType.h +21 -14
  30. data/ext/ffi_c/MemoryPointer.c +91 -38
  31. data/ext/ffi_c/MemoryPointer.h +22 -19
  32. data/ext/ffi_c/MethodHandle.c +52 -51
  33. data/ext/ffi_c/MethodHandle.h +24 -14
  34. data/ext/ffi_c/Platform.c +28 -62
  35. data/ext/ffi_c/Platform.h +21 -12
  36. data/ext/ffi_c/Pointer.c +145 -86
  37. data/ext/ffi_c/Pointer.h +23 -19
  38. data/ext/ffi_c/Struct.c +363 -163
  39. data/ext/ffi_c/Struct.h +39 -21
  40. data/ext/ffi_c/StructByValue.c +72 -37
  41. data/ext/ffi_c/StructByValue.h +21 -12
  42. data/ext/ffi_c/StructLayout.c +308 -94
  43. data/ext/ffi_c/Thread.c +73 -270
  44. data/ext/ffi_c/Thread.h +32 -35
  45. data/ext/ffi_c/Type.c +147 -84
  46. data/ext/ffi_c/Type.h +27 -11
  47. data/ext/ffi_c/Types.c +40 -24
  48. data/ext/ffi_c/Types.h +24 -21
  49. data/ext/ffi_c/Variadic.c +148 -64
  50. data/ext/ffi_c/compat.h +45 -37
  51. data/ext/ffi_c/extconf.rb +86 -32
  52. data/ext/ffi_c/ffi.c +32 -21
  53. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  54. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  55. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  56. data/ext/ffi_c/libffi/.appveyor.yml +84 -0
  57. data/ext/ffi_c/libffi/.ci/ar-lib +270 -0
  58. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  60. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  61. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  62. data/ext/ffi_c/libffi/.ci/compile +351 -0
  63. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  64. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  65. data/ext/ffi_c/libffi/.ci/moxie-sim.exp +60 -0
  66. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  67. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  68. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  69. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  70. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  71. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  72. data/ext/ffi_c/libffi/.gitattributes +4 -0
  73. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  74. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  75. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  76. data/ext/ffi_c/libffi/.gitignore +46 -0
  77. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6366 -3559
  78. data/ext/ffi_c/libffi/LICENSE +1 -1
  79. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  80. data/ext/ffi_c/libffi/Makefile.am +131 -170
  81. data/ext/ffi_c/libffi/Makefile.in +1317 -1010
  82. data/ext/ffi_c/libffi/README.md +531 -0
  83. data/ext/ffi_c/libffi/acinclude.m4 +289 -4
  84. data/ext/ffi_c/libffi/autogen.sh +2 -0
  85. data/ext/ffi_c/libffi/compile +222 -17
  86. data/ext/ffi_c/libffi/config.guess +1033 -780
  87. data/ext/ffi_c/libffi/config.sub +1393 -1206
  88. data/ext/ffi_c/libffi/configure +16340 -10740
  89. data/ext/ffi_c/libffi/configure.ac +226 -271
  90. data/ext/ffi_c/libffi/configure.host +330 -4
  91. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  92. data/ext/ffi_c/libffi/doc/Makefile.in +818 -0
  93. data/ext/ffi_c/libffi/doc/libffi.texi +525 -79
  94. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  95. data/ext/ffi_c/libffi/fficonfig.h.in +41 -52
  96. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +312 -0
  97. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  98. data/ext/ffi_c/libffi/include/Makefile.in +201 -79
  99. data/ext/ffi_c/libffi/include/ffi.h.in +190 -99
  100. data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
  101. data/ext/ffi_c/libffi/include/ffi_common.h +72 -14
  102. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  103. data/ext/ffi_c/libffi/install-sh +231 -210
  104. data/ext/ffi_c/libffi/libffi.map.in +81 -0
  105. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  106. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
  107. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  108. data/ext/ffi_c/libffi/libtool-version +2 -2
  109. data/ext/ffi_c/libffi/ltmain.sh +3868 -2068
  110. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  111. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
  112. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +47 -25
  113. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +110 -147
  114. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
  115. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +75 -19
  116. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +8 -29
  117. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +11 -9
  118. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +104 -52
  119. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +18 -8
  120. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  121. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  122. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  123. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  124. data/ext/ffi_c/libffi/man/Makefile.in +156 -57
  125. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  126. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  127. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  128. data/ext/ffi_c/libffi/missing +153 -314
  129. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  130. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  131. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  132. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  133. data/ext/ffi_c/libffi/{include/ffi.h.vc64 → msvc_build/aarch64/aarch64_include/ffi.h} +151 -67
  134. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  135. data/ext/ffi_c/libffi/msvcc.sh +176 -20
  136. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1142 -0
  137. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
  138. data/ext/ffi_c/libffi/src/aarch64/internal.h +100 -0
  139. data/ext/ffi_c/libffi/src/aarch64/sysv.S +695 -0
  140. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  141. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  142. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  143. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  144. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  145. data/ext/ffi_c/libffi/src/arc/arcompact.S +210 -0
  146. data/ext/ffi_c/libffi/src/arc/ffi.c +443 -0
  147. data/ext/ffi_c/libffi/src/arc/ffitarget.h +67 -0
  148. data/ext/ffi_c/libffi/src/arm/ffi.c +706 -513
  149. data/ext/ffi_c/libffi/src/arm/ffitarget.h +32 -8
  150. data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
  151. data/ext/ffi_c/libffi/src/arm/sysv.S +372 -413
  152. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  153. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  154. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  155. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  156. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  157. data/ext/ffi_c/libffi/src/closures.c +565 -73
  158. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  159. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  160. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  161. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  162. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  163. data/ext/ffi_c/libffi/src/debug.c +8 -3
  164. data/ext/ffi_c/libffi/src/dlmalloc.c +23 -13
  165. data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
  166. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  167. data/ext/ffi_c/libffi/src/ia64/ffi.c +47 -13
  168. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +8 -2
  169. data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
  170. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  171. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  172. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  173. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  174. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  175. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  176. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  177. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  178. data/ext/ffi_c/libffi/src/m32r/ffi.c +32 -15
  179. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  180. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  181. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  182. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  183. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  184. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  185. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  186. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  187. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  188. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  189. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  190. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  191. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  192. data/ext/ffi_c/libffi/src/mips/ffi.c +382 -101
  193. data/ext/ffi_c/libffi/src/mips/ffitarget.h +23 -14
  194. data/ext/ffi_c/libffi/src/mips/n32.S +321 -89
  195. data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
  196. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  197. data/ext/ffi_c/libffi/src/moxie/ffi.c +100 -66
  198. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  199. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  200. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  201. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  202. data/ext/ffi_c/libffi/src/or1k/ffi.c +341 -0
  203. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  204. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  205. data/ext/ffi_c/libffi/src/pa/ffi.c +62 -108
  206. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  207. data/ext/ffi_c/libffi/src/pa/ffitarget.h +28 -12
  208. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  209. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  210. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  211. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  212. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  213. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  214. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  215. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  216. data/ext/ffi_c/libffi/src/powerpc/ffi.c +105 -1378
  217. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +157 -52
  218. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
  219. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
  220. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  221. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +110 -45
  222. data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
  223. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
  224. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  225. data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
  226. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  227. data/ext/ffi_c/libffi/src/prep_cif.c +131 -25
  228. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  229. data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
  230. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  231. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  232. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  233. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  234. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  235. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  236. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  237. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  238. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  239. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  240. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  241. data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
  242. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  243. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  244. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  245. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  246. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  247. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  248. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  249. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  250. data/ext/ffi_c/libffi/src/types.c +48 -19
  251. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  252. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  253. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  254. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  255. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  256. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  257. data/ext/ffi_c/libffi/src/x86/ffi.c +686 -498
  258. data/ext/ffi_c/libffi/src/x86/ffi64.c +444 -129
  259. data/ext/ffi_c/libffi/src/x86/ffitarget.h +79 -36
  260. data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
  261. data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
  262. data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
  263. data/ext/ffi_c/libffi/src/x86/sysv.S +1198 -394
  264. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  265. data/ext/ffi_c/libffi/src/x86/unix64.S +585 -300
  266. data/ext/ffi_c/libffi/src/x86/win64.S +244 -458
  267. data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
  268. data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
  269. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
  270. data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
  271. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  272. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
  273. data/ext/ffi_c/libffi/testsuite/Makefile.in +233 -117
  274. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  275. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  276. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  277. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  278. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  279. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  280. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +360 -28
  281. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
  282. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -6
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +52 -42
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +9 -10
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +134 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  349. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  350. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  351. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  352. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  353. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  354. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  355. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  356. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  357. data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
  358. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
  359. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
  360. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
  361. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
  362. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
  363. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
  364. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
  365. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
  366. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
  367. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
  368. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
  369. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
  370. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
  371. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
  372. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
  373. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
  374. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
  375. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
  376. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
  377. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
  378. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
  379. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
  380. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
  381. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
  382. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
  383. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
  384. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
  385. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
  386. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
  387. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
  388. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
  389. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
  390. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
  391. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +22 -5
  392. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
  393. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
  394. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +23 -5
  395. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
  396. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +19 -10
  397. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  398. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +14 -4
  399. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +32 -12
  400. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
  401. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
  402. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  403. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  404. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  405. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  406. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  407. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  408. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +6 -1
  409. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +21 -9
  410. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  411. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  412. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
  414. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  415. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
  418. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +7 -5
  419. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  421. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +41 -40
  422. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
  423. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
  424. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
  425. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  428. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +15 -6
  429. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
  430. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
  431. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
  432. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
  433. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
  434. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
  435. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
  436. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  439. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
  440. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
  441. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
  442. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +6 -6
  443. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
  444. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
  445. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
  446. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  457. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  458. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  459. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  460. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  461. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  462. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  463. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  464. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  465. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  466. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  467. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  468. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  469. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  470. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  471. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  472. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  473. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  474. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  475. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  476. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  477. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  478. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  479. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  480. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  481. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  482. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  483. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  484. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  485. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  486. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  487. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  488. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  489. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  490. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  491. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  492. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  493. data/ext/ffi_c/libffi.bsd.mk +13 -7
  494. data/ext/ffi_c/libffi.darwin.mk +25 -13
  495. data/ext/ffi_c/libffi.gnu.mk +4 -3
  496. data/ext/ffi_c/libffi.mk +11 -6
  497. data/ext/ffi_c/libffi.vc.mk +1 -1
  498. data/ext/ffi_c/libffi.vc64.mk +1 -1
  499. data/ext/ffi_c/rbffi.h +23 -15
  500. data/ext/ffi_c/rbffi_endian.h +11 -2
  501. data/ffi.gemspec +42 -0
  502. data/lib/ffi/abstract_memory.rb +44 -0
  503. data/lib/ffi/autopointer.rb +65 -68
  504. data/lib/ffi/compat.rb +43 -0
  505. data/lib/ffi/data_converter.rb +67 -0
  506. data/lib/ffi/dynamic_library.rb +118 -0
  507. data/lib/ffi/enum.rb +166 -25
  508. data/lib/ffi/errno.rb +21 -11
  509. data/lib/ffi/ffi.rb +28 -11
  510. data/lib/ffi/function.rb +71 -0
  511. data/lib/ffi/io.rb +25 -15
  512. data/lib/ffi/library.rb +227 -136
  513. data/lib/ffi/library_path.rb +109 -0
  514. data/lib/ffi/managedstruct.rb +64 -35
  515. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  516. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  517. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  518. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  519. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  520. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  521. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  522. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  523. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  524. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  525. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  526. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  527. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  528. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  529. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  530. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  531. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  532. data/lib/ffi/platform/i386-openbsd/types.conf +89 -87
  533. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  534. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  535. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  536. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  537. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  538. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  539. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  540. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  541. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  542. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  543. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  544. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  545. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  546. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  547. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  548. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  549. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  550. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  551. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  552. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  553. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  554. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  555. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  556. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  557. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  558. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  559. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  560. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  561. data/lib/ffi/platform/x86_64-darwin/types.conf +93 -63
  562. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  563. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -88
  564. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  565. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  566. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  567. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  568. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -87
  569. data/lib/ffi/platform/x86_64-openbsd/types.conf +100 -92
  570. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  571. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  572. data/lib/ffi/platform.rb +91 -34
  573. data/lib/ffi/pointer.rb +78 -33
  574. data/lib/ffi/struct.rb +100 -66
  575. data/lib/ffi/struct_by_reference.rb +72 -0
  576. data/lib/ffi/struct_layout.rb +96 -0
  577. data/lib/ffi/struct_layout_builder.rb +84 -19
  578. data/lib/ffi/tools/const_generator.rb +11 -8
  579. data/lib/ffi/tools/generator.rb +48 -1
  580. data/lib/ffi/tools/generator_task.rb +13 -16
  581. data/lib/ffi/tools/struct_generator.rb +6 -5
  582. data/lib/ffi/tools/types_generator.rb +14 -10
  583. data/lib/ffi/types.rb +96 -51
  584. data/lib/ffi/union.rb +23 -12
  585. data/lib/ffi/variadic.rb +44 -29
  586. data/lib/ffi/version.rb +3 -0
  587. data/lib/ffi.rb +20 -8
  588. data/rakelib/ffi_gem_helper.rb +65 -0
  589. data/samples/getlogin.rb +8 -0
  590. data/samples/getpid.rb +8 -0
  591. data/samples/gettimeofday.rb +18 -0
  592. data/samples/hello.rb +8 -0
  593. data/samples/hello_ractor.rb +11 -0
  594. data/samples/inotify.rb +60 -0
  595. data/samples/pty.rb +75 -0
  596. data/samples/qsort.rb +20 -0
  597. data/samples/qsort_ractor.rb +28 -0
  598. data/sig/ffi/abstract_memory.rbs +165 -0
  599. data/sig/ffi/auto_pointer.rbs +27 -0
  600. data/sig/ffi/buffer.rbs +18 -0
  601. data/sig/ffi/data_converter.rbs +10 -0
  602. data/sig/ffi/dynamic_library.rbs +9 -0
  603. data/sig/ffi/enum.rbs +38 -0
  604. data/sig/ffi/function.rbs +39 -0
  605. data/sig/ffi/library.rbs +42 -0
  606. data/sig/ffi/native_type.rbs +86 -0
  607. data/sig/ffi/pointer.rbs +42 -0
  608. data/sig/ffi/struct.rbs +76 -0
  609. data/sig/ffi/struct_by_reference.rbs +11 -0
  610. data/sig/ffi/struct_by_value.rbs +7 -0
  611. data/sig/ffi/struct_layout.rbs +9 -0
  612. data/sig/ffi/struct_layout_builder.rbs +5 -0
  613. data/sig/ffi/type.rbs +39 -0
  614. data/sig/ffi.rbs +26 -0
  615. data.tar.gz.sig +0 -0
  616. metadata +508 -268
  617. metadata.gz.sig +1 -0
  618. data/History.txt +0 -1
  619. data/README.rdoc +0 -102
  620. data/ext/ffi_c/DataConverter.c +0 -91
  621. data/ext/ffi_c/Ffi_c.iml +0 -12
  622. data/ext/ffi_c/StructByReference.c +0 -158
  623. data/ext/ffi_c/StructByReference.h +0 -50
  624. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  625. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  626. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  627. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  628. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  629. data/ext/ffi_c/libffi/README +0 -342
  630. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  631. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  632. data/ext/ffi_c/libffi/depcomp +0 -630
  633. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  634. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  635. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  636. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +0 -76
  637. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  638. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  639. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  640. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  641. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  642. data/ext/ffi_c/libffi/mdate-sh +0 -201
  643. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  644. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  645. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  646. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  647. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  648. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  649. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  650. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  651. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  652. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  653. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  654. data/ext/ffi_c/win32/stdint.h +0 -199
  655. data/gen/Rakefile +0 -30
  656. data/lib/Lib.iml +0 -13
  657. data/spec/ffi/Ffi.iml +0 -12
  658. data/spec/ffi/async_callback_spec.rb +0 -46
  659. data/spec/ffi/bool_spec.rb +0 -40
  660. data/spec/ffi/buffer_spec.rb +0 -215
  661. data/spec/ffi/callback_spec.rb +0 -668
  662. data/spec/ffi/custom_param_type.rb +0 -47
  663. data/spec/ffi/custom_type_spec.rb +0 -85
  664. data/spec/ffi/dup_spec.rb +0 -65
  665. data/spec/ffi/enum_spec.rb +0 -227
  666. data/spec/ffi/errno_spec.rb +0 -29
  667. data/spec/ffi/ffi_spec.rb +0 -40
  668. data/spec/ffi/function_spec.rb +0 -87
  669. data/spec/ffi/library_spec.rb +0 -208
  670. data/spec/ffi/long_double.rb +0 -41
  671. data/spec/ffi/managed_struct_spec.rb +0 -72
  672. data/spec/ffi/number_spec.rb +0 -247
  673. data/spec/ffi/pointer_spec.rb +0 -214
  674. data/spec/ffi/rbx/attach_function_spec.rb +0 -28
  675. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -111
  676. data/spec/ffi/rbx/spec_helper.rb +0 -1
  677. data/spec/ffi/rbx/struct_spec.rb +0 -13
  678. data/spec/ffi/spec_helper.rb +0 -35
  679. data/spec/ffi/string_spec.rb +0 -119
  680. data/spec/ffi/strptr_spec.rb +0 -61
  681. data/spec/ffi/struct_callback_spec.rb +0 -80
  682. data/spec/ffi/struct_initialize_spec.rb +0 -46
  683. data/spec/ffi/struct_packed_spec.rb +0 -62
  684. data/spec/ffi/struct_spec.rb +0 -719
  685. data/spec/ffi/typedef_spec.rb +0 -89
  686. data/spec/ffi/union_spec.rb +0 -76
  687. data/spec/ffi/variadic_spec.rb +0 -103
  688. data/spec/spec.opts +0 -4
  689. data/tasks/ann.rake +0 -80
  690. data/tasks/extension.rake +0 -32
  691. data/tasks/gem.rake +0 -199
  692. data/tasks/git.rake +0 -41
  693. data/tasks/notes.rake +0 -27
  694. data/tasks/post_load.rake +0 -34
  695. data/tasks/rdoc.rake +0 -50
  696. data/tasks/rubyforge.rake +0 -55
  697. data/tasks/setup.rb +0 -301
  698. data/tasks/spec.rake +0 -54
  699. data/tasks/svn.rake +0 -47
  700. data/tasks/test.rake +0 -40
  701. data/tasks/yard.rake +0 -11
  702. data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  703. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  704. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  705. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  706. data/lib/ffi/platform/{i486-gnu → i386-gnu}/types.conf +84 -84
@@ -1,9 +1,10 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi64.c - Copyright (c) 20011 Anthony Green
2
+ ffi64.c - Copyright (c) 2011, 2018, 2022 Anthony Green
3
+ Copyright (c) 2013 The Written Word, Inc.
3
4
  Copyright (c) 2008, 2010 Red Hat, Inc.
4
5
  Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
5
-
6
- x86-64 Foreign Function Interface
6
+
7
+ x86-64 Foreign Function Interface
7
8
 
8
9
  Permission is hereby granted, free of charge, to any person obtaining
9
10
  a copy of this software and associated documentation files (the
@@ -31,21 +32,45 @@
31
32
 
32
33
  #include <stdlib.h>
33
34
  #include <stdarg.h>
35
+ #include <stdint.h>
36
+ #include <tramp.h>
37
+ #include "internal64.h"
34
38
 
35
39
  #ifdef __x86_64__
36
40
 
37
41
  #define MAX_GPR_REGS 6
38
42
  #define MAX_SSE_REGS 8
39
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
+
40
63
  struct register_args
41
64
  {
42
65
  /* Registers for argument passing. */
43
66
  UINT64 gpr[MAX_GPR_REGS];
44
- __int128_t sse[MAX_SSE_REGS];
67
+ union big_int_union sse[MAX_SSE_REGS];
68
+ UINT64 rax; /* ssecount */
69
+ UINT64 r10; /* static chain */
45
70
  };
46
71
 
47
72
  extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
48
- void *raddr, void (*fnaddr)(void), unsigned ssecount);
73
+ void *raddr, void (*fnaddr)(void)) FFI_HIDDEN;
49
74
 
50
75
  /* All reference to register classes here is identical to the code in
51
76
  gcc/config/i386/i386.c. Do *not* change one without the other. */
@@ -132,7 +157,7 @@ merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
132
157
 
133
158
  See the x86-64 PS ABI for details.
134
159
  */
135
- static int
160
+ static size_t
136
161
  classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
137
162
  size_t byte_offset)
138
163
  {
@@ -147,8 +172,9 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
147
172
  case FFI_TYPE_UINT64:
148
173
  case FFI_TYPE_SINT64:
149
174
  case FFI_TYPE_POINTER:
175
+ do_integer:
150
176
  {
151
- int size = byte_offset + type->size;
177
+ size_t size = byte_offset + type->size;
152
178
 
153
179
  if (size <= 4)
154
180
  {
@@ -168,7 +194,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
168
194
  }
169
195
  else if (size <= 16)
170
196
  {
171
- classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
197
+ classes[0] = classes[1] = X86_64_INTEGER_CLASS;
172
198
  return 2;
173
199
  }
174
200
  else
@@ -183,16 +209,19 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
183
209
  case FFI_TYPE_DOUBLE:
184
210
  classes[0] = X86_64_SSEDF_CLASS;
185
211
  return 1;
212
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
186
213
  case FFI_TYPE_LONGDOUBLE:
187
214
  classes[0] = X86_64_X87_CLASS;
188
215
  classes[1] = X86_64_X87UP_CLASS;
189
216
  return 2;
217
+ #endif
190
218
  case FFI_TYPE_STRUCT:
191
219
  {
192
- const int UNITS_PER_WORD = 8;
193
- int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
194
- ffi_type **ptr;
195
- 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;
196
225
  enum x86_64_reg_class subclasses[MAX_CLASSES];
197
226
 
198
227
  /* If the struct is larger than 32 bytes, pass it on the stack. */
@@ -206,6 +235,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
206
235
  signalize memory class, so handle it as special case. */
207
236
  if (!words)
208
237
  {
238
+ case FFI_TYPE_VOID:
209
239
  classes[0] = X86_64_NO_CLASS;
210
240
  return 1;
211
241
  }
@@ -213,16 +243,17 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
213
243
  /* Merge the fields of structure. */
214
244
  for (ptr = type->elements; *ptr != NULL; ptr++)
215
245
  {
216
- int num;
246
+ size_t num, pos;
217
247
 
218
- byte_offset = ALIGN (byte_offset, (*ptr)->alignment);
248
+ byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment);
219
249
 
220
250
  num = classify_argument (*ptr, subclasses, byte_offset % 8);
221
251
  if (num == 0)
222
252
  return 0;
223
- for (i = 0; i < num; i++)
253
+ pos = byte_offset / 8;
254
+ for (i = 0; i < num && (i + pos) < words; i++)
224
255
  {
225
- int pos = byte_offset / 8;
256
+ size_t pos = byte_offset / 8;
226
257
  classes[i + pos] =
227
258
  merge_classes (subclasses[i], classes[i + pos]);
228
259
  }
@@ -254,7 +285,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
254
285
 
255
286
  /* The X86_64_SSEUP_CLASS should be always preceded by
256
287
  X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
257
- if (classes[i] == X86_64_SSEUP_CLASS
288
+ if (i > 1 && classes[i] == X86_64_SSEUP_CLASS
258
289
  && classes[i - 1] != X86_64_SSE_CLASS
259
290
  && classes[i - 1] != X86_64_SSEUP_CLASS)
260
291
  {
@@ -265,7 +296,7 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
265
296
 
266
297
  /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
267
298
  everything should be passed in memory. */
268
- if (classes[i] == X86_64_X87UP_CLASS
299
+ if (i > 1 && classes[i] == X86_64_X87UP_CLASS
269
300
  && (classes[i - 1] != X86_64_X87_CLASS))
270
301
  {
271
302
  /* The first one should never be X86_64_X87UP_CLASS. */
@@ -275,22 +306,55 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
275
306
  }
276
307
  return words;
277
308
  }
278
-
279
- default:
280
- 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
+ }
281
343
  }
282
- return 0; /* Never reached. */
344
+ abort();
283
345
  }
284
346
 
285
347
  /* Examine the argument and return set number of register required in each
286
348
  class. Return zero iff parameter should be passed in memory, otherwise
287
349
  the number of registers. */
288
350
 
289
- static int
351
+ static size_t
290
352
  examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
291
353
  _Bool in_return, int *pngpr, int *pnsse)
292
354
  {
293
- int i, n, ngpr, nsse;
355
+ size_t n;
356
+ unsigned int i;
357
+ int ngpr, nsse;
294
358
 
295
359
  n = classify_argument (type, classes, 0);
296
360
  if (n == 0)
@@ -328,18 +392,74 @@ examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
328
392
 
329
393
  /* Perform machine dependent cif processing. */
330
394
 
331
- 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
332
401
  ffi_prep_cif_machdep (ffi_cif *cif)
333
402
  {
334
- int gprcount, ssecount, i, avn, n, ngpr, nsse, flags;
403
+ int gprcount, ssecount, i, avn, ngpr, nsse;
404
+ unsigned flags;
335
405
  enum x86_64_reg_class classes[MAX_CLASSES];
336
- 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;
337
415
 
338
416
  gprcount = ssecount = 0;
339
417
 
340
- flags = cif->rtype->type;
341
- if (flags != FFI_TYPE_VOID)
418
+ rtype = cif->rtype;
419
+ rtype_size = rtype->size;
420
+ switch (rtype->type)
342
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:
343
463
  n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
344
464
  if (n == 0)
345
465
  {
@@ -347,22 +467,62 @@ ffi_prep_cif_machdep (ffi_cif *cif)
347
467
  memory is the first argument. Allocate a register for it. */
348
468
  gprcount++;
349
469
  /* We don't have to do anything in asm for the return. */
350
- flags = FFI_TYPE_VOID;
470
+ flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM;
351
471
  }
352
- else if (flags == FFI_TYPE_STRUCT)
472
+ else
353
473
  {
354
- /* Mark which registers the result appears in. */
355
474
  _Bool sse0 = SSE_CLASS_P (classes[0]);
356
- _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
357
- if (sse0 && !sse1)
358
- flags |= 1 << 8;
359
- else if (!sse0 && sse1)
360
- flags |= 1 << 9;
361
- else if (sse0 && sse1)
362
- flags |= 1 << 10;
363
- /* Mark the true size of the structure. */
364
- 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;
365
522
  }
523
+ break;
524
+ default:
525
+ return FFI_BAD_TYPEDEF;
366
526
  }
367
527
 
368
528
  /* Go over all arguments and determine the way they should be passed.
@@ -379,7 +539,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
379
539
  if (align < 8)
380
540
  align = 8;
381
541
 
382
- bytes = ALIGN (bytes, align);
542
+ bytes = FFI_ALIGN (bytes, align);
383
543
  bytes += cif->arg_types[i]->size;
384
544
  }
385
545
  else
@@ -389,53 +549,58 @@ ffi_prep_cif_machdep (ffi_cif *cif)
389
549
  }
390
550
  }
391
551
  if (ssecount)
392
- flags |= 1 << 11;
552
+ flags |= UNIX64_FLAG_XMM_ARGS;
553
+
393
554
  cif->flags = flags;
394
- cif->bytes = ALIGN (bytes, 8);
555
+ cif->bytes = (unsigned) FFI_ALIGN (bytes, 8);
395
556
 
396
557
  return FFI_OK;
397
558
  }
398
559
 
399
- void
400
- 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)
401
563
  {
402
564
  enum x86_64_reg_class classes[MAX_CLASSES];
403
565
  char *stack, *argp;
404
566
  ffi_type **arg_types;
405
- int gprcount, ssecount, ngpr, nsse, i, avn;
406
- _Bool ret_in_memory;
567
+ int gprcount, ssecount, ngpr, nsse, i, avn, flags;
407
568
  struct register_args *reg_args;
408
569
 
409
570
  /* Can't call 32-bit mode from 64-bit mode. */
410
571
  FFI_ASSERT (cif->abi == FFI_UNIX64);
411
572
 
412
573
  /* If the return value is a struct and we don't have a return value
413
- address then we need to make one. Note the setting of flags to
414
- VOID above in ffi_prep_cif_machdep. */
415
- ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT
416
- && (cif->flags & 0xff) == FFI_TYPE_VOID);
417
- if (rvalue == NULL && ret_in_memory)
418
- 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;
419
586
 
420
587
  /* Allocate the space for the arguments, plus 4 words of temp space. */
421
588
  stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
422
589
  reg_args = (struct register_args *) stack;
423
590
  argp = stack + sizeof (struct register_args);
424
591
 
592
+ reg_args->r10 = (uintptr_t) closure;
593
+
425
594
  gprcount = ssecount = 0;
426
595
 
427
596
  /* If the return value is passed in memory, add the pointer as the
428
597
  first integer argument. */
429
- if (ret_in_memory)
430
- reg_args->gpr[gprcount++] = (long) rvalue;
431
-
432
- avn = cif->nargs;
433
- arg_types = cif->arg_types;
598
+ if (flags & UNIX64_FLAG_RET_IN_MEM)
599
+ reg_args->gpr[gprcount++] = (unsigned long) rvalue;
434
600
 
435
601
  for (i = 0; i < avn; ++i)
436
602
  {
437
- size_t size = arg_types[i]->size;
438
- int n;
603
+ size_t n, size = arg_types[i]->size;
439
604
 
440
605
  n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
441
606
  if (n == 0
@@ -448,33 +613,54 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
448
613
  if (align < 8)
449
614
  align = 8;
450
615
 
451
- /* Pass this argument in memory. */
452
- argp = (void *) ALIGN (argp, align);
453
- memcpy (argp, avalue[i], size);
454
- argp += size;
455
- }
616
+ /* Pass this argument in memory. */
617
+ argp = (void *) FFI_ALIGN (argp, align);
618
+ memcpy (argp, avalue[i], size);
619
+
620
+ argp += size;
621
+ }
456
622
  else
457
623
  {
458
624
  /* The argument is passed entirely in registers. */
459
625
  char *a = (char *) avalue[i];
460
- int j;
626
+ unsigned int j;
461
627
 
462
628
  for (j = 0; j < n; j++, a += 8, size -= 8)
463
629
  {
464
630
  switch (classes[j])
465
631
  {
632
+ case X86_64_NO_CLASS:
633
+ case X86_64_SSEUP_CLASS:
634
+ break;
466
635
  case X86_64_INTEGER_CLASS:
467
636
  case X86_64_INTEGERSI_CLASS:
468
- reg_args->gpr[gprcount] = 0;
469
- 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
+ }
470
656
  gprcount++;
471
657
  break;
472
658
  case X86_64_SSE_CLASS:
473
659
  case X86_64_SSEDF_CLASS:
474
- reg_args->sse[ssecount++] = *(UINT64 *) a;
660
+ memcpy (&reg_args->sse[ssecount++].i64, a, sizeof(UINT64));
475
661
  break;
476
662
  case X86_64_SSESF_CLASS:
477
- reg_args->sse[ssecount++] = *(UINT32 *) a;
663
+ memcpy (&reg_args->sse[ssecount++].i32, a, sizeof(UINT32));
478
664
  break;
479
665
  default:
480
666
  abort();
@@ -482,13 +668,87 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
482
668
  }
483
669
  }
484
670
  }
671
+ reg_args->rax = ssecount;
485
672
 
486
673
  ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args),
487
- cif->flags, rvalue, fn, ssecount);
674
+ flags, rvalue, fn);
488
675
  }
489
676
 
677
+ #ifndef __ILP32__
678
+ extern void
679
+ ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
680
+ #endif
490
681
 
491
- extern void ffi_closure_unix64(void);
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);
733
+ }
734
+
735
+ #endif /* FFI_GO_CLOSURES */
736
+
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
492
752
 
493
753
  ffi_status
494
754
  ffi_prep_closure_loc (ffi_closure* closure,
@@ -497,28 +757,51 @@ ffi_prep_closure_loc (ffi_closure* closure,
497
757
  void *user_data,
498
758
  void *codeloc)
499
759
  {
500
- volatile unsigned short *tramp;
501
-
502
- /* Sanity check on the cif ABI. */
503
- {
504
- int abi = cif->abi;
505
- if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)))
506
- return FFI_BAD_ABI;
507
- }
508
-
509
- tramp = (volatile unsigned short *) &closure->tramp[0];
510
-
511
- tramp[0] = 0xbb49; /* mov <code>, %r11 */
512
- *(void * volatile *) &tramp[1] = ffi_closure_unix64;
513
- tramp[5] = 0xba49; /* mov <data>, %r10 */
514
- *(void * volatile *) &tramp[6] = codeloc;
515
-
516
- /* Set the carry bit iff the function uses any sse registers.
517
- This is clc or stc, together with the first byte of the jmp. */
518
- 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
519
797
 
520
- tramp[11] = 0xe3ff; /* jmp *%r11 */
798
+ /* Initialize the dynamic trampoline. */
799
+ memcpy (tramp, trampoline, sizeof(trampoline));
800
+ *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
521
801
 
802
+ #if defined(FFI_EXEC_STATIC_TRAMP)
803
+ out:
804
+ #endif
522
805
  closure->cif = cif;
523
806
  closure->fun = fun;
524
807
  closure->user_data = user_data;
@@ -526,53 +809,40 @@ ffi_prep_closure_loc (ffi_closure* closure,
526
809
  return FFI_OK;
527
810
  }
528
811
 
529
- int
530
- ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
531
- 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)
532
819
  {
533
- ffi_cif *cif;
534
820
  void **avalue;
535
821
  ffi_type **arg_types;
536
822
  long i, avn;
537
823
  int gprcount, ssecount, ngpr, nsse;
538
- int ret;
824
+ int flags;
539
825
 
540
- cif = closure->cif;
541
- avalue = alloca(cif->nargs * sizeof(void *));
826
+ avn = cif->nargs;
827
+ flags = cif->flags;
828
+ avalue = alloca(avn * sizeof(void *));
542
829
  gprcount = ssecount = 0;
543
830
 
544
- ret = cif->rtype->type;
545
- if (ret != FFI_TYPE_VOID)
831
+ if (flags & UNIX64_FLAG_RET_IN_MEM)
546
832
  {
547
- enum x86_64_reg_class classes[MAX_CLASSES];
548
- int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
549
- if (n == 0)
550
- {
551
- /* The return value goes in memory. Arrange for the closure
552
- return value to go directly back to the original caller. */
553
- rvalue = (void *) reg_args->gpr[gprcount++];
554
- /* We don't have to do anything in asm for the return. */
555
- ret = FFI_TYPE_VOID;
556
- }
557
- else if (ret == FFI_TYPE_STRUCT && n == 2)
558
- {
559
- /* Mark which register the second word of the structure goes in. */
560
- _Bool sse0 = SSE_CLASS_P (classes[0]);
561
- _Bool sse1 = SSE_CLASS_P (classes[1]);
562
- if (!sse0 && sse1)
563
- ret |= 1 << 8;
564
- else if (sse0 && !sse1)
565
- ret |= 1 << 9;
566
- }
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);
567
839
  }
568
840
 
569
- avn = cif->nargs;
570
841
  arg_types = cif->arg_types;
571
-
572
842
  for (i = 0; i < avn; ++i)
573
843
  {
574
844
  enum x86_64_reg_class classes[MAX_CLASSES];
575
- int n;
845
+ size_t n;
576
846
 
577
847
  n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
578
848
  if (n == 0
@@ -586,7 +856,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
586
856
  align = 8;
587
857
 
588
858
  /* Pass this argument in memory. */
589
- argp = (void *) ALIGN (argp, align);
859
+ argp = (void *) FFI_ALIGN (argp, align);
590
860
  avalue[i] = argp;
591
861
  argp += arg_types[i]->size;
592
862
  }
@@ -612,7 +882,7 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
612
882
  else
613
883
  {
614
884
  char *a = alloca (16);
615
- int j;
885
+ unsigned int j;
616
886
 
617
887
  avalue[i] = a;
618
888
  for (j = 0; j < n; j++, a += 8)
@@ -626,10 +896,55 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
626
896
  }
627
897
 
628
898
  /* Invoke the closure. */
629
- closure->fun (cif, rvalue, avalue, closure->user_data);
899
+ fun (cif, rvalue, avalue, user_data);
630
900
 
631
901
  /* Tell assembly how to perform return type promotions. */
632
- 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;
633
947
  }
948
+ #endif
634
949
 
635
950
  #endif /* __x86_64__ */