ffi 1.15.5 → 1.17.0

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 (343) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +118 -0
  4. data/Gemfile +10 -3
  5. data/README.md +4 -3
  6. data/Rakefile +25 -10
  7. data/ext/ffi_c/AbstractMemory.c +99 -74
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +51 -15
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +90 -33
  12. data/ext/ffi_c/Call.c +29 -12
  13. data/ext/ffi_c/Call.h +3 -2
  14. data/ext/ffi_c/DynamicLibrary.c +90 -27
  15. data/ext/ffi_c/Function.c +244 -98
  16. data/ext/ffi_c/Function.h +1 -0
  17. data/ext/ffi_c/FunctionInfo.c +81 -25
  18. data/ext/ffi_c/LastError.c +29 -11
  19. data/ext/ffi_c/MappedType.c +66 -23
  20. data/ext/ffi_c/MappedType.h +0 -2
  21. data/ext/ffi_c/MemoryPointer.c +36 -9
  22. data/ext/ffi_c/MethodHandle.c +3 -1
  23. data/ext/ffi_c/Pointer.c +82 -40
  24. data/ext/ffi_c/Pointer.h +1 -0
  25. data/ext/ffi_c/Struct.c +166 -84
  26. data/ext/ffi_c/Struct.h +7 -4
  27. data/ext/ffi_c/StructByValue.c +48 -16
  28. data/ext/ffi_c/StructLayout.c +130 -61
  29. data/ext/ffi_c/Type.c +120 -51
  30. data/ext/ffi_c/Type.h +3 -1
  31. data/ext/ffi_c/Types.c +8 -2
  32. data/ext/ffi_c/Types.h +0 -1
  33. data/ext/ffi_c/Variadic.c +71 -26
  34. data/ext/ffi_c/compat.h +22 -22
  35. data/ext/ffi_c/extconf.rb +19 -2
  36. data/ext/ffi_c/ffi.c +4 -0
  37. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  38. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  39. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  40. data/ext/ffi_c/libffi/.appveyor.yml +27 -9
  41. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  42. data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
  43. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  44. data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
  45. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  46. data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
  47. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  48. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  49. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  50. data/ext/ffi_c/libffi/.gitignore +10 -2
  51. data/ext/ffi_c/libffi/LICENSE +1 -1
  52. data/ext/ffi_c/libffi/Makefile.am +12 -5
  53. data/ext/ffi_c/libffi/Makefile.in +118 -51
  54. data/ext/ffi_c/libffi/README.md +150 -105
  55. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  56. data/ext/ffi_c/libffi/compile +348 -0
  57. data/ext/ffi_c/libffi/config.guess +623 -556
  58. data/ext/ffi_c/libffi/config.sub +75 -34
  59. data/ext/ffi_c/libffi/configure +4571 -3830
  60. data/ext/ffi_c/libffi/configure.ac +64 -28
  61. data/ext/ffi_c/libffi/configure.host +26 -7
  62. data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
  63. data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
  64. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  65. data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
  66. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
  67. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  68. data/ext/ffi_c/libffi/include/Makefile.in +10 -9
  69. data/ext/ffi_c/libffi/include/ffi.h.in +55 -60
  70. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  71. data/ext/ffi_c/libffi/include/ffi_common.h +33 -2
  72. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  73. data/ext/ffi_c/libffi/install-sh +92 -69
  74. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  75. data/ext/ffi_c/libffi/libtool-version +2 -2
  76. data/ext/ffi_c/libffi/ltmain.sh +518 -333
  77. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  78. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  79. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
  80. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  81. data/ext/ffi_c/libffi/man/Makefile.in +9 -6
  82. data/ext/ffi_c/libffi/missing +1 -1
  83. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +2 -2
  84. data/ext/ffi_c/libffi/msvcc.sh +1 -1
  85. data/ext/ffi_c/libffi/src/aarch64/ffi.c +172 -55
  86. data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
  87. data/ext/ffi_c/libffi/src/aarch64/sysv.S +331 -87
  88. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  89. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  90. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  91. data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
  92. data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
  93. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  94. data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
  95. data/ext/ffi_c/libffi/src/closures.c +136 -50
  96. data/ext/ffi_c/libffi/src/debug.c +2 -2
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
  98. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  99. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  100. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  101. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  102. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  103. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  104. data/ext/ffi_c/libffi/src/mips/ffi.c +250 -67
  105. data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
  106. data/ext/ffi_c/libffi/src/mips/n32.S +193 -33
  107. data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
  108. data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
  109. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  110. data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
  111. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  112. data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
  113. data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
  114. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  115. data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
  116. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  117. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
  118. data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
  119. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
  120. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  121. data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
  122. data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
  123. data/ext/ffi_c/libffi/src/sparc/ffi64.c +23 -1
  124. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  125. data/ext/ffi_c/libffi/src/types.c +4 -6
  126. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  127. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  128. data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
  129. data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
  130. data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
  131. data/ext/ffi_c/libffi/src/x86/ffiw64.c +44 -1
  132. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  133. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  134. data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
  135. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
  136. data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
  137. data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
  138. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  139. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  140. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  141. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -114
  142. data/ext/ffi_c/libffi/testsuite/Makefile.in +89 -121
  143. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  144. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  145. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  146. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  147. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  148. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  149. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
  150. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  151. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
  152. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
  185. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
  188. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
  192. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
  199. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
  200. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
  201. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
  209. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
  210. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
  212. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
  213. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
  214. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
  217. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
  218. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
  219. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
  220. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
  221. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
  222. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
  223. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
  224. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
  226. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
  227. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
  228. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
  229. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
  231. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
  232. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
  234. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
  235. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
  237. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
  238. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
  239. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
  240. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
  241. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
  254. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
  255. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
  256. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
  257. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
  259. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
  262. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
  263. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
  274. data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
  275. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
  276. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
  277. data/ext/ffi_c/libffi.bsd.mk +2 -2
  278. data/ext/ffi_c/libffi.darwin.mk +2 -2
  279. data/ext/ffi_c/libffi.gnu.mk +2 -2
  280. data/ext/ffi_c/rbffi.h +1 -1
  281. data/ffi.gemspec +3 -3
  282. data/lib/ffi/autopointer.rb +8 -31
  283. data/lib/ffi/compat.rb +43 -0
  284. data/lib/ffi/data_converter.rb +2 -2
  285. data/lib/ffi/dynamic_library.rb +118 -0
  286. data/lib/ffi/enum.rb +18 -12
  287. data/lib/ffi/ffi.rb +3 -0
  288. data/lib/ffi/function.rb +71 -0
  289. data/lib/ffi/io.rb +2 -2
  290. data/lib/ffi/library.rb +72 -88
  291. data/lib/ffi/library_path.rb +109 -0
  292. data/lib/ffi/managedstruct.rb +1 -1
  293. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  294. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  295. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  296. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  297. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  298. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  299. data/lib/ffi/platform.rb +15 -13
  300. data/lib/ffi/pointer.rb +6 -6
  301. data/lib/ffi/struct.rb +6 -5
  302. data/lib/ffi/struct_layout.rb +3 -3
  303. data/lib/ffi/struct_layout_builder.rb +9 -9
  304. data/lib/ffi/types.rb +65 -37
  305. data/lib/ffi/variadic.rb +19 -8
  306. data/lib/ffi/version.rb +1 -1
  307. data/samples/hello_ractor.rb +11 -0
  308. data/samples/qsort_ractor.rb +28 -0
  309. data/sig/ffi/abstract_memory.rbs +165 -0
  310. data/sig/ffi/auto_pointer.rbs +27 -0
  311. data/sig/ffi/buffer.rbs +18 -0
  312. data/sig/ffi/data_converter.rbs +10 -0
  313. data/sig/ffi/dynamic_library.rbs +9 -0
  314. data/sig/ffi/enum.rbs +38 -0
  315. data/sig/ffi/function.rbs +39 -0
  316. data/sig/ffi/library.rbs +42 -0
  317. data/sig/ffi/native_type.rbs +86 -0
  318. data/sig/ffi/pointer.rbs +42 -0
  319. data/sig/ffi/struct.rbs +76 -0
  320. data/sig/ffi/struct_by_reference.rbs +11 -0
  321. data/sig/ffi/struct_by_value.rbs +7 -0
  322. data/sig/ffi/struct_layout.rbs +9 -0
  323. data/sig/ffi/struct_layout_builder.rbs +5 -0
  324. data/sig/ffi/type.rbs +39 -0
  325. data/sig/ffi.rbs +26 -0
  326. data.tar.gz.sig +0 -0
  327. metadata +122 -28
  328. metadata.gz.sig +1 -0
  329. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
  330. data/ext/ffi_c/libffi/.travis/build.sh +0 -142
  331. data/ext/ffi_c/libffi/.travis.yml +0 -83
  332. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
  333. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
  334. /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  335. /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
  336. /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  337. /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
  338. /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
  339. /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
  340. /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
  341. /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
  342. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  343. /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
