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,9 +1,10 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc.
2
+ ffi.c - Copyright (c) 2017, 2022 Anthony Green
3
+ Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc.
3
4
  Copyright (c) 2002 Ranjit Mathew
4
5
  Copyright (c) 2002 Bo Thorsen
5
6
  Copyright (c) 2002 Roger Sayle
6
- Copyright (C) 2008 Free Software Foundation, Inc.
7
+ Copyright (C) 2008, 2010 Free Software Foundation, Inc.
7
8
 
8
9
  x86 Foreign Function Interface
9
10
 
@@ -28,508 +29,534 @@
28
29
  DEALINGS IN THE SOFTWARE.
29
30
  ----------------------------------------------------------------------- */
30
31
 
31
- #if !defined(__x86_64__) || defined(_WIN64)
32
-
33
- #ifdef _WIN64
34
- #include <windows.h>
35
- #endif
36
-
32
+ #if defined(__i386__) || defined(_M_IX86)
37
33
  #include <ffi.h>
38
34
  #include <ffi_common.h>
39
-
35
+ #include <stdint.h>
40
36
  #include <stdlib.h>
37
+ #include <tramp.h>
38
+ #include "internal.h"
41
39
 
42
- /* ffi_prep_args is called by the assembly routine once stack space
43
- has been allocated for the function's arguments */
44
-
45
- void ffi_prep_args(char *stack, extended_cif *ecif)
46
- {
47
- register unsigned int i;
48
- register void **p_argv;
49
- register char *argp;
50
- register ffi_type **p_arg;
40
+ /* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
41
+ all further uses in this file will refer to the 80-bit type. */
42
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
43
+ # if FFI_TYPE_LONGDOUBLE != 4
44
+ # error FFI_TYPE_LONGDOUBLE out of date
45
+ # endif
46
+ #else
47
+ # undef FFI_TYPE_LONGDOUBLE
48
+ # define FFI_TYPE_LONGDOUBLE 4
49
+ #endif
51
50
 
52
- argp = stack;
51
+ #if defined(__GNUC__) && !defined(__declspec)
52
+ # define __declspec(x) __attribute__((x))
53
+ #endif
53
54
 
54
- if (ecif->cif->flags == FFI_TYPE_STRUCT
55
- #ifdef X86_WIN64
56
- && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2
57
- && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8)
55
+ #if defined(_MSC_VER) && defined(_M_IX86)
56
+ /* Stack is not 16-byte aligned on Windows. */
57
+ #define STACK_ALIGN(bytes) (bytes)
58
+ #else
59
+ #define STACK_ALIGN(bytes) FFI_ALIGN (bytes, 16)
58
60
  #endif
59
- )
60
- {
61
- *(void **) argp = ecif->rvalue;
62
- argp += sizeof(void*);
63
- }
64
61
 
65
- p_argv = ecif->avalue;
62
+ /* Perform machine dependent cif processing. */
63
+ ffi_status FFI_HIDDEN
64
+ ffi_prep_cif_machdep(ffi_cif *cif)
65
+ {
66
+ size_t bytes = 0;
67
+ int i, n, flags, cabi = cif->abi;
66
68
 
67
- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
68
- i != 0;
69
- i--, p_arg++)
69
+ switch (cabi)
70
70
  {
71
- size_t z;
72
-
73
- /* Align if necessary */
74
- if ((sizeof(void*) - 1) & (size_t) argp)
75
- argp = (char *) ALIGN(argp, sizeof(void*));
76
-
77
- z = (*p_arg)->size;
78
- #ifdef X86_WIN64
79
- if (z > sizeof(ffi_arg)
80
- || ((*p_arg)->type == FFI_TYPE_STRUCT
81
- && (z != 1 && z != 2 && z != 4 && z != 8))
82
- #if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
83
- || ((*p_arg)->type == FFI_TYPE_LONGDOUBLE)
84
- #endif
85
- )
86
- {
87
- z = sizeof(ffi_arg);
88
- *(void **)argp = *p_argv;
89
- }
90
- else if ((*p_arg)->type == FFI_TYPE_FLOAT)
91
- {
92
- memcpy(argp, *p_argv, z);
93
- }
94
- else
95
- #endif
96
- if (z < sizeof(ffi_arg))
97
- {
98
- z = sizeof(ffi_arg);
99
- switch ((*p_arg)->type)
100
- {
101
- case FFI_TYPE_SINT8:
102
- *(ffi_sarg *) argp = (ffi_sarg)*(SINT8 *)(* p_argv);
103
- break;
104
-
105
- case FFI_TYPE_UINT8:
106
- *(ffi_arg *) argp = (ffi_arg)*(UINT8 *)(* p_argv);
107
- break;
108
-
109
- case FFI_TYPE_SINT16:
110
- *(ffi_sarg *) argp = (ffi_sarg)*(SINT16 *)(* p_argv);
111
- break;
112
-
113
- case FFI_TYPE_UINT16:
114
- *(ffi_arg *) argp = (ffi_arg)*(UINT16 *)(* p_argv);
115
- break;
116
-
117
- case FFI_TYPE_SINT32:
118
- *(ffi_sarg *) argp = (ffi_sarg)*(SINT32 *)(* p_argv);
119
- break;
120
-
121
- case FFI_TYPE_UINT32:
122
- *(ffi_arg *) argp = (ffi_arg)*(UINT32 *)(* p_argv);
123
- break;
124
-
125
- case FFI_TYPE_STRUCT:
126
- *(ffi_arg *) argp = *(ffi_arg *)(* p_argv);
127
- break;
128
-
129
- default:
130
- FFI_ASSERT(0);
131
- }
132
- }
133
- else
134
- {
135
- memcpy(argp, *p_argv, z);
136
- }
137
- p_argv++;
138
- #ifdef X86_WIN64
139
- argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
140
- #else
141
- argp += z;
142
- #endif
71
+ case FFI_SYSV:
72
+ case FFI_STDCALL:
73
+ case FFI_THISCALL:
74
+ case FFI_FASTCALL:
75
+ case FFI_MS_CDECL:
76
+ case FFI_PASCAL:
77
+ case FFI_REGISTER:
78
+ break;
79
+ default:
80
+ return FFI_BAD_ABI;
143
81
  }
