ffi 1.15.5 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -40,6 +40,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
40
40
  #endif
41
41
  #endif
42
42
 
43
+ #ifdef __APPLE__
44
+ # define L(X) CONCAT1(L, X)
45
+ #else
46
+ # define L(X) CONCAT1(.L, X)
47
+ #endif
48
+
43
49
  #ifdef __AARCH64EB__
44
50
  # define BE(X) X
45
51
  #else
@@ -58,14 +64,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
58
64
  #define PTR_SIZE 8
59
65
  #endif
60
66
 
61
- #if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH)
62
- # define BR(r) braaz r
63
- # define BLR(r) blraaz r
64
- #else
65
- # define BR(r) br r
66
- # define BLR(r) blr r
67
- #endif
68
-
67
+ #define BTI_C hint #34
68
+ #define BTI_J hint #36
69
+ /*
70
+ * The ELF Notes section needs to indicate if BTI is supported, as the first ELF loaded that doesn't
71
+ * declare this support disables it for memory region containing the loaded library.
72
+ */
73
+ # define GNU_PROPERTY_AARCH64_BTI (1 << 0) /* Has Branch Target Identification */
69
74
  .text
70
75
  .align 4
71
76
 
@@ -86,9 +91,23 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
86
91
 
87
92
  cfi_startproc
88
93
  CNAME(ffi_call_SYSV):
94
+ BTI_C
95
+ /* Sign the lr with x1 since that is where it will be stored */
96
+ SIGN_LR_WITH_REG(x1)
97
+
89
98
  /* Use a stack frame allocated by our caller. */
90
- cfi_def_cfa(x1, 32);
99
+ #if defined(HAVE_PTRAUTH) && defined(__APPLE__)
100
+ /* darwin's libunwind assumes that the cfa is the sp and that's the data
101
+ * used to sign the lr. In order to allow unwinding through this
102
+ * function it is necessary to point the cfa at the signing register.
103
+ */
104
+ cfi_def_cfa(x1, 0);
105
+ #else
106
+ cfi_def_cfa(x1, 40);
107
+ #endif
91
108
  stp x29, x30, [x1]