@@ -0,0 +1,62 @@
1
+ /* -----------------------------------------------------------------*-C-*-
2
+ ffitarget.h - Copyright (c) 2018-2023 Hood Chatham, Brion Vibber, Kleis Auke Wolthuizen, and others.
3
+
4
+ Target configuration macros for wasm32.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ ``Software''), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included
15
+ in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24
+ DEALINGS IN THE SOFTWARE.
25
+
26
+ ----------------------------------------------------------------------- */
27
+
28
+ #ifndef LIBFFI_TARGET_H
29
+ #define LIBFFI_TARGET_H
30
+
31
+ #ifndef LIBFFI_H
32
+ #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
33
+ #endif
34
+
35
+ /* ---- Generic type definitions ----------------------------------------- */
36
+
37
+ typedef unsigned long ffi_arg;
38
+ typedef signed long ffi_sarg;
39
+
40
+ // TODO: https://github.com/emscripten-core/emscripten/issues/9868
41
+ typedef void (*ffi_fp)(void);
42
+
43
+ typedef enum ffi_abi {
44
+ FFI_FIRST_ABI = 0,
45
+ FFI_WASM32, // "raw", no structures, varargs, or closures (not implemented!)
46
+ FFI_WASM32_EMSCRIPTEN, // structures, varargs, and split 64-bit params
47
+ FFI_LAST_ABI,
48
+ #ifdef __EMSCRIPTEN__
49
+ FFI_DEFAULT_ABI = FFI_WASM32_EMSCRIPTEN
50
+ #else
51
+ FFI_DEFAULT_ABI = FFI_WASM32
52
+ #endif
53
+ } ffi_abi;
54
+
55
+ #define FFI_CLOSURES 1
56
+ // #define FFI_GO_CLOSURES 0
57
+ #define FFI_TRAMPOLINE_SIZE 4
58
+ // #define FFI_NATIVE_RAW_API 0
59
+ #define FFI_TARGET_SPECIFIC_VARIADIC 1
60
+ #define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs
61
+
62
+ #endif
@@ -1,5 +1,5 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi.c - Copyright (c) 2017 Anthony Green
2
+ ffi.c - Copyright (c) 2017, 2022 Anthony Green
3
3
  Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc.