144
-
145
- return;
146
- }
147
82
 
148
- /* Perform machine dependent cif processing */
149
- ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
150
- {
151
- /* Set the return type flag */
152
83
  switch (cif->rtype->type)
153
84
  {
154
85
  case FFI_TYPE_VOID:
155
- #ifdef X86
156
- case FFI_TYPE_STRUCT:
157
- #endif
158
- #if defined(X86) || defined (X86_WIN32) || defined(X86_FREEBSD) || defined(X86_DARWIN) || defined(X86_WIN64)
86
+ flags = X86_RET_VOID;
87
+ break;
88
+ case FFI_TYPE_FLOAT:
89
+ flags = X86_RET_FLOAT;
90
+ break;
91
+ case FFI_TYPE_DOUBLE:
92
+ flags = X86_RET_DOUBLE;
93
+ break;
94
+ case FFI_TYPE_LONGDOUBLE:
95
+ flags = X86_RET_LDOUBLE;
96
+ break;
159
97
  case FFI_TYPE_UINT8:
98
+ flags = X86_RET_UINT8;
99
+ break;
160
100
  case FFI_TYPE_UINT16:
101
+ flags = X86_RET_UINT16;
102
+ break;
161
103
  case FFI_TYPE_SINT8:
104
+ flags = X86_RET_SINT8;
105
+ break;
162
106
  case FFI_TYPE_SINT16:
163
- #endif
164
- #ifdef X86_WIN64
165
- case FFI_TYPE_UINT32:
107
+ flags = X86_RET_SINT16;
108
+ break;
109
+ case FFI_TYPE_INT:
166
110
  case FFI_TYPE_SINT32:
167
- #endif
168
-
169
- case FFI_TYPE_SINT64:
170
- case FFI_TYPE_FLOAT:
171
- case FFI_TYPE_DOUBLE:
172
- #ifndef X86_WIN64
173
- #if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
174
- case FFI_TYPE_LONGDOUBLE:
175
- #endif
176
- #endif
177
- cif->flags = (unsigned) cif->rtype->type;
111
+ case FFI_TYPE_UINT32:
112
+ case FFI_TYPE_POINTER:
113
+ flags = X86_RET_INT32;
178
114
  break;
179
-
115
+ case FFI_TYPE_SINT64:
180
116
  case FFI_TYPE_UINT64:
181
- #ifdef X86_WIN64
182
- case FFI_TYPE_POINTER:
183
- #endif
184
- cif->flags = FFI_TYPE_SINT64;
117
+ flags = X86_RET_INT64;
185
118
  break;
186
-
187
- #ifndef X86
188
119
  case FFI_TYPE_STRUCT:
189
- if (cif->rtype->size == 1)
190
- {
191
- cif->flags = FFI_TYPE_SMALL_STRUCT_1B; /* same as char size */
192
- }
193
- else if (cif->rtype->size == 2)
194
- {
195
- cif->flags = FFI_TYPE_SMALL_STRUCT_2B; /* same as short size */
196
- }
197
- else if (cif->rtype->size == 4)
198
- {
199
- #ifdef X86_WIN64
200
- cif->flags = FFI_TYPE_SMALL_STRUCT_4B;
201
- #else
202
- cif->flags = FFI_TYPE_INT; /* same as int type */
203
- #endif
204
- }
205
- else if (cif->rtype->size == 8)
206
- {
207
- cif->flags = FFI_TYPE_SINT64; /* same as int64 type */
208
- }
209
- else
210
- {
211
- cif->flags = FFI_TYPE_STRUCT;
212
- #ifdef X86_WIN64
213
- // allocate space for return value pointer
214
- cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);
120
+ {
121
+ #ifdef X86_WIN32
122
+ size_t size = cif->rtype->size;
123
+ if (size == 1)
124
+ flags = X86_RET_STRUCT_1B;
125
+ else if (size == 2)
126
+ flags = X86_RET_STRUCT_2B;
127
+ else if (size == 4)
128
+ flags = X86_RET_INT32;
129
+ else if (size == 8)
130
+ flags = X86_RET_INT64;
131
+ else
215
132
  #endif
216
- }
133
+ {
134
+ do_struct:
135
+ switch (cabi)
136
+ {
137
+ case FFI_THISCALL:
138
+ case FFI_FASTCALL:
139
+ case FFI_STDCALL:
140
+ case FFI_MS_CDECL:
141
+ flags = X86_RET_STRUCTARG;
142
+ break;
143
+ default:
144
+ flags = X86_RET_STRUCTPOP;
145
+ break;
146
+ }
147
+ /* Allocate space for return value pointer. */
148
+ bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
149
+ }
150
+ }
217
151
  break;
218
- #endif
219
-
220
- default:
221
- #ifdef X86_WIN64
222
- cif->flags = FFI_TYPE_SINT64;
223
- break;
224
- case FFI_TYPE_INT:
225
- cif->flags = FFI_TYPE_SINT32;
226
- #else
227
- cif->flags = FFI_TYPE_INT;
228
- #endif
152
+ case FFI_TYPE_COMPLEX:
153
+ switch (cif->rtype->elements[0]->type)
154
+ {
155
+ case FFI_TYPE_DOUBLE:
156
+ case FFI_TYPE_LONGDOUBLE:
157
+ case FFI_TYPE_SINT64:
158
+ case FFI_TYPE_UINT64:
159
+ goto do_struct;
160
+ case FFI_TYPE_FLOAT:
161
+ case FFI_TYPE_INT:
162
+ case FFI_TYPE_SINT32:
163
+ case FFI_TYPE_UINT32:
164
+ flags = X86_RET_INT64;
165
+ break;
166
+ case FFI_TYPE_SINT16:
167
+ case FFI_TYPE_UINT16:
168
+ flags = X86_RET_INT32;
169
+ break;
170
+ case FFI_TYPE_SINT8:
171
+ case FFI_TYPE_UINT8:
172
+ flags = X86_RET_STRUCT_2B;
173
+ break;
174
+ default:
175
+ return FFI_BAD_TYPEDEF;
176
+ }
229
177
  break;
178
+ default:
179
+ return FFI_BAD_TYPEDEF;
230
180
  }
181
+ cif->flags = flags;
231
182
 