109
+ mov x9, sp
110
+ str x9, [x1, #32]
92
111
  mov x29, x1
93
112
  mov sp, x0
94
113
  cfi_def_cfa_register(x29)
@@ -119,91 +138,162 @@ CNAME(ffi_call_SYSV):
119
138
  /* Deallocate the context, leaving the stacked arguments. */
120
139
  add sp, sp, #CALL_CONTEXT_SIZE
121
140
 
122
- BLR(x9) /* call fn */
141
+ BRANCH_AND_LINK_TO_REG x9 /* call fn */
123
142
 
124
143
  ldp x3, x4, [x29, #16] /* reload rvalue and flags */
125
144
 
126
145
  /* Partially deconstruct the stack frame. */
127
- mov sp, x29
146
+ ldr x9, [x29, #32]
147
+ mov sp, x9
128
148
  cfi_def_cfa_register (sp)
149
+ mov x2, x29 /* Preserve for auth */
129
150
  ldp x29, x30, [x29]
130
151
 
131
152
  /* Save the return value as directed. */
132
153
  adr x5, 0f
133
154
  and w4, w4, #AARCH64_RET_MASK
134
- add x5, x5, x4, lsl #3
155
+ add x5, x5, x4, lsl #4
135
156
  br x5
136
157
 
137
- /* Note that each table entry is 2 insns, and thus 8 bytes.
158
+ /* Note that each table entry is 4 insns, and thus 16 bytes.
138
159
  For integer data, note that we're storing into ffi_arg
139
160
  and therefore we want to extend to 64 bits; these types
140
161
  have two consecutive entries allocated for them. */
141
162
  .align 4
142
- 0: ret /* VOID */
163
+ 0: BTI_J /* VOID */
164
+ b 99f
165
+ nop
166
+ nop
167
+ 1: BTI_J /* INT64 */
168
+ str x0, [x3]
169
+ b 99f
170
+ nop
171
+ 2: BTI_J /* INT128 */
172
+ stp x0, x1, [x3]
173
+ b 99f
143
174
  nop
144
- 1: str x0, [x3] /* INT64 */
145
- ret
146
- 2: stp x0, x1, [x3] /* INT128 */
147
- ret
148
175
  3: brk #1000 /* UNUSED */
149
- ret
176
+ b 99f
177
+ nop
178
+ nop
150
179
  4: brk #1000 /* UNUSED */
151
- ret
180
+ b 99f
181
+ nop
182
+ nop
152
183
  5: brk #1000 /* UNUSED */
153
- ret
184
+ b 99f
185
+ nop
186
+ nop
154
187
  6: brk #1000 /* UNUSED */
155
- ret
188
+ b 99f
189
+ nop
190
+ nop
156
191
  7: brk #1000 /* UNUSED */
157
- ret
158
- 8: st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */
159
- ret
160
- 9: st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */
161
- ret
162
- 10: stp s0, s1, [x3] /* S2 */
163
- ret
164
- 11: str s0, [x3] /* S1 */
165
- ret
166
- 12: st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */
167
- ret
168
- 13: st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */
169
- ret
170
- 14: stp d0, d1, [x3] /* D2 */
171
- ret
172
- 15: str d0, [x3] /* D1 */
173
- ret
174
- 16: str q3, [x3, #48] /* Q4 */
192
+ b 99f
175
193
  nop
176
- 17: str q2, [x3, #32] /* Q3 */
177
194
  nop
178
- 18: stp q0, q1, [x3] /* Q2 */
179
- ret
180
- 19: str q0, [x3] /* Q1 */
181
- ret
182
- 20: uxtb w0, w0 /* UINT8 */
195
+ 8: BTI_J /* S4 */
196
+ st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3]
197
+ b 99f
198
+ nop
199
+ 9: BTI_J /* S3 */
200
+ st3 { v0.s, v1.s, v2.s }[0], [x3]
201
+ b 99f
202
+ nop
203
+ 10: BTI_J /* S2 */
204
+ stp s0, s1, [x3]
205
+ b 99f
206
+ nop
207
+ 11: BTI_J
208
+ str s0, [x3] /* S1 */
209
+ b 99f
210
+ nop
211
+ 12: BTI_J /* D4 */
212
+ st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3]
213
+ b 99f
214
+ nop
215
+ 13: BTI_J /* D3 */
216
+ st3 { v0.d, v1.d, v2.d }[0], [x3]
217
+ b 99f
218
+ nop
219
+ 14: BTI_J /* D2 */
220
+ stp d0, d1, [x3]
221
+ b 99f
222
+ nop
223
+ 15: BTI_J /* D1 */
224
+ str d0, [x3]
225
+ b 99f
226
+ nop
227
+ 16: BTI_J /* Q4 */
228
+ str q3, [x3, #48]
229
+ nop
230
+ nop
231
+ 17: BTI_J /* Q3 */
232
+ str q2, [x3, #32]
233
+ nop
234
+ nop
235
+ 18: BTI_J /* Q2 */
236
+ stp q0, q1, [x3]
237
+ b 99f
238
+ nop
239
+ 19: BTI_J /* Q1 */
240
+ str q0, [x3]
241
+ b 99f
242
+ nop
243
+ 20: BTI_J /* UINT8 */
244
+ uxtb w0, w0
183
245
  str x0, [x3]
184
- 21: ret /* reserved */
185
246
  nop
186
- 22: uxth w0, w0 /* UINT16 */
247
+ 21: b 99f /* reserved */
248
+ nop
249
+ nop
250
+ nop
251
+ 22: BTI_J /* UINT16 */
252
+ uxth w0, w0
187
253
  str x0, [x3]
188
- 23: ret /* reserved */
189
254
  nop
190
- 24: mov w0, w0 /* UINT32 */
255
+ 23: b 99f /* reserved */
256
+ nop
257
+ nop
258
+ nop
259
+ 24: BTI_J /* UINT32 */
260
+ mov w0, w0
191
261
  str x0, [x3]
192
- 25: ret /* reserved */
193
262
  nop
194
- 26: sxtb x0, w0 /* SINT8 */
263
+ 25: b 99f /* reserved */
264
+ nop
265
+ nop
266
+ nop
267
+ 26: BTI_J /* SINT8 */
268
+ sxtb x0, w0
195
269
  str x0, [x3]
196
- 27: ret /* reserved */
197
270
  nop
198
- 28: sxth x0, w0 /* SINT16 */
271
+ 27: b 99f /* reserved */
272
+ nop
273
+ nop
274
+ nop
275
+ 28: BTI_J /* SINT16 */
276
+ sxth x0, w0
199
277
  str x0, [x3]
200
- 29: ret /* reserved */
201
278
  nop
202
- 30: sxtw x0, w0 /* SINT32 */
279
+ 29: b 99f /* reserved */
280
+ nop
281
+ nop
282
+ nop
283
+ 30: BTI_J /* SINT32 */
284
+ sxtw x0, w0
203
285
  str x0, [x3]
204
- 31: ret /* reserved */
286
+ nop
287
+ 31: b 99f /* reserved */
288
+ nop
289
+ nop
205
290
  nop
206
291
 
292
+ /* Return now that result has been populated. */
293
+ 99:
294
+ AUTH_LR_WITH_REG(x2)
295
+ ret
296
+
207
297
  cfi_endproc
208
298
 
209
299
  .globl CNAME(ffi_call_SYSV)
@@ -213,6 +303,8 @@ CNAME(ffi_call_SYSV):
213
303
  .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV)
214
304
  #endif
215
305
 
306
+ #if FFI_CLOSURES
307
+
216
308
  /* ffi_closure_SYSV
217
309
 
218
310
  Closure invocation glue. This is the low level code invoked directly by
@@ -232,6 +324,8 @@ CNAME(ffi_call_SYSV):
232
324
  .align 4
233
325
  CNAME(ffi_closure_SYSV_V):
234
326
  cfi_startproc
327
+ BTI_C
328
+ SIGN_LR
235
329
  stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
236
330
  cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
237
331
  cfi_rel_offset (x29, 0)
@@ -255,6 +349,8 @@ CNAME(ffi_closure_SYSV_V):
255
349
  .align 4
256
350
  cfi_startproc
257
351
  CNAME(ffi_closure_SYSV):
352
+ BTI_C
353
+ SIGN_LR
258
354
  stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
259
355
  cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
260
356
  cfi_rel_offset (x29, 0)
@@ -271,7 +367,9 @@ CNAME(ffi_closure_SYSV):
271
367
  /* Load ffi_closure_inner arguments. */
272
368
  ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */
273
369
  ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */
274
- .Ldo_closure:
370
+ #ifdef FFI_GO_CLOSURES
371
+ L(do_closure):
372
+ #endif
275
373
  add x3, sp, #16 /* load context */
276
374
  add x4, sp, #ffi_closure_SYSV_FS /* load stack */
277
375
  add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */
@@ -279,85 +377,144 @@ CNAME(ffi_closure_SYSV):
279
377
  bl CNAME(ffi_closure_SYSV_inner)
280
378
 
281
379
  /* Load the return value as directed. */
282
- #if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH)
283
- autiza x1
284
- #endif
285
380
  adr x1, 0f
286
381
  and w0, w0, #AARCH64_RET_MASK
287
- add x1, x1, x0, lsl #3
382
+ add x1, x1, x0, lsl #4
288
383
  add x3, sp, #16+CALL_CONTEXT_SIZE
289
384
  br x1
290
385
 
291
- /* Note that each table entry is 2 insns, and thus 8 bytes. */
386
+ /* Note that each table entry is 4 insns, and thus 16 bytes. */
292
387
  .align 4
293
- 0: b 99f /* VOID */
388
+ 0: BTI_J /* VOID */
389
+ b 99f
294
390
  nop
295
- 1: ldr x0, [x3] /* INT64 */
391
+ nop
392
+ 1: BTI_J /* INT64 */
393
+ ldr x0, [x3]
296
394
  b 99f
297
- 2: ldp x0, x1, [x3] /* INT128 */
395
+ nop
396
+ 2: BTI_J /* INT128 */
397
+ ldp x0, x1, [x3]
298
398
  b 99f
399
+ nop
299
400
  3: brk #1000 /* UNUSED */
300
401
  nop
402
+ nop
403
+ nop
301
404
  4: brk #1000 /* UNUSED */
302
405
  nop
406
+ nop
407
+ nop
303
408
  5: brk #1000 /* UNUSED */
304
409
  nop
410
+ nop
411
+ nop
305
412
  6: brk #1000 /* UNUSED */
306
413
  nop
414
+ nop
415
+ nop
307
416
  7: brk #1000 /* UNUSED */
308
417
  nop
309
- 8: ldr s3, [x3, #12] /* S4 */
310
418
  nop
311
- 9: ldr s2, [x3, #8] /* S3 */
312
419
  nop
313
- 10: ldp s0, s1, [x3] /* S2 */
420
+ 8: BTI_J /* S4 */
421
+ ldr s3, [x3, #12]
422
+ nop
423
+ nop
424
+ 9: BTI_J /* S3 */
425
+ ldr s2, [x3, #8]
426
+ nop
427
+ nop
428
+ 10: BTI_J /* S2 */
429
+ ldp s0, s1, [x3]
314
430
  b 99f
315
- 11: ldr s0, [x3] /* S1 */
431
+ nop
432
+ 11: BTI_J /* S1 */
433
+ ldr s0, [x3]
316
434
  b 99f
317
- 12: ldr d3, [x3, #24] /* D4 */
318
435
  nop
319
- 13: ldr d2, [x3, #16] /* D3 */
436
+ 12: BTI_J /* D4 */
437
+ ldr d3, [x3, #24]
438
+ nop
439
+ nop
440
+ 13: BTI_J /* D3 */
441
+ ldr d2, [x3, #16]
320
442
  nop
321
- 14: ldp d0, d1, [x3] /* D2 */
443
+ nop
444
+ 14: BTI_J /* D2 */
445
+ ldp d0, d1, [x3]
322
446
  b 99f
323
- 15: ldr d0, [x3] /* D1 */
447
+ nop
448
+ 15: BTI_J /* D1 */
449
+ ldr d0, [x3]
324
450
  b 99f
325
- 16: ldr q3, [x3, #48] /* Q4 */
326
451
  nop
327
- 17: ldr q2, [x3, #32] /* Q3 */
452
+ 16: BTI_J /* Q4 */
453
+ ldr q3, [x3, #48]
454
+ nop
455
+ nop
456
+ 17: BTI_J /* Q3 */
457
+ ldr q2, [x3, #32]
328
458
  nop
329
- 18: ldp q0, q1, [x3] /* Q2 */
459
+ nop
460
+ 18: BTI_J /* Q2 */
461
+ ldp q0, q1, [x3]
330
462
  b 99f
331
- 19: ldr q0, [x3] /* Q1 */
463
+ nop
464
+ 19: BTI_J /* Q1 */
465
+ ldr q0, [x3]
332
466
  b 99f
333
- 20: ldrb w0, [x3, #BE(7)] /* UINT8 */
467
+ nop
468
+ 20: BTI_J /* UINT8 */
469
+ ldrb w0, [x3, #BE(7)]
334
470
  b 99f
471
+ nop
335
472
  21: brk #1000 /* reserved */
336
473
  nop
337
- 22: ldrh w0, [x3, #BE(6)] /* UINT16 */
474
+ nop
475
+ nop
476
+ 22: BTI_J /* UINT16 */
477
+ ldrh w0, [x3, #BE(6)]
338
478
  b 99f
479
+ nop
339
480
  23: brk #1000 /* reserved */
340
481
  nop
341
- 24: ldr w0, [x3, #BE(4)] /* UINT32 */
482
+ nop
483
+ nop
484
+ 24: BTI_J /* UINT32 */
485
+ ldr w0, [x3, #BE(4)]
342
486
  b 99f
487
+ nop
343
488
  25: brk #1000 /* reserved */
344
489
  nop
345
- 26: ldrsb x0, [x3, #BE(7)] /* SINT8 */
490
+ nop
491
+ nop
492
+ 26: BTI_J /* SINT8 */
493
+ ldrsb x0, [x3, #BE(7)]
346
494
  b 99f
495
+ nop
347
496
  27: brk #1000 /* reserved */
348
497
  nop
349
- 28: ldrsh x0, [x3, #BE(6)] /* SINT16 */
498
+ nop
499
+ nop
500
+ 28: BTI_J /* SINT16 */
501
+ ldrsh x0, [x3, #BE(6)]
350
502
  b 99f
503
+ nop
351
504
  29: brk #1000 /* reserved */
352
505
  nop
353
- 30: ldrsw x0, [x3, #BE(4)] /* SINT32 */
506
+ nop
507
+ nop
508
+ 30: BTI_J /* SINT32 */
509
+ ldrsw x0, [x3, #BE(4)]
510
+ nop
354
511
  nop
355
512
  31: /* reserved */
356
513
  99: ldp x29, x30, [sp], #ffi_closure_SYSV_FS
357
514
  cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS)
358
515
  cfi_restore (x29)
359
516
  cfi_restore (x30)
360
- ret
517
+ AUTH_LR_AND_RET
361
518
  cfi_endproc
362
519
 
363
520
  .globl CNAME(ffi_closure_SYSV)
@@ -367,6 +524,78 @@ CNAME(ffi_closure_SYSV):
367
524
  .size CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV)
368
525
  #endif
369
526
 
527
+ #if defined(FFI_EXEC_STATIC_TRAMP)
528
+ .align 4
529
+ CNAME(ffi_closure_SYSV_V_alt):
530
+ BTI_C
531
+ /* See the comments above trampoline_code_table. */
532
+ ldr x17, [sp, #8] /* Load closure in x17 */
533
+ add sp, sp, #16 /* Restore the stack */
534
+ b CNAME(ffi_closure_SYSV_V)
535
+
536
+ .globl CNAME(ffi_closure_SYSV_V_alt)
537
+ FFI_HIDDEN(CNAME(ffi_closure_SYSV_V_alt))
538
+ #ifdef __ELF__
539
+ .type CNAME(ffi_closure_SYSV_V_alt), #function
540
+ .size CNAME(ffi_closure_SYSV_V_alt), . - CNAME(ffi_closure_SYSV_V_alt)
541
+ #endif
542
+
543
+ .align 4
544
+ CNAME(ffi_closure_SYSV_alt):
545
+ BTI_C
546
+ /* See the comments above trampoline_code_table. */
547
+ ldr x17, [sp, #8] /* Load closure in x17 */
548
+ add sp, sp, #16 /* Restore the stack */
549
+ b CNAME(ffi_closure_SYSV)
550
+
551
+ .globl CNAME(ffi_closure_SYSV_alt)
552
+ FFI_HIDDEN(CNAME(ffi_closure_SYSV_alt))
553
+ #ifdef __ELF__
554
+ .type CNAME(ffi_closure_SYSV_alt), #function
555
+ .size CNAME(ffi_closure_SYSV_alt), . - CNAME(ffi_closure_SYSV_alt)
556
+ #endif
557
+
558
+ /*
559
+ * Below is the definition of the trampoline code table. Each element in
560
+ * the code table is a trampoline.
561
+ */
562
+ /*
563
+ * The trampoline uses register x17. It saves the original value of x17 on
564
+ * the stack.
565
+ *
566
+ * The trampoline has two parameters - target code to jump to and data for
567
+ * the target code. The trampoline extracts the parameters from its parameter
568
+ * block (see tramp_table_map()). The trampoline saves the data address on
569
+ * the stack. Finally, it jumps to the target code.
570
+ *
571
+ * The target code can choose to:
572
+ *
573
+ * - restore the value of x17
574
+ * - load the data address in a register
575
+ * - restore the stack pointer to what it was when the trampoline was invoked.
576
+ */
577
+ .align AARCH64_TRAMP_MAP_SHIFT
578
+ CNAME(trampoline_code_table):
579
+ .rept AARCH64_TRAMP_MAP_SIZE / AARCH64_TRAMP_SIZE
580
+ sub sp, sp, #16 /* Make space on the stack */
581
+ str x17, [sp] /* Save x17 on stack */
582
+ adr x17, #16376 /* Get data address */
583
+ ldr x17, [x17] /* Copy data into x17 */
584
+ str x17, [sp, #8] /* Save data on stack */
585
+ adr x17, #16372 /* Get code address */
586
+ ldr x17, [x17] /* Load code address into x17 */
587
+ br x17 /* Jump to code */
588
+ .endr
589
+
590
+ .globl CNAME(trampoline_code_table)
591
+ FFI_HIDDEN(CNAME(trampoline_code_table))
592
+ #ifdef __ELF__
593
+ .type CNAME(trampoline_code_table), #function
594
+ .size CNAME(trampoline_code_table), . - CNAME(trampoline_code_table)
595
+ #endif
596
+ .align AARCH64_TRAMP_MAP_SHIFT
597
+ #endif /* FFI_EXEC_STATIC_TRAMP */
598
+
370
599
  #if FFI_EXEC_TRAMPOLINE_TABLE
371
600
 
372
601
  #ifdef __MACH__
@@ -376,7 +605,7 @@ CNAME(ffi_closure_trampoline_table_page):
376
605
  .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE
377
606
  adr x16, -PAGE_MAX_SIZE
378
607
  ldp x17, x16, [x16]
379
- BR(x16)
608
+ br x16
380
609
  nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller than 16 bytes */
381
610
  .endr
382
611
 
@@ -394,6 +623,7 @@ CNAME(ffi_closure_trampoline_table_page):
394
623
  .align 4
395
624
  CNAME(ffi_go_closure_SYSV_V):
396
625
  cfi_startproc
626
+ BTI_C
397
627
  stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
398
628
  cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
399
629
  cfi_rel_offset (x29, 0)
@@ -417,6 +647,7 @@ CNAME(ffi_go_closure_SYSV_V):
417
647
  .align 4
418
648
  cfi_startproc
419
649
  CNAME(ffi_go_closure_SYSV):
650
+ BTI_C
420
651
  stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
421
652
  cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
422
653
  cfi_rel_offset (x29, 0)
@@ -433,7 +664,7 @@ CNAME(ffi_go_closure_SYSV):
433
664
  /* Load ffi_closure_inner arguments. */
434
665
  ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */
435
666
  mov x2, x18 /* load user_data */
436
- b .Ldo_closure
667
+ b L(do_closure)
437
668
  cfi_endproc
438
669
 
439
670
  .globl CNAME(ffi_go_closure_SYSV)
@@ -443,9 +674,22 @@ CNAME(ffi_go_closure_SYSV):
443
674
  .size CNAME(ffi_go_closure_SYSV), . - CNAME(ffi_go_closure_SYSV)
444
675
  #endif
445
676
  #endif /* FFI_GO_CLOSURES */
677
+ #endif /* FFI_CLOSURES */
446
678
  #endif /* __arm64__ */
447
679
 
448
680
  #if defined __ELF__ && defined __linux__
449
681
  .section .note.GNU-stack,"",%progbits
682
+
683
+ .pushsection .note.gnu.property, "a";
684
+ .balign 8;
685
+ .long 4;
686
+ .long 0x10;
687
+ .long 0x5;
688
+ .asciz "GNU";
689
+ .long 0xc0000000; /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */
690
+ .long 4;
691
+ .long GNU_PROPERTY_AARCH64_BTI;
692
+ .long 0;
693
+ .popsection;
450
694
  #endif
451
695