4
4
  Copyright (c) 2002 Ranjit Mathew
5
5
  Copyright (c) 2002 Bo Thorsen
@@ -34,6 +34,7 @@
34
34
  #include <ffi_common.h>
35
35
  #include <stdint.h>
36
36
  #include <stdlib.h>
37
+ #include <tramp.h>
37
38
  #include "internal.h"
38
39
 
39
40
  /* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
@@ -116,35 +117,37 @@ ffi_prep_cif_machdep(ffi_cif *cif)
116
117
  flags = X86_RET_INT64;
117
118
  break;
118
119
  case FFI_TYPE_STRUCT:
119
- #ifndef X86
120
- /* ??? This should be a different ABI rather than an ifdef. */
121
- if (cif->rtype->size == 1)
122
- flags = X86_RET_STRUCT_1B;
123
- else if (cif->rtype->size == 2)
124
- flags = X86_RET_STRUCT_2B;
125
- else if (cif->rtype->size == 4)
126
- flags = X86_RET_INT32;
127
- else if (cif->rtype->size == 8)
128
- flags = X86_RET_INT64;
129
- else
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
130
132
  #endif
131
- {
132
- do_struct:
133
- switch (cabi)
134
- {
135
- case FFI_THISCALL:
136
- case FFI_FASTCALL:
137
- case FFI_STDCALL:
138
- case FFI_MS_CDECL:
139
- flags = X86_RET_STRUCTARG;
140
- break;
141
- default:
142
- flags = X86_RET_STRUCTPOP;
143
- break;
144
- }
145
- /* Allocate space for return value pointer. */
146
- bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
147
- }
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
+ }
148
151
  break;