232
- #ifdef X86_DARWIN
233
- cif->bytes = (cif->bytes + 15) & ~0xF;
234
- #endif
235
-
236
- #ifdef X86_WIN64
237
- {
238
- unsigned int i;
239
- ffi_type **ptr;
183
+ for (i = 0, n = cif->nargs; i < n; i++)
184
+ {
185
+ ffi_type *t = cif->arg_types[i];
240
186
 
241
- for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
242
- {
243
- if (((*ptr)->alignment - 1) & cif->bytes)
244
- cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment);
245
- cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG);
246
- }
247
- }
248
- // ensure space for storing four registers
249
- cif->bytes += 4 * sizeof(ffi_arg);
187
+ #if defined(X86_WIN32)
188
+ if (cabi == FFI_STDCALL)
189
+ bytes = FFI_ALIGN (bytes, FFI_SIZEOF_ARG);
190
+ else
250
191
  #endif
192
+ bytes = FFI_ALIGN (bytes, t->alignment);
193
+ bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG);
194
+ }
195
+ cif->bytes = bytes;
251
196
 
252
197
  return FFI_OK;
253
198
  }
254
199
 
255
- extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
256
- unsigned, unsigned, unsigned *, void (*fn)(void));
257
-
258
- #ifdef X86_WIN32
259
- extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *,
260
- unsigned, unsigned, unsigned *, void (*fn)(void));
261
-
262
- #endif /* X86_WIN32 */
263
- #ifdef X86_WIN64
264
- extern int
265
- ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *,
266
- unsigned, unsigned, unsigned *, void (*fn)(void));
267
- #endif
268
-
269
- void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
200
+ static ffi_arg
201
+ extend_basic_type(void *arg, int type)
270
202
  {
271
- extended_cif ecif;
272
-
273
- ecif.cif = cif;
274
- ecif.avalue = avalue;
275
-
276
- /* If the return value is a struct and we don't have a return */
277
- /* value address then we need to make one */
278
-
279
- #ifdef X86_WIN64
280
- if (rvalue == NULL
281
- && cif->flags == FFI_TYPE_STRUCT
282
- && cif->rtype->size != 1 && cif->rtype->size != 2
283
- && cif->rtype->size != 4 && cif->rtype->size != 8)
284
- {
285
- ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF);
286
- }
287
- #else
288
- if (rvalue == NULL
289
- && cif->flags == FFI_TYPE_STRUCT)
290
- {
291
- ecif.rvalue = alloca(cif->rtype->size);
292
- }
293
- #endif
294
- else
295
- ecif.rvalue = rvalue;
296
-
297
-
298
- switch (cif->abi)
203
+ switch (type)
299
204
  {
300
- #ifdef X86_WIN64
301
- case FFI_WIN64:
302
- {
303
- // Make copies of all struct arguments
304
- // NOTE: not sure if responsibility should be here or in caller
305
- unsigned int i;
306
- for (i=0; i < cif->nargs;i++) {
307
- size_t size = cif->arg_types[i]->size;
308
- if ((cif->arg_types[i]->type == FFI_TYPE_STRUCT
309
- && (size != 1 && size != 2 && size != 4 && size != 8))
310
- #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
311
- || cif->arg_types[i]->type == FFI_TYPE_LONGDOUBLE
312
- #endif
313
- )
314
- {
315
- void *local = alloca(size);
316
- memcpy(local, avalue[i], size);
317
- avalue[i] = local;
318
- }
319
- }
320
- ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
321
- cif->flags, ecif.rvalue, fn);
322
- }
323
- break;
324
- #else
325
- case FFI_SYSV:
326
- ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
327
- fn);
328
- break;
329
- #ifdef X86_WIN32
330
- case FFI_STDCALL:
331
- ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags,
332
- ecif.rvalue, fn);
333
- break;
334
- #endif /* X86_WIN32 */
335
- #endif /* X86_WIN64 */
205
+ case FFI_TYPE_SINT8:
206
+ return *(SINT8 *)arg;
207
+ case FFI_TYPE_UINT8:
208
+ return *(UINT8 *)arg;
209
+ case FFI_TYPE_SINT16:
210
+ return *(SINT16 *)arg;
211
+ case FFI_TYPE_UINT16:
212
+ return *(UINT16 *)arg;
213
+
214
+ case FFI_TYPE_SINT32:
215
+ case FFI_TYPE_UINT32:
216
+ case FFI_TYPE_POINTER:
217
+ case FFI_TYPE_FLOAT:
218
+ return *(UINT32 *)arg;
219
+
336
220
  default:
337
- FFI_ASSERT(0);
338
- break;
221
+ abort();
339
222
  }
340
223
  }
341
224
 
225
+ struct call_frame
226
+ {
227
+ void *ebp; /* 0 */
228
+ void *retaddr; /* 4 */
229
+ void (*fn)(void); /* 8 */
230
+ int flags; /* 12 */
231
+ void *rvalue; /* 16 */
232
+ unsigned regs[3]; /* 20-28 */
233
+ };
234
+
235
+ struct abi_params
236
+ {
237
+ int dir; /* parameter growth direction */
238
+ int static_chain; /* the static chain register used by gcc */
239
+ int nregs; /* number of register parameters */
240
+ int regs[3];
241
+ };
242
+
243
+ static const struct abi_params abi_params[FFI_LAST_ABI] = {
244
+ [FFI_SYSV] = { 1, R_ECX, 0 },
245
+ [FFI_THISCALL] = { 1, R_EAX, 1, { R_ECX } },
246
+ [FFI_FASTCALL] = { 1, R_EAX, 2, { R_ECX, R_EDX } },
247
+ [FFI_STDCALL] = { 1, R_ECX, 0 },
248
+ [FFI_PASCAL] = { -1, R_ECX, 0 },
249
+ /* ??? No defined static chain; gcc does not support REGISTER. */
250
+ [FFI_REGISTER] = { -1, R_ECX, 3, { R_EAX, R_EDX, R_ECX } },
251
+ [FFI_MS_CDECL] = { 1, R_ECX, 0 }
252
+ };
253
+
254
+ #ifdef HAVE_FASTCALL
255
+ #ifdef _MSC_VER
256
+ #define FFI_DECLARE_FASTCALL __fastcall
257
+ #else
258
+ #define FFI_DECLARE_FASTCALL __declspec(fastcall)
259
+ #endif
260
+ #else
261
+ #define FFI_DECLARE_FASTCALL
262
+ #endif
342
263
 