149
152
  case FFI_TYPE_COMPLEX:
150
153
  switch (cif->rtype->elements[0]->type)
@@ -181,7 +184,12 @@ ffi_prep_cif_machdep(ffi_cif *cif)
181
184
  {
182
185
  ffi_type *t = cif->arg_types[i];
183
186
 
184
- bytes = FFI_ALIGN (bytes, t->alignment);
187
+ #if defined(X86_WIN32)
188
+ if (cabi == FFI_STDCALL)
189
+ bytes = FFI_ALIGN (bytes, FFI_SIZEOF_ARG);
190
+ else
191
+ #endif
192
+ bytes = FFI_ALIGN (bytes, t->alignment);
185
193
  bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG);
186
194
  }
187
195
  cif->bytes = bytes;
@@ -255,6 +263,13 @@ static const struct abi_params abi_params[FFI_LAST_ABI] = {
255
263
 
256
264
  extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN;
257
265
 
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)
272
+ #endif
258
273
  static void
259
274
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
260
275
  void **avalue, void *closure)
@@ -370,7 +385,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
370
385
  cases. */
371
386
  if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
372
387
  align = 16;
373
-
388
+
374
389
  if (dir < 0)
375
390
  {
376
391
  /* ??? These reverse argument ABIs are probably too old
@@ -390,6 +405,9 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
390
405
 
391
406
  ffi_call_i386 (frame, stack);
392
407
  }
408
+ #if defined(_MSC_VER)
409
+ #pragma runtime_checks("s", restore)
410
+ #endif
393
411
 
394
412
  void
395
413
  ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
@@ -411,6 +429,11 @@ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
411
429
  void FFI_HIDDEN ffi_closure_i386(void);
412
430
  void FFI_HIDDEN ffi_closure_STDCALL(void);
413
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
414
437
 
415
438
  struct closure_frame
416
439
  {
@@ -522,10 +545,17 @@ ffi_closure_inner (struct closure_frame *frame, char *stack)
522
545
 
523
546
  frame->fun (cif, rvalue, avalue, frame->user_data);
524
547
 
525
- if (cabi == FFI_STDCALL)
526
- return flags + (cif->bytes << X86_RET_POP_SHIFT);
527
- else
528
- return flags;
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
+ }
529
559
  }
530
560
 
531
561
  ffi_status
@@ -542,12 +572,12 @@ ffi_prep_closure_loc (ffi_closure* closure,
542
572
  switch (cif->abi)
543
573
  {
544
574
  case FFI_SYSV:
545
- case FFI_THISCALL:
546
- case FFI_FASTCALL:
547
575
  case FFI_MS_CDECL:
548
576
  dest = ffi_closure_i386;
549
577
  break;
550
578
  case FFI_STDCALL:
579
+ case FFI_THISCALL:
580
+ case FFI_FASTCALL:
551
581
  case FFI_PASCAL:
552
582
  dest = ffi_closure_STDCALL;
553
583
  break;
@@ -559,6 +589,22 @@ ffi_prep_closure_loc (ffi_closure* closure,
559
589
  return FFI_BAD_ABI;
560
590
  }
561
591
 
592
+ #if defined(FFI_EXEC_STATIC_TRAMP)
593
+ if (ffi_tramp_is_present(closure))
594
+ {
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;
604
+ }
605
+ #endif
606
+
607
+ /* Initialize the dynamic trampoline. */
562
608
  /* endbr32. */
563
609
  *(UINT32 *) tramp = 0xfb1e0ff3;
564
610
 
@@ -570,6 +616,9 @@ ffi_prep_closure_loc (ffi_closure* closure,
570
616
  tramp[9] = 0xe9;
571
617
  *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14);
572
618
 
619
+ #if defined(FFI_EXEC_STATIC_TRAMP)
620
+ out:
621
+ #endif
573
622
  closure->cif = cif;
574
623
  closure->fun = fun;
575
624
  closure->user_data = user_data;
@@ -767,4 +816,17 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue)
767
816
  ffi_call_i386 (frame, stack);