343
- /** private members **/
264
+ extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN;
344
265
 
345
- static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
346
- void** args, ffi_cif* cif);
347
- void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *)
348
- __attribute__ ((regparm(1)));
349
- unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *)
350
- __attribute__ ((regparm(1)));
351
- void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
352
- __attribute__ ((regparm(1)));
353
- #ifdef X86_WIN32
354
- void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
355
- __attribute__ ((regparm(1)));
356
- #endif
357
- #ifdef X86_WIN64
358
- void FFI_HIDDEN ffi_closure_win64 (ffi_closure *);
266
+ /* We perform some black magic here to use some of the parent's stack frame in
267
+ * ffi_call_i386() that breaks with the MSVC compiler with the /RTCs or /GZ
268
+ * flags. Disable the 'Stack frame run time error checking' for this function
269
+ * so we don't hit weird exceptions in debug builds. */
270
+ #if defined(_MSC_VER)
271
+ #pragma runtime_checks("s", off)
359
272
  #endif
273
+ static void
274
+ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
275
+ void **avalue, void *closure)
276
+ {
277
+ size_t rsize, bytes;
278
+ struct call_frame *frame;
279
+ char *stack, *argp;
280
+ ffi_type **arg_types;
281
+ int flags, cabi, i, n, dir, narg_reg;
282
+ const struct abi_params *pabi;
283
+
284
+ flags = cif->flags;
285
+ cabi = cif->abi;
286
+ pabi = &abi_params[cabi];
287
+ dir = pabi->dir;
288
+
289
+ rsize = 0;
290
+ if (rvalue == NULL)
291
+ {
292
+ switch (flags)
293
+ {
294
+ case X86_RET_FLOAT:
295
+ case X86_RET_DOUBLE:
296
+ case X86_RET_LDOUBLE:
297
+ case X86_RET_STRUCTPOP:
298
+ case X86_RET_STRUCTARG:
299
+ /* The float cases need to pop the 387 stack.
300
+ The struct cases need to pass a valid pointer to the callee. */
301
+ rsize = cif->rtype->size;
302
+ break;
303
+ default:
304
+ /* We can pretend that the callee returns nothing. */
305
+ flags = X86_RET_VOID;
306
+ break;
307
+ }
308
+ }
360
309
 
361
- /* This function is jumped to by the trampoline */
362
-
363
- #ifdef X86_WIN64
364
- void * FFI_HIDDEN
365
- ffi_closure_win64_inner (ffi_closure *closure, void *args) {
366
- ffi_cif *cif;
367
- void **arg_area;
368
- void *result;
369
- void *resp = &result;
370
-
371
- cif = closure->cif;
372
- arg_area = (void**) alloca (cif->nargs * sizeof (void*));
373
-
374
- /* this call will initialize ARG_AREA, such that each
375
- * element in that array points to the corresponding
376
- * value on the stack; and if the function returns
377
- * a structure, it will change RESP to point to the
378
- * structure return address. */
379
-
380
- ffi_prep_incoming_args_SYSV(args, &resp, arg_area, cif);
381
-
382
- (closure->fun) (cif, resp, arg_area, closure->user_data);
383
-
384
- /* The result is returned in rax. This does the right thing for
385
- result types except for floats; we have to 'mov xmm0, rax' in the
386
- caller to correct this.
387
- TODO: structure sizes of 3 5 6 7 are returned by reference, too!!!
388
- */
389
- return cif->rtype->size > sizeof(void *) ? resp : *(void **)resp;
390
- }
310
+ bytes = STACK_ALIGN (cif->bytes);
311
+ stack = alloca(bytes + sizeof(*frame) + rsize);
312
+ argp = (dir < 0 ? stack + bytes : stack);
313
+ frame = (struct call_frame *)(stack + bytes);
314
+ if (rsize)
315
+ rvalue = frame + 1;
391
316
 
392
- #else
393
- unsigned int FFI_HIDDEN
394
- ffi_closure_SYSV_inner (closure, respp, args)
395
- ffi_closure *closure;
396
- void **respp;
397
- void *args;
398
- {
399
- /* our various things... */
400
- ffi_cif *cif;
401
- void **arg_area;
317
+ frame->fn = fn;
318
+ frame->flags = flags;
319
+ frame->rvalue = rvalue;
320
+ frame->regs[pabi->static_chain] = (unsigned)closure;
402
321
 
403
- cif = closure->cif;
404
- arg_area = (void**) alloca (cif->nargs * sizeof (void*));
322
+ narg_reg = 0;
323
+ switch (flags)
324
+ {
325
+ case X86_RET_STRUCTARG:
326
+ /* The pointer is passed as the first argument. */
327
+ if (pabi->nregs > 0)
328
+ {
329
+ frame->regs[pabi->regs[0]] = (unsigned)rvalue;
330
+ narg_reg = 1;
331
+ break;
332
+ }
333
+ /* fallthru */
334
+ case X86_RET_STRUCTPOP:
335
+ *(void **)argp = rvalue;
336
+ argp += sizeof(void *);
337
+ break;
338
+ }
405
339
 
406
- /* this call will initialize ARG_AREA, such that each
407
- * element in that array points to the corresponding
408
- * value on the stack; and if the function returns
409
- * a structure, it will change RESP to point to the
410
- * structure return address. */
340
+ arg_types = cif->arg_types;
341
+ for (i = 0, n = cif->nargs; i < n; i++)
342
+ {
343
+ ffi_type *ty = arg_types[i];
344
+ void *valp = avalue[i];
345
+ size_t z = ty->size;
346
+ int t = ty->type;
411
347
 
412
- ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
348
+ if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT)
349
+ {
350
+ ffi_arg val = extend_basic_type (valp, t);
351
+
352
+ if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs)
353
+ frame->regs[pabi->regs[narg_reg++]] = val;
354
+ else if (dir < 0)
355
+ {
356
+ argp -= 4;
357
+ *(ffi_arg *)argp = val;
358
+ }
359
+ else
360
+ {
361
+ *(ffi_arg *)argp = val;
362
+ argp += 4;
363
+ }
364
+ }
365
+ else
366
+ {
367
+ size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG);
368
+ size_t align = FFI_SIZEOF_ARG;
369
+
370
+ /* Issue 434: For thiscall and fastcall, if the paramter passed
371
+ as 64-bit integer or struct, all following integer parameters
372
+ will be passed on stack. */
373
+ if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL)
374
+ && (t == FFI_TYPE_SINT64
375
+ || t == FFI_TYPE_UINT64
376
+ || t == FFI_TYPE_STRUCT))
377
+ narg_reg = 2;
378
+
379
+ /* Alignment rules for arguments are quite complex. Vectors and
380
+ structures with 16 byte alignment get it. Note that long double
381
+ on Darwin does have 16 byte alignment, and does not get this
382
+ alignment if passed directly; a structure with a long double
383
+ inside, however, would get 16 byte alignment. Since libffi does
384
+ not support vectors, we need non concern ourselves with other
385
+ cases. */
386
+ if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
387
+ align = 16;
388
+
389
+ if (dir < 0)
390
+ {
391
+ /* ??? These reverse argument ABIs are probably too old
392
+ to have cared about alignment. Someone should check. */
393
+ argp -= za;
394
+ memcpy (argp, valp, z);
395
+ }
396
+ else
397
+ {
398
+ argp = (char *)FFI_ALIGN (argp, align);
399
+ memcpy (argp, valp, z);
400
+ argp += za;
401
+ }
402
+ }
403
+ }
404
+ FFI_ASSERT (dir > 0 || argp == stack);
413
405
 
414
- (closure->fun) (cif, *respp, arg_area, closure->user_data);
406
+ ffi_call_i386 (frame, stack);
407
+ }
408
+ #if defined(_MSC_VER)
409
+ #pragma runtime_checks("s", restore)
410
+ #endif
415
411
 
416
- return cif->flags;
412
+ void
413
+ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
414
+ {
415
+ ffi_call_int (cif, fn, rvalue, avalue, NULL);
417
416
  }
418
- #endif /* !X86_WIN64 */
419
417
 
420
- static void
421
- ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue,
422
- ffi_cif *cif)
418
+ #ifdef FFI_GO_CLOSURES
419
+ void
420
+ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
421
+ void **avalue, void *closure)
423
422
  {
424
- register unsigned int i;
425
- register void **p_argv;
426
- register char *argp;
427
- register ffi_type **p_arg;
428
-
429
- argp = stack;
430
-
431
- #ifdef X86_WIN64
432
- if (cif->rtype->size > sizeof(ffi_arg)
433
- || (cif->flags == FFI_TYPE_STRUCT
434
- && (cif->rtype->size != 1 && cif->rtype->size != 2
435
- && cif->rtype->size != 4 && cif->rtype->size != 8))) {
436
- *rvalue = *(void **) argp;
437
- argp += sizeof(void *);
438
- }
439
- #else
440
- if ( cif->flags == FFI_TYPE_STRUCT ) {
441
- *rvalue = *(void **) argp;
442
- argp += sizeof(void *);
443
- }
423
+ ffi_call_int (cif, fn, rvalue, avalue, closure);
424
+ }
444
425
  #endif
445
426
 
446
- p_argv = avalue;
427
+ /** private members **/
428
+
429
+ void FFI_HIDDEN ffi_closure_i386(void);
430
+ void FFI_HIDDEN ffi_closure_STDCALL(void);
431
+ void FFI_HIDDEN ffi_closure_REGISTER(void);
432
+ #if defined(FFI_EXEC_STATIC_TRAMP)
433
+ void FFI_HIDDEN ffi_closure_i386_alt(void);
434
+ void FFI_HIDDEN ffi_closure_STDCALL_alt(void);
435
+ void FFI_HIDDEN ffi_closure_REGISTER_alt(void);
436
+ #endif
447
437
 
448
- for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
438
+ struct closure_frame
439
+ {
440
+ unsigned rettemp[4]; /* 0 */
441
+ unsigned regs[3]; /* 16-24 */
442
+ ffi_cif *cif; /* 28 */
443
+ void (*fun)(ffi_cif*,void*,void**,void*); /* 32 */
444
+ void *user_data; /* 36 */
445
+ };
446
+
447
+ int FFI_HIDDEN FFI_DECLARE_FASTCALL
448
+ ffi_closure_inner (struct closure_frame *frame, char *stack)
449
+ {
450
+ ffi_cif *cif = frame->cif;
451
+ int cabi, i, n, flags, dir, narg_reg;
452
+ const struct abi_params *pabi;
453
+ ffi_type **arg_types;
454
+ char *argp;
455
+ void *rvalue;
456
+ void **avalue;
457
+
458
+ cabi = cif->abi;
459
+ flags = cif->flags;
460
+ narg_reg = 0;
461
+ rvalue = frame->rettemp;
462
+ pabi = &abi_params[cabi];
463
+ dir = pabi->dir;
464
+ argp = (dir < 0 ? stack + STACK_ALIGN (cif->bytes) : stack);
465
+
466
+ switch (flags)
449
467
  {
450
- size_t z;
468
+ case X86_RET_STRUCTARG:
469
+ if (pabi->nregs > 0)
470
+ {
471
+ rvalue = (void *)frame->regs[pabi->regs[0]];
472
+ narg_reg = 1;
473
+ frame->rettemp[0] = (unsigned)rvalue;
474
+ break;
475
+ }
476
+ /* fallthru */
477
+ case X86_RET_STRUCTPOP:
478
+ rvalue = *(void **)argp;
479
+ argp += sizeof(void *);
480
+ frame->rettemp[0] = (unsigned)rvalue;
481
+ break;
482
+ }
451
483
 
452
- /* Align if necessary */
453
- if ((sizeof(void*) - 1) & (size_t) argp) {
454
- argp = (char *) ALIGN(argp, sizeof(void*));
455
- }
484
+ n = cif->nargs;
485
+ avalue = alloca(sizeof(void *) * n);
456
486
 
457
- #ifdef X86_WIN64
458
- if ((*p_arg)->size > sizeof(ffi_arg)
459
- || ((*p_arg)->type == FFI_TYPE_STRUCT
460
- && ((*p_arg)->size != 1 && (*p_arg)->size != 2
461
- && (*p_arg)->size != 4 && (*p_arg)->size != 8)))
462
- {
463
- z = sizeof(void *);
464
- *p_argv = *(void **)argp;
465
- }
487
+ arg_types = cif->arg_types;
488
+ for (i = 0; i < n; ++i)
489
+ {
490
+ ffi_type *ty = arg_types[i];
491
+ size_t z = ty->size;
492
+ int t = ty->type;
493
+ void *valp;
494
+
495
+ if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT)
496
+ {
497
+ if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs)
498
+ valp = &frame->regs[pabi->regs[narg_reg++]];
499
+ else if (dir < 0)
500
+ {
501
+ argp -= 4;
502
+ valp = argp;
503
+ }
504
+ else
505
+ {
506
+ valp = argp;
507
+ argp += 4;
508
+ }
509
+ }
466
510
  else