768
817
  }
769
818
  #endif /* !FFI_NO_RAW_API */
819
+
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;
825
+
826
+ *map_size = X86_TRAMP_MAP_SIZE;
827
+ *tramp_size = X86_TRAMP_SIZE;
828
+ return &trampoline_code_table;
829
+ }
830
+ #endif
831
+
770
832
  #endif /* __i386__ */
@@ -1,5 +1,5 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi64.c - Copyright (c) 2011, 2018 Anthony Green
2
+ ffi64.c - Copyright (c) 2011, 2018, 2022 Anthony Green
3
3
  Copyright (c) 2013 The Written Word, Inc.
4
4
  Copyright (c) 2008, 2010 Red Hat, Inc.
5
5
  Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
@@ -33,6 +33,7 @@
33
33
  #include <stdlib.h>
34
34
  #include <stdarg.h>
35
35
  #include <stdint.h>
36
+ #include <tramp.h>
36
37
  #include "internal64.h"
37
38
 
38
39
  #ifdef __x86_64__
@@ -217,7 +218,8 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
217
218
  case FFI_TYPE_STRUCT:
218
219
  {
219
220
  const size_t UNITS_PER_WORD = 8;
220
- size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
221
+ size_t words = (type->size + byte_offset + UNITS_PER_WORD - 1)
222
+ / UNITS_PER_WORD;
221
223
  ffi_type **ptr;
222
224
  unsigned int i;
223
225
  enum x86_64_reg_class subclasses[MAX_CLASSES];
@@ -241,14 +243,15 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
241
243
  /* Merge the fields of structure. */
242
244
  for (ptr = type->elements; *ptr != NULL; ptr++)
243
245
  {
244
- size_t num;
246
+ size_t num, pos;
245
247
 
246
248
  byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment);
247
249
 
248
250
  num = classify_argument (*ptr, subclasses, byte_offset % 8);
249
251
  if (num == 0)
250
252
  return 0;
251
- for (i = 0; i < num; i++)
253
+ pos = byte_offset / 8;
254
+ for (i = 0; i < num && (i + pos) < words; i++)
252
255
  {
253
256
  size_t pos = byte_offset / 8;
254
257
  classes[i + pos] =
@@ -578,6 +581,9 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
578
581
  flags = UNIX64_RET_VOID;
579
582
  }
580
583
 
584
+ arg_types = cif->arg_types;
585
+ avn = cif->nargs;
586
+
581
587
  /* Allocate the space for the arguments, plus 4 words of temp space. */
582
588
  stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
583
589
  reg_args = (struct register_args *) stack;
@@ -592,9 +598,6 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
592
598
  if (flags & UNIX64_FLAG_RET_IN_MEM)
593
599
  reg_args->gpr[gprcount++] = (unsigned long) rvalue;
594
600
 
595
- avn = cif->nargs;
596
- arg_types = cif->arg_types;
597
-
598
601
  for (i = 0; i < avn; ++i)
599
602
  {
600
603
  size_t n, size = arg_types[i]->size;
@@ -610,11 +613,12 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
610
613
  if (align < 8)
611
614
  align = 8;
612
615
 
613
- /* Pass this argument in memory. */
614
- argp = (void *) FFI_ALIGN (argp, align);
615
- memcpy (argp, avalue[i], size);
616
- argp += size;
617
- }
616
+ /* Pass this argument in memory. */
617
+ argp = (void *) FFI_ALIGN (argp, align);
618
+ memcpy (argp, avalue[i], size);
619
+
620
+ argp += size;
621
+ }
618
622
  else