467
- #endif
468
- {
469
- z = (*p_arg)->size;
470
-
471
- /* because we're little endian, this is what it turns into. */
472
-
473
- *p_argv = (void*) argp;
474
- }
475
-
476
- p_argv++;
477
- #ifdef X86_WIN64
478
- argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
479
- #else
480
- argp += z;
481
- #endif
511
+ {
512
+ size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG);
513
+ size_t align = FFI_SIZEOF_ARG;
514
+
515
+ /* See the comment in ffi_call_int. */
516
+ if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
517
+ align = 16;
518
+
519
+ /* Issue 434: For thiscall and fastcall, if the paramter passed
520
+ as 64-bit integer or struct, all following integer parameters
521
+ will be passed on stack. */
522
+ if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL)
523
+ && (t == FFI_TYPE_SINT64
524
+ || t == FFI_TYPE_UINT64
525
+ || t == FFI_TYPE_STRUCT))
526
+ narg_reg = 2;
527
+
528
+ if (dir < 0)
529
+ {
530
+ /* ??? These reverse argument ABIs are probably too old
531
+ to have cared about alignment. Someone should check. */
532
+ argp -= za;
533
+ valp = argp;
534
+ }
535
+ else
536
+ {
537
+ argp = (char *)FFI_ALIGN (argp, align);
538
+ valp = argp;
539
+ argp += za;
540
+ }
541
+ }
542
+
543
+ avalue[i] = valp;
482
544
  }
483
-
484
- return;
485
- }
486
545
 
487
- #define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \
488
- { unsigned char *__tramp = (unsigned char*)(TRAMP); \
489
- void* __fun = (void*)(FUN); \
490
- void* __ctx = (void*)(CTX); \
491
- *(unsigned char*) &__tramp[0] = 0x41; \
492
- *(unsigned char*) &__tramp[1] = 0xbb; \
493
- *(unsigned int*) &__tramp[2] = MASK; /* mov $mask, %r11 */ \
494
- *(unsigned char*) &__tramp[6] = 0x48; \
495
- *(unsigned char*) &__tramp[7] = 0xb8; \
496
- *(void**) &__tramp[8] = __ctx; /* mov __ctx, %rax */ \
497
- *(unsigned char *) &__tramp[16] = 0x49; \
498
- *(unsigned char *) &__tramp[17] = 0xba; \
499
- *(void**) &__tramp[18] = __fun; /* mov __fun, %r10 */ \
500
- *(unsigned char *) &__tramp[26] = 0x41; \
501
- *(unsigned char *) &__tramp[27] = 0xff; \
502
- *(unsigned char *) &__tramp[28] = 0xe2; /* jmp %r10 */ \
503
- }
504
-
505
- /* How to make a trampoline. Derived from gcc/config/i386/i386.c. */
506
-
507
- #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
508
- ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
509
- unsigned int __fun = (unsigned int)(FUN); \
510
- unsigned int __ctx = (unsigned int)(CTX); \
511
- unsigned int __dis = __fun - (__ctx + 10); \
512
- *(unsigned char*) &__tramp[0] = 0xb8; \
513
- *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
514
- *(unsigned char *) &__tramp[5] = 0xe9; \
515
- *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \
516
- })
517
-
518
- #define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \
519
- ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
520
- unsigned int __fun = (unsigned int)(FUN); \
521
- unsigned int __ctx = (unsigned int)(CTX); \
522
- unsigned int __dis = __fun - (__ctx + 10); \
523
- unsigned short __size = (unsigned short)(SIZE); \
524
- *(unsigned char*) &__tramp[0] = 0xb8; \
525
- *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
526
- *(unsigned char *) &__tramp[5] = 0xe8; \
527
- *(unsigned int*) &__tramp[6] = __dis; /* call __fun */ \
528
- *(unsigned char *) &__tramp[10] = 0xc2; \
529
- *(unsigned short*) &__tramp[11] = __size; /* ret __size */ \
530
- })
531
-
532
- /* the cif must already be prep'ed */
546
+ frame->fun (cif, rvalue, avalue, frame->user_data);
547
+
548
+ switch (cabi)
549
+ {
550
+ case FFI_STDCALL:
551
+ return flags | (cif->bytes << X86_RET_POP_SHIFT);
552
+ case FFI_THISCALL:
553
+ case FFI_FASTCALL:
554
+ return flags | ((cif->bytes - (narg_reg * FFI_SIZEOF_ARG))
555
+ << X86_RET_POP_SHIFT);
556
+ default:
557
+ return flags;
558
+ }
559
+ }
533
560
 
534
561
  ffi_status
535
562
  ffi_prep_closure_loc (ffi_closure* closure,
@@ -538,145 +565,268 @@ ffi_prep_closure_loc (ffi_closure* closure,
538
565
  void *user_data,
539
566
  void *codeloc)
540
567
  {
541
- #ifdef X86_WIN64
542
- #define ISFLOAT(IDX) (cif->arg_types[IDX]->type == FFI_TYPE_FLOAT || cif->arg_types[IDX]->type == FFI_TYPE_DOUBLE)
543
- #define FLAG(IDX) (cif->nargs>(IDX)&&ISFLOAT(IDX)?(1<<(IDX)):0)
544
- if (cif->abi == FFI_WIN64)
545
- {
546
- int mask = FLAG(0)|FLAG(1)|FLAG(2)|FLAG(3);
547
- FFI_INIT_TRAMPOLINE_WIN64 (&closure->tramp[0],
548
- &ffi_closure_win64,
549
- codeloc, mask);
550
- /* make sure we can execute here */
551
- }
552
- #else
553
- if (cif->abi == FFI_SYSV)
568
+ char *tramp = closure->tramp;
569
+ void (*dest)(void);
570
+ int op = 0xb8; /* movl imm, %eax */
571
+
572
+ switch (cif->abi)
554
573
  {
555
- FFI_INIT_TRAMPOLINE (&closure->tramp[0],
556
- &ffi_closure_SYSV,
557
- (void*)codeloc);
574
+ case FFI_SYSV:
575
+ case FFI_MS_CDECL:
576
+ dest = ffi_closure_i386;
577
+ break;
578
+ case FFI_STDCALL:
579
+ case FFI_THISCALL:
580
+ case FFI_FASTCALL:
581
+ case FFI_PASCAL:
582
+ dest = ffi_closure_STDCALL;
583
+ break;
584
+ case FFI_REGISTER:
585
+ dest = ffi_closure_REGISTER;
586
+ op = 0x68; /* pushl imm */
587
+ break;
588
+ default:
589
+ return FFI_BAD_ABI;
558
590
  }
559
- #ifdef X86_WIN32
560
- else if (cif->abi == FFI_STDCALL)
591
+
592
+ #if defined(FFI_EXEC_STATIC_TRAMP)
593
+ if (ffi_tramp_is_present(closure))
561
594
  {
562
- FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0],
563
- &ffi_closure_STDCALL,
564
- (void*)codeloc, cif->bytes);
595
+ /* Initialize the static trampoline's parameters. */
596
+ if (dest == ffi_closure_i386)
597
+ dest = ffi_closure_i386_alt;
598
+ else if (dest == ffi_closure_STDCALL)
599
+ dest = ffi_closure_STDCALL_alt;
600
+ else
601
+ dest = ffi_closure_REGISTER_alt;
602
+ ffi_tramp_set_parms (closure->ftramp, dest, closure);
603
+ goto out;
565
604
  }
566
- #endif /* X86_WIN32 */
567
- #endif /* !X86_WIN64 */
568
- else
605
+ #endif
606
+
607
+ /* Initialize the dynamic trampoline. */
608
+ /* endbr32. */
609
+ *(UINT32 *) tramp = 0xfb1e0ff3;
610
+
611
+ /* movl or pushl immediate. */
612
+ tramp[4] = op;
613
+ *(void **)(tramp + 5) = codeloc;
614
+
615
+ /* jmp dest */
616
+ tramp[9] = 0xe9;
617
+ *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14);
618
+
619
+ #if defined(FFI_EXEC_STATIC_TRAMP)
620
+ out:
621
+ #endif
622
+ closure->cif = cif;
623
+ closure->fun = fun;
624
+ closure->user_data = user_data;
625
+
626
+ return FFI_OK;
627
+ }
628
+
629
+ #ifdef FFI_GO_CLOSURES
630
+
631
+ void FFI_HIDDEN ffi_go_closure_EAX(void);
632
+ void FFI_HIDDEN ffi_go_closure_ECX(void);
633
+ void FFI_HIDDEN ffi_go_closure_STDCALL(void);
634
+
635
+ ffi_status
636
+ ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
637
+ void (*fun)(ffi_cif*,void*,void**,void*))
638
+ {
639
+ void (*dest)(void);
640
+
641
+ switch (cif->abi)
569
642
  {
643
+ case FFI_SYSV:
644
+ case FFI_MS_CDECL:
645
+ dest = ffi_go_closure_ECX;
646
+ break;
647
+ case FFI_THISCALL:
648
+ case FFI_FASTCALL:
649
+ dest = ffi_go_closure_EAX;
650
+ break;
651
+ case FFI_STDCALL:
652
+ case FFI_PASCAL:
653
+ dest = ffi_go_closure_STDCALL;
654
+ break;
655
+ case FFI_REGISTER:
656
+ default:
570
657
  return FFI_BAD_ABI;
571
658
  }
572
-
573
- closure->cif = cif;
574
- closure->user_data = user_data;
575
- closure->fun = fun;
659
+
660
+ closure->tramp = dest;
661
+ closure->cif = cif;
662
+ closure->fun = fun;
576
663
 
577
664
  return FFI_OK;
578
665
  }
579
666
 
667
+ #endif /* FFI_GO_CLOSURES */
668
+
580
669
  /* ------- Native raw API support -------------------------------- */
581
670
 
582
671
  #if !FFI_NO_RAW_API
583
672
 
673
+ void FFI_HIDDEN ffi_closure_raw_SYSV(void);
674
+ void FFI_HIDDEN ffi_closure_raw_THISCALL(void);
675
+
584
676
  ffi_status
585
- ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
586
- ffi_cif* cif,
677
+ ffi_prep_raw_closure_loc (ffi_raw_closure *closure,
678
+ ffi_cif *cif,
587
679
  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
588
680
  void *user_data,
589
681
  void *codeloc)
590
682
  {
683
+ char *tramp = closure->tramp;
684
+ void (*dest)(void);
591
685
  int i;
592
686
 
593
- if (cif->abi != FFI_SYSV) {
594
- return FFI_BAD_ABI;
595
- }
596
-
597
- // we currently don't support certain kinds of arguments for raw
598
- // closures. This should be implemented by a separate assembly language
599
- // routine, since it would require argument processing, something we
600
- // don't do now for performance.
601
-
687
+ /* We currently don't support certain kinds of arguments for raw
688
+ closures. This should be implemented by a separate assembly
689
+ language routine, since it would require argument processing,
690
+ something we don't do now for performance. */
602
691
  for (i = cif->nargs-1; i >= 0; i--)
692
+ switch (cif->arg_types[i]->type)
693
+ {
694
+ case FFI_TYPE_STRUCT:
695
+ case FFI_TYPE_LONGDOUBLE:
696
+ return FFI_BAD_TYPEDEF;
697
+ }
698
+
699
+ switch (cif->abi)
603
700
  {
604
- FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT);
605
- FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE);
701
+ case FFI_THISCALL:
702
+ dest = ffi_closure_raw_THISCALL;
703
+ break;
704
+ case FFI_SYSV:
705
+ dest = ffi_closure_raw_SYSV;
706
+ break;
707
+ default:
708
+ return FFI_BAD_ABI;
606
709
  }