619
623
  {
620
624
  /* The argument is passed entirely in registers. */
@@ -678,6 +682,24 @@ ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
678
682
  void
679
683
  ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
680
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
+
681
703
  #ifndef __ILP32__
682
704
  if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
683
705
  {
@@ -714,6 +736,10 @@ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
714
736
 
715
737
  extern void ffi_closure_unix64(void) FFI_HIDDEN;
716
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
717
743
 
718
744
  #ifndef __ILP32__
719
745
  extern ffi_status
@@ -756,9 +782,26 @@ ffi_prep_closure_loc (ffi_closure* closure,
756
782
  else
757
783
  dest = ffi_closure_unix64;
758
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
797
+
798
+ /* Initialize the dynamic trampoline. */
759
799
  memcpy (tramp, trampoline, sizeof(trampoline));
760
800
  *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
761
801
 
802
+ #if defined(FFI_EXEC_STATIC_TRAMP)
803
+ out:
804
+ #endif
762
805
  closure->cif = cif;
763
806
  closure->fun = fun;
764
807
  closure->user_data = user_data;
@@ -892,4 +935,16 @@ ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
892
935
 
893
936
  #endif /* FFI_GO_CLOSURES */
894
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;
947
+ }
948
+ #endif
949
+
895
950
  #endif /* __x86_64__ */
@@ -41,6 +41,9 @@
41
41
 
42
42
  #if defined (X86_64) && defined (__i386__)
43
43
  #undef X86_64
44
+ #warning ******************************************************
45
+ #warning ********** X86 IS DEFINED ****************************
46
+ #warning ******************************************************
44
47
  #define X86
45
48
  #endif
46
49
 
@@ -85,9 +88,9 @@ typedef enum ffi_abi {
85
88
  FFI_LAST_ABI,
86
89
  #ifdef __GNUC__
87
90
  FFI_DEFAULT_ABI = FFI_GNUW64
88
- #else
91
+ #else
89
92
  FFI_DEFAULT_ABI = FFI_WIN64
90
- #endif
93
+ #endif
91
94
 
92
95
  #elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
93
96
  FFI_FIRST_ABI = 1,
@@ -147,9 +150,11 @@ typedef enum ffi_abi {
147
150
  # define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */
148
151
  #endif
149
152
 
150
- #if !defined(GENERATE_LIBFFI_MAP) && defined(__ASSEMBLER__) \
151
- && defined(__CET__)
153
+ #if !defined(GENERATE_LIBFFI_MAP) && defined(__CET__)
152
154
  # include <cet.h>
155
+ # if (__CET__ & 1) != 0
156
+ # define ENDBR_PRESENT
157
+ # endif
153
158
  # define _CET_NOTRACK notrack
154
159
  #else
155
160
  # define _CET_ENDBR
@@ -157,4 +162,3 @@ typedef enum ffi_abi {
157
162
  #endif
158
163
 
159
164
  #endif
160
-
@@ -30,6 +30,7 @@
30
30
  #include <ffi_common.h>
31
31
  #include <stdlib.h>
32
32
  #include <stdint.h>
33
+ #include <tramp.h>
33
34
 
34
35
  #ifdef X86_WIN64
35
36
  #define EFI64(name) name
@@ -107,6 +108,13 @@ EFI64(ffi_prep_cif_machdep)(ffi_cif *cif)
107
108
  return FFI_OK;
108
109
  }
109
110
 
111
+ /* We perform some black magic here to use some of the parent's stack frame in
112
+ * ffi_call_win64() that breaks with the MSVC compiler with the /RTCs or /GZ
113
+ * flags. Disable the 'Stack frame run time error checking' for this function
114
+ * so we don't hit weird exceptions in debug builds. */
115
+ #if defined(_MSC_VER)
116
+ #pragma runtime_checks("s", off)
117
+ #endif
110
118
  static void
111
119
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
112
120
  void **avalue, void *closure)
@@ -115,9 +123,25 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
115
123
  UINT64 *stack;
116
124
  size_t rsize;
117
125
  struct win64_call_frame *frame;
126
+ ffi_type **arg_types = cif->arg_types;
127
+ int nargs = cif->nargs;
118
128
 
119
129
  FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64);
120
130
 
131
+ /* If we have any large structure arguments, make a copy so we are passing
132
+ by value. */
133
+ for (i = 0; i < nargs; i++)
134
+ {
135
+ ffi_type *at = arg_types[i];
136
+ int size = at->size;
137
+ if (at->type == FFI_TYPE_STRUCT && size > 8)
138
+ {
139
+ char *argcopy = alloca (size);
140
+ memcpy (argcopy, avalue[i], size);
141
+ avalue[i] = argcopy;
142
+ }
143
+ }
144
+
121
145
  flags = cif->flags;
122
146
  rsize = 0;
123
147
 
@@ -171,6 +195,9 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
171
195
 
172
196
  ffi_call_win64 (stack, frame, closure);
173
197
  }
198
+ #if defined(_MSC_VER)
199
+ #pragma runtime_checks("s", restore)
200
+ #endif
174
201
 
175
202
  void
176
203
  EFI64(ffi_call)(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
@@ -187,6 +214,9 @@ EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue,
187
214
 
188
215
 
189
216
  extern void ffi_closure_win64(void) FFI_HIDDEN;
217
+ #if defined(FFI_EXEC_STATIC_TRAMP)
218
+ extern void ffi_closure_win64_alt(void) FFI_HIDDEN;
219
+ #endif
190
220
 
191
221
  #ifdef FFI_GO_CLOSURES
192
222
  extern void ffi_go_closure_win64(void) FFI_HIDDEN;
@@ -197,7 +227,7 @@ EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
197
227
  ffi_cif* cif,
198
228
  void (*fun)(ffi_cif*, void*, void**, void*),
199
229
  void *user_data,
200
- void *codeloc)
230
+ void *codeloc MAYBE_UNUSED)
201
231
  {
202
232
  static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = {
203
233
  /* endbr64 */
@@ -220,9 +250,22 @@ EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
220
250
  return FFI_BAD_ABI;
221
251
  }
222
252
 
253
+ #if defined(FFI_EXEC_STATIC_TRAMP)
254
+ if (ffi_tramp_is_present(closure))
255
+ {
256
+ /* Initialize the static trampoline's parameters. */
257
+ ffi_tramp_set_parms (closure->ftramp, ffi_closure_win64_alt, closure);
258
+ goto out;
259
+ }
260
+ #endif
261
+
262
+ /* Initialize the dynamic trampoline. */
223
263
  memcpy (tramp, trampoline, sizeof(trampoline));
224
264
  *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64;
225
265
 
266
+ #if defined(FFI_EXEC_STATIC_TRAMP)
267
+ out:
268
+ #endif
226
269
  closure->cif = cif;
227
270
  closure->fun = fun;
228
271
  closure->user_data = user_data;
@@ -27,3 +27,17 @@
27
27
  #else
28
28
  # define HAVE_FASTCALL 1
29
29
  #endif
30
+
31
+ #if defined(FFI_EXEC_STATIC_TRAMP)
32
+ /*
33
+ * For the trampoline code table mapping, a mapping size of 4K (base page size)
34
+ * is chosen.
35
+ */
36
+ #define X86_TRAMP_MAP_SHIFT 12
37
+ #define X86_TRAMP_MAP_SIZE (1 << X86_TRAMP_MAP_SHIFT)
38
+ #ifdef ENDBR_PRESENT
39
+ #define X86_TRAMP_SIZE 44
40
+ #else
41
+ #define X86_TRAMP_SIZE 40
42
+ #endif
43
+ #endif
@@ -20,3 +20,17 @@
20
20
  #define UNIX64_FLAG_RET_IN_MEM (1 << 10)
21
21
  #define UNIX64_FLAG_XMM_ARGS (1 << 11)
22
22
  #define UNIX64_SIZE_SHIFT 12
23
+
24
+ #if defined(FFI_EXEC_STATIC_TRAMP)
25
+ /*
26
+ * For the trampoline code table mapping, a mapping size of 4K (base page size)
27
+ * is chosen.
28
+ */
29
+ #define UNIX64_TRAMP_MAP_SHIFT 12
30
+ #define UNIX64_TRAMP_MAP_SIZE (1 << UNIX64_TRAMP_MAP_SHIFT)
31
+ #ifdef ENDBR_PRESENT
32
+ #define UNIX64_TRAMP_SIZE 40
33
+ #else
34
+ #define UNIX64_TRAMP_SIZE 32
35
+ #endif
36
+ #endif