607
-
608
710
 
609
- FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV,
610
- codeloc);
611
-
612
- closure->cif = cif;
711
+ /* movl imm, %eax. */
712
+ tramp[0] = 0xb8;
713
+ *(void **)(tramp + 1) = codeloc;
714
+
715
+ /* jmp dest */
716
+ tramp[5] = 0xe9;
717
+ *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10);
718
+
719
+ closure->cif = cif;
720
+ closure->fun = fun;
613
721
  closure->user_data = user_data;
614
- closure->fun = fun;
615
722
 
616
723
  return FFI_OK;
617
724
  }
618
725
 
619
- static void
620
- ffi_prep_args_raw(char *stack, extended_cif *ecif)
621
- {
622
- memcpy (stack, ecif->avalue, ecif->cif->bytes);
623
- }
624
-
625
- /* we borrow this routine from libffi (it must be changed, though, to
626
- * actually call the function passed in the first argument. as of
627
- * libffi-1.20, this is not the case.)
628
- */
629
-
630
- extern void
631
- ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned,
632
- unsigned, unsigned *, void (*fn)(void));
633
-
634
- #ifdef X86_WIN32
635
- extern void
636
- ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned,
637
- unsigned, unsigned *, void (*fn)(void));
638
- #endif /* X86_WIN32 */
639
-
640
726
  void
641
- ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
727
+ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue)
642
728
  {
643
- extended_cif ecif;
644
- void **avalue = (void **)fake_avalue;
729
+ size_t rsize, bytes;
730
+ struct call_frame *frame;
731
+ char *stack, *argp;
732
+ ffi_type **arg_types;
733
+ int flags, cabi, i, n, narg_reg;
734
+ const struct abi_params *pabi;
735
+
736
+ flags = cif->flags;
737
+ cabi = cif->abi;
738
+ pabi = &abi_params[cabi];
739
+
740
+ rsize = 0;
741
+ if (rvalue == NULL)
742
+ {
743
+ switch (flags)
744
+ {
745
+ case X86_RET_FLOAT:
746
+ case X86_RET_DOUBLE:
747
+ case X86_RET_LDOUBLE:
748
+ case X86_RET_STRUCTPOP:
749
+ case X86_RET_STRUCTARG:
750
+ /* The float cases need to pop the 387 stack.
751
+ The struct cases need to pass a valid pointer to the callee. */
752
+ rsize = cif->rtype->size;
753
+ break;
754
+ default:
755
+ /* We can pretend that the callee returns nothing. */
756
+ flags = X86_RET_VOID;
757
+ break;
758
+ }
759
+ }
760
+
761
+ bytes = STACK_ALIGN (cif->bytes);
762
+ argp = stack =
763
+ (void *)((uintptr_t)alloca(bytes + sizeof(*frame) + rsize + 15) & ~16);
764
+ frame = (struct call_frame *)(stack + bytes);
765
+ if (rsize)
766
+ rvalue = frame + 1;
645
767
 
646
- ecif.cif = cif;
647
- ecif.avalue = avalue;
648
-
649
- /* If the return value is a struct and we don't have a return */
650
- /* value address then we need to make one */
768
+ frame->fn = fn;
769
+ frame->flags = flags;
770
+ frame->rvalue = rvalue;
651
771
 
652
- if ((rvalue == NULL) &&
653
- (cif->rtype->type == FFI_TYPE_STRUCT))
772
+ narg_reg = 0;
773
+ switch (flags)
654
774
  {
655
- ecif.rvalue = alloca(cif->rtype->size);
775
+ case X86_RET_STRUCTARG:
776
+ /* The pointer is passed as the first argument. */
777
+ if (pabi->nregs > 0)
778
+ {
779
+ frame->regs[pabi->regs[0]] = (unsigned)rvalue;
780
+ narg_reg = 1;
781
+ break;
782
+ }
783
+ /* fallthru */
784
+ case X86_RET_STRUCTPOP:
785
+ *(void **)argp = rvalue;
786
+ argp += sizeof(void *);
787
+ bytes -= sizeof(void *);
788
+ break;
656
789
  }
657
- else
658
- ecif.rvalue = rvalue;
659
-
660
-
661
- switch (cif->abi)
790
+
791
+ arg_types = cif->arg_types;
792
+ for (i = 0, n = cif->nargs; narg_reg < pabi->nregs && i < n; i++)
662
793
  {
663
- case FFI_SYSV:
664
- ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
665
- ecif.rvalue, fn);
666
- break;
667
- #ifdef X86_WIN32
668
- case FFI_STDCALL:
669
- ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
670
- ecif.rvalue, fn);
671
- break;
672
- #endif /* X86_WIN32 */
673
- default:
674
- FFI_ASSERT(0);
675
- break;
794
+ ffi_type *ty = arg_types[i];
795
+ size_t z = ty->size;
796
+ int t = ty->type;
797
+
798
+ if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT && t != FFI_TYPE_FLOAT)
799
+ {
800
+ ffi_arg val = extend_basic_type (avalue, t);
801
+ frame->regs[pabi->regs[narg_reg++]] = val;
802
+ z = FFI_SIZEOF_ARG;
803
+ }
804
+ else
805
+ {
806
+ memcpy (argp, avalue, z);
807
+ z = FFI_ALIGN (z, FFI_SIZEOF_ARG);
808
+ argp += z;
809
+ }
810
+ avalue += z;
811
+ bytes -= z;
676
812
  }
813
+ if (i < n)
814
+ memcpy (argp, avalue, bytes);
815
+
816
+ ffi_call_i386 (frame, stack);
677
817
  }
818
+ #endif /* !FFI_NO_RAW_API */
678
819
 
679
- #endif
820
+ #if defined(FFI_EXEC_STATIC_TRAMP)
821
+ void *
822
+ ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
823
+ {
824
+ extern void *trampoline_code_table;
680
825
 
681
- #endif /* !__x86_64__ || X86_WIN64 */
826
+ *map_size = X86_TRAMP_MAP_SIZE;
827
+ *tramp_size = X86_TRAMP_SIZE;
828
+ return &trampoline_code_table;
829
+ }
830
+ #endif
682
831
 
832
+ #endif /* __i386__ */