ffi 1.15.4 → 1.16.3

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 (312) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +90 -0
  4. data/Gemfile +1 -1
  5. data/README.md +3 -2
  6. data/Rakefile +28 -11
  7. data/ext/ffi_c/AbstractMemory.c +60 -36
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +49 -13
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +86 -29
  12. data/ext/ffi_c/Call.c +18 -7
  13. data/ext/ffi_c/DynamicLibrary.c +89 -26
  14. data/ext/ffi_c/Function.c +244 -98
  15. data/ext/ffi_c/Function.h +1 -0
  16. data/ext/ffi_c/FunctionInfo.c +80 -24
  17. data/ext/ffi_c/LastError.c +25 -7
  18. data/ext/ffi_c/MappedType.c +66 -23
  19. data/ext/ffi_c/MappedType.h +0 -2
  20. data/ext/ffi_c/MemoryPointer.c +34 -7
  21. data/ext/ffi_c/MethodHandle.c +3 -1
  22. data/ext/ffi_c/Pointer.c +68 -29
  23. data/ext/ffi_c/Pointer.h +1 -0
  24. data/ext/ffi_c/Struct.c +155 -80
  25. data/ext/ffi_c/Struct.h +7 -4
  26. data/ext/ffi_c/StructByValue.c +48 -16
  27. data/ext/ffi_c/StructLayout.c +117 -48
  28. data/ext/ffi_c/Type.c +104 -36
  29. data/ext/ffi_c/Type.h +3 -1
  30. data/ext/ffi_c/Types.c +1 -1
  31. data/ext/ffi_c/Variadic.c +65 -23
  32. data/ext/ffi_c/compat.h +22 -22
  33. data/ext/ffi_c/extconf.rb +19 -2
  34. data/ext/ffi_c/ffi.c +4 -0
  35. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  36. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  37. data/ext/ffi_c/libffi/.appveyor.yml +27 -9
  38. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  39. data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
  40. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  41. data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
  42. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  43. data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
  44. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  45. data/ext/ffi_c/libffi/.github/workflows/build.yml +460 -0
  46. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -0
  47. data/ext/ffi_c/libffi/.gitignore +10 -2
  48. data/ext/ffi_c/libffi/LICENSE +1 -1
  49. data/ext/ffi_c/libffi/Makefile.am +12 -5
  50. data/ext/ffi_c/libffi/Makefile.in +92 -34
  51. data/ext/ffi_c/libffi/README.md +144 -104
  52. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  53. data/ext/ffi_c/libffi/compile +348 -0
  54. data/ext/ffi_c/libffi/config.guess +623 -556
  55. data/ext/ffi_c/libffi/config.sub +75 -34
  56. data/ext/ffi_c/libffi/configure +4567 -3822
  57. data/ext/ffi_c/libffi/configure.ac +64 -28
  58. data/ext/ffi_c/libffi/configure.host +25 -6
  59. data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
  60. data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
  61. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  62. data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
  63. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
  64. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  65. data/ext/ffi_c/libffi/include/Makefile.in +10 -9
  66. data/ext/ffi_c/libffi/include/ffi.h.in +54 -50
  67. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  68. data/ext/ffi_c/libffi/include/ffi_common.h +29 -0
  69. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  70. data/ext/ffi_c/libffi/libtool-version +2 -2
  71. data/ext/ffi_c/libffi/ltmain.sh +512 -315
  72. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  73. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  74. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
  75. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  76. data/ext/ffi_c/libffi/man/Makefile.in +9 -6
  77. data/ext/ffi_c/libffi/missing +1 -1
  78. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  79. data/ext/ffi_c/libffi/msvcc.sh +1 -1
  80. data/ext/ffi_c/libffi/src/aarch64/ffi.c +146 -42
  81. data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
  82. data/ext/ffi_c/libffi/src/aarch64/sysv.S +134 -42
  83. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  84. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  85. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  86. data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
  87. data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
  88. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  89. data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
  90. data/ext/ffi_c/libffi/src/closures.c +133 -47
  91. data/ext/ffi_c/libffi/src/dlmalloc.c +5 -0
  92. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  93. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  94. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +621 -0
  95. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  96. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  97. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  98. data/ext/ffi_c/libffi/src/mips/ffi.c +240 -65
  99. data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
  100. data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
  101. data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
  102. data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
  103. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  104. data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
  105. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  106. data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
  107. data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
  108. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  109. data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
  110. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
  111. data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
  112. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
  113. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  114. data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
  115. data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
  116. data/ext/ffi_c/libffi/src/sparc/ffi64.c +16 -0
  117. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  118. data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -0
  119. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  120. data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
  121. data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
  122. data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
  123. data/ext/ffi_c/libffi/src/x86/ffiw64.c +43 -0
  124. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  125. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  126. data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
  127. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
  128. data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
  129. data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
  130. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  131. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  132. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  133. data/ext/ffi_c/libffi/testsuite/Makefile.am +127 -114
  134. data/ext/ffi_c/libffi/testsuite/Makefile.in +136 -120
  135. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  136. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  137. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +80 -0
  138. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  139. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  140. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  141. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
  142. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  143. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
  144. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
  173. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
  176. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
  180. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
  187. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
  188. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
  189. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
  197. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
  198. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
  200. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
  201. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
  202. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
  203. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
  205. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
  206. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
  207. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
  208. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
  209. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
  210. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
  211. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
  212. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
  213. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
  214. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
  216. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
  217. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
  218. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
  219. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
  220. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
  222. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
  223. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
  224. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
  226. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
  227. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
  228. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
  229. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
  242. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
  243. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
  244. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
  245. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
  247. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
  250. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
  251. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
  261. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
  262. data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
  263. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
  264. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
  265. data/ext/ffi_c/libffi.bsd.mk +2 -2
  266. data/ext/ffi_c/libffi.gnu.mk +2 -2
  267. data/ext/ffi_c/rbffi.h +1 -1
  268. data/ffi.gemspec +3 -3
  269. data/lib/ffi/autopointer.rb +7 -22
  270. data/lib/ffi/compat.rb +43 -0
  271. data/lib/ffi/data_converter.rb +2 -2
  272. data/lib/ffi/dynamic_library.rb +89 -0
  273. data/lib/ffi/enum.rb +18 -11
  274. data/lib/ffi/ffi.rb +3 -0
  275. data/lib/ffi/function.rb +71 -0
  276. data/lib/ffi/library.rb +55 -71
  277. data/lib/ffi/library_path.rb +109 -0
  278. data/lib/ffi/managedstruct.rb +1 -1
  279. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  280. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  281. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  282. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  283. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  284. data/lib/ffi/platform.rb +15 -13
  285. data/lib/ffi/struct.rb +2 -1
  286. data/lib/ffi/struct_layout.rb +1 -1
  287. data/lib/ffi/struct_layout_builder.rb +1 -1
  288. data/lib/ffi/tools/const_generator.rb +5 -4
  289. data/lib/ffi/types.rb +32 -6
  290. data/lib/ffi/variadic.rb +19 -8
  291. data/lib/ffi/version.rb +1 -1
  292. data/rakelib/ffi_gem_helper.rb +1 -1
  293. data/samples/hello_ractor.rb +11 -0
  294. data/samples/qsort_ractor.rb +28 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +103 -28
  297. metadata.gz.sig +0 -0
  298. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
  299. data/ext/ffi_c/libffi/.travis/build.sh +0 -142
  300. data/ext/ffi_c/libffi/.travis.yml +0 -83
  301. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
  302. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
  303. /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  304. /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
  305. /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  306. /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
  307. /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
  308. /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
  309. /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
  310. /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
  311. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  312. /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019 Free Software Foundation, Inc.
1
+ # Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019, 2022 Free Software Foundation, Inc.
2
2
 
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -45,7 +45,7 @@ proc is-effective-target { arg } {
45
45
  if { [info procs check_effective_target_${arg}] != [list] } {
46
46
  set selected [check_effective_target_${arg}]
47
47
  } else {
48
- error "unknown effective target keyword `$arg'"
48
+ error "unknown effective target keyword `$arg'"
49
49
  }
50
50
  verbose "is-effective-target: $arg $selected" 2
51
51
  return $selected
@@ -196,7 +196,7 @@ if { [info procs saved-dg-process-target] == [list] } {
196
196
  return "N"
197
197
  }
198
198
  return [dg-process-target-1 $xfail_selector]
199
-
199
+
200
200
  }
201
201
  return [dg-process-target-1 $selector]
202
202
  }
@@ -221,6 +221,13 @@ proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
221
221
  set output_match [lreplace $output_match 1 1 $x]
222
222
  }
223
223
 
224
+ if { [ istarget "wasm32-*-*" ] } {
225
+ # emscripten will get confused if told to build as .exe
226
+ set exec_suffix ""
227
+ } else {
228
+ set exec_suffix ".exe"
229
+ }
230
+
224
231
  # Set up the compiler flags, based on what we're going to do.
225
232
 
226
233
  set options [list]
@@ -231,7 +238,7 @@ proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
231
238
  }
232
239
  "link" {
233
240
  set compile_type "executable"
234
- set output_file "[file rootname [file tail $prog]].exe"
241
+ set output_file "[file rootname [file tail $prog]]$exec_suffix"
235
242
  # The following line is needed for targets like the i960 where
236
243
  # the default output file is b.out. Sigh.
237
244
  }
@@ -240,7 +247,7 @@ proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
240
247
  # FIXME: "./" is to cope with "." not being in $PATH.
241
248
  # Should this be handled elsewhere?
242
249
  # YES.
243
- set output_file "./[file rootname [file tail $prog]].exe"
250
+ set output_file "./[file rootname [file tail $prog]]$exec_suffix"
244
251
  # This is the only place where we care if an executable was
245
252
  # created or not. If it was, dg.exp will try to run it.
246
253
  remote_file build delete $output_file;
@@ -269,6 +276,10 @@ proc libffi-dg-test { prog do_what extra_tool_flags } {
269
276
  proc libffi-dg-prune { target_triplet text } {
270
277
  # We get this with some qemu emulated systems (eg. ppc64le-linux-gnu)
271
278
  regsub -all "(^|\n)\[^\n\]*unable to perform all requested operations" $text "" text
279
+ # We get this from sparc64 linux systems
280
+ regsub -all "(^|\n)\[^\n\]*warning: .* has a LOAD segment with RWX permissions" $text "" text
281
+ # Ignore Emscripten INFO messages
282
+ regsub -all "(^|\n)(cache|shared):INFO:\[^\n\]*" $text "" text
272
283
  return $text
273
284
  }
274
285
 
@@ -292,9 +303,6 @@ proc libffi-init { args } {
292
303
  verbose "libffi $blddirffi"
293
304
 
294
305
  # Which compiler are we building with?
295
- set tmp [grep "$blddirffi/config.log" "^ax_cv_c_compiler_vendor.*$"]
296
- regexp -- {^[^=]*=(.*)$} $tmp nil compiler_vendor
297
-
298
306
  if { [string match $compiler_vendor "gnu"] } {
299
307
  set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
300
308
  if {$gccdir != ""} {
@@ -379,7 +387,9 @@ proc libffi_target_compile { source dest type options } {
379
387
 
380
388
  if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
381
389
  || [istarget "*-*-darwin2*"] } {
382
- lappend options "additional_flags=-Wl,-allow_stack_execute"
390
+ # lappend options "additional_flags=-Wl,-allow_stack_execute"
391
+ lappend options "additional_flags=-Wno-unused-command-line-argument"
392
+ lappend options "additional_flags=-Wl,-search_paths_first"
383
393
  }
384
394
 
385
395
  # If you're building the compiler with --prefix set to a place
@@ -397,17 +407,29 @@ proc libffi_target_compile { source dest type options } {
397
407
 
398
408
  lappend options "libs= -lffi"
399
409
 
400
- if { [string match "aarch64*-*-linux*" $target_triplet] } {
401
- lappend options "libs= -lpthread"
402
- }
410
+ if { ![string match "*android*" $target_triplet] } {
411
+
412
+ if { [string match "aarch64*-*-linux*" $target_triplet] } {
413
+ lappend options "libs= -lpthread"
414
+ }
403
415
 
404
- # this may be required for g++, but just confused clang.
405
- if { [string match "*.cc" $source] } {
406
- lappend options "c++"
416
+ # this may be required for g++, but just confused clang.
417
+ if { [string match "*.cc" $source] } {
418
+ lappend options "c++"
419
+ if { [string match "*-*-darwin*" $target_triplet] } {
420
+ lappend options "libs= -lc++"
421
+ }
422
+ }
423
+
424
+ if { [string match "arc*-*-linux*" $target_triplet] } {
425
+ lappend options "libs= -lpthread"
426
+ }
407
427
  }
408
428
 
409
- if { [string match "arc*-*-linux*" $target_triplet] } {
410
- lappend options "libs= -lpthread"
429
+ # emscripten emits this warning while building the feature test
430
+ # which causes it to be seen as unsupported.
431
+ if { [string match "wasm32-*" $target_triplet] } {
432
+ lappend options "additional_flags=-Wno-unused-command-line-argument"
411
433
  }
412
434
 
413
435
  verbose "options: $options"
@@ -489,7 +511,7 @@ proc run-many-tests { testcases extra_flags } {
489
511
  set common "-W -Wall"
490
512
  if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
491
513
  set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
492
- } else {
514
+ } else {
493
515
  set optimizations { "-O0" "-O2" }
494
516
  }
495
517
  }
@@ -497,7 +519,7 @@ proc run-many-tests { testcases extra_flags } {
497
519
  set common "-W -Wall -Wno-psabi"
498
520
  if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
499
521
  set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
500
- } else {
522
+ } else {
501
523
  set optimizations { "-O0" "-O2" }
502
524
  }
503
525
  }
@@ -506,7 +528,7 @@ proc run-many-tests { testcases extra_flags } {
506
528
  set common ""
507
529
  if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
508
530
  set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
509
- } else {
531
+ } else {
510
532
  set optimizations { "" }
511
533
  }
512
534
  }
@@ -595,7 +617,7 @@ proc check-flags { args } {
595
617
  # compare them to the actual options.
596
618
  if { [string compare [lindex $args 2] "*"] == 0
597
619
  && [string compare [lindex $args 3] "" ] == 0 } {
598
- set result 1
620
+ set result 1
599
621
  } else {
600
622
  # The target list might be an effective-target keyword, so replace
601
623
  # the original list with "*-*-*", since we already know it matches.
@@ -175,7 +175,7 @@ proc set_ld_library_path_env_vars { } {
175
175
  } else {
176
176
  setenv DYLD_LIBRARY_PATH "$ld_library_path"
177
177
  }
178
- if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
178
+ if { [istarget *-*-cygwin*] || [ istarget *-*-msys* ] || [istarget *-*-mingw*] } {
179
179
  if { $orig_path_saved } {
180
180
  setenv PATH "$ld_library_path:$orig_path"
181
181
  } else {
@@ -271,7 +271,7 @@ proc get_shlib_extension { } {
271
271
 
272
272
  if { [ istarget *-*-darwin* ] } {
273
273
  set shlib_ext "dylib"
274
- } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } {
274
+ } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-msys* ] || [ istarget *-*-mingw* ] } {
275
275
  set shlib_ext "dll"
276
276
  } elseif { [ istarget hppa*-*-hpux* ] } {
277
277
  set shlib_ext "sl"
@@ -50,6 +50,7 @@ int _fprintf(FILE *stream, const char *format, ...)
50
50
  case 3:
51
51
  vsprintf(&rbuf2[strlen(rbuf2)], format, args);
52
52
  printf("%s", rbuf2);
53
+ fflush (stdout);
53
54
  if (strcmp (rbuf1, rbuf2)) abort();
54
55
  break;
55
56
  }
@@ -64,7 +64,11 @@ typedef struct {
64
64
  typedef struct { char c[3]; } T;
65
65
  typedef struct { char c[33],c1; } X;
66
66
 
67
- char c1='a', c2=127, c3=(char)128, c4=(char)255, c5=-1;
67
+ /* Don't use a number over 127, as some systems use signed chars and
68
+ the test case 25 doesn't account for this, resulting in undefined
69
+ behavior. See https://github.com/libffi/libffi/issues/598. */
70
+ char c1='a', c2=127, c3=(char)1;
71
+
68
72
  short s1=32767, s2=(short)32768, s3=3, s4=4, s5=5, s6=6, s7=7, s8=8, s9=9;
69
73
  int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9,
70
74
  i10=11, i11=12, i12=13, i13=14, i14=15, i15=16, i16=17;
@@ -0,0 +1,41 @@
1
+ /* Area: bpo-38748
2
+ Purpose: test for stdcall alignment problem
3
+ Source: github.com/python/cpython/pull/26204 */
4
+
5
+ /* { dg-do run } */
6
+
7
+ #include "ffitest.h"
8
+ #include "ffi_common.h"
9
+
10
+ static UINT32 ABI_ATTR align_arguments(UINT32 l1,
11
+ UINT64 l2)
12
+ {
13
+ return l1 + (UINT32) l2;
14
+ }
15
+
16
+ int main(void)
17
+ {
18
+ ffi_cif cif;
19
+ ffi_type *args[4] = {
20
+ &ffi_type_uint32,
21
+ &ffi_type_uint64
22
+ };
23
+ ffi_arg lr1, lr2;
24
+ UINT32 l1 = 1;
25
+ UINT64 l2 = 2;
26
+ void *values[2] = {&l1, &l2};
27
+
28
+ /* Initialize the cif */
29
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
30
+ &ffi_type_uint32, args) == FFI_OK);
31
+
32
+ lr1 = align_arguments(l1, l2);
33
+
34
+ ffi_call(&cif, FFI_FN(align_arguments), &lr2, values);
35
+
36
+ if (lr1 == lr2)
37
+ printf("bpo-38748 arguments tests ok!\n");
38
+ else
39
+ CHECK(0);
40
+ exit(0);
41
+ }
@@ -5,6 +5,9 @@
5
5
  #include <ffi.h>
6
6
  #include "fficonfig.h"
7
7
 
8
+ #include <float.h>
9
+ #include <math.h>
10
+
8
11
  #if defined HAVE_STDINT_H
9
12
  #include <stdint.h>
10
13
  #endif
@@ -15,7 +18,29 @@
15
18
 
16
19
  #define MAX_ARGS 256
17
20
 
18
- #define CHECK(x) (void)(!(x) ? (abort(), 1) : 0)
21
+ #define CHECK(x) \
22
+ do { \
23
+ if(!(x)){ \
24
+ printf("Check failed:\n%s\n", #x); \
25
+ abort(); \
26
+ } \
27
+ } while(0)
28
+
29
+ #define CHECK_FLOAT_EQ(x, y) \
30
+ do { \
31
+ if(fabs((x) - (y)) > FLT_EPSILON){ \
32
+ printf("Check failed CHECK_FLOAT_EQ(%s, %s)\n", #x, #y); \
33
+ abort(); \
34
+ } \
35
+ } while(0)
36
+
37
+ #define CHECK_DOUBLE_EQ(x, y) \
38
+ do { \
39
+ if(fabs((x) - (y)) > DBL_EPSILON){ \
40
+ printf("Check failed CHECK_FLOAT_EQ(%s, %s)\n", #x, #y); \
41
+ abort(); \
42
+ } \
43
+ } while(0)
19
44
 
20
45
  /* Define macros so that compilers other than gcc can run the tests. */
21
46
  #undef __UNUSED__
@@ -63,8 +88,8 @@
63
88
 
64
89
  #endif
65
90
 
66
- /* MinGW kludge. */
67
- #if defined(_WIN64) | defined(_WIN32)
91
+ /* msvc kludge. */
92
+ #if defined(_MSC_VER)
68
93
  #define PRIdLL "I64d"
69
94
  #define PRIuLL "I64u"
70
95
  #else
@@ -74,6 +74,7 @@ int main (void)
74
74
  /* { dg-output "\n0: 2.0 : total: 2.0" } */
75
75
  printf("ffi: %.1f\n", resfp);
76
76
  /* { dg-output "\nffi: 2.0" } */
77
+ CHECK_DOUBLE_EQ(resfp, 2);
77
78
 
78
79
  /* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */
79
80
  /* Call it statically and then via ffi */
@@ -81,6 +82,7 @@ int main (void)
81
82
  /* { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" } */
82
83
  printf("compiled: %.1f\n", resfp);
83
84
  /* { dg-output "\ncompiled: 11.0" } */
85
+ CHECK_DOUBLE_EQ(resfp, 11);
84
86
 
85
87
  arg_types[0] = &ffi_type_uint;
86
88
  arg_types[1] = &ffi_type_double;
@@ -102,6 +104,7 @@ int main (void)
102
104
  /* { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" } */
103
105
  printf("ffi: %.1f\n", resfp);
104
106
  /* { dg-output "\nffi: 11.0" } */
107
+ CHECK_DOUBLE_EQ(resfp, 11);
105
108
 
106
109
  exit(0);
107
110
  }
@@ -9,6 +9,9 @@
9
9
  #include "ffitest.h"
10
10
  static long long return_ll(int ll0, long long ll1, int ll2)
11
11
  {
12
+ CHECK(ll0 == 11111111);
13
+ CHECK(ll1 == 11111111111000LL);
14
+ CHECK(ll2 == 11111111);
12
15
  return ll0 + ll1 + ll2;
13
16
  }
14
17
 
@@ -39,5 +42,7 @@ int main (void)
39
42
  ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
40
43
  printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2);
41
44
  /* { dg-output "res: 11111133333222, 11111133333222" } */
45
+ CHECK(rlonglong == 11111133333222);
46
+ CHECK(ll0 + ll1 + ll2 == 11111133333222);
42
47
  exit(0);
43
48
  }
@@ -8,6 +8,8 @@
8
8
  #include "ffitest.h"
9
9
  static long return_sl(long l1, long l2)
10
10
  {
11
+ CHECK(l1 == 1073741823L);
12
+ CHECK(l2 == 1073741824L);
11
13
  return l1 - l2;
12
14
  }
13
15
 
@@ -33,6 +35,8 @@ int main (void)
33
35
  ffi_call(&cif, FFI_FN(return_sl), &res, values);
34
36
  printf("res: %ld, %ld\n", (long)res, l1 - l2);
35
37
  /* { dg-output "res: -1, -1" } */
38
+ CHECK((long)res == -1);
39
+ CHECK(l1 + 1 == l2);
36
40
 
37
41
  exit(0);
38
42
  }
@@ -8,6 +8,8 @@
8
8
  #include "ffitest.h"
9
9
  static unsigned long return_ul(unsigned long ul1, unsigned long ul2)
10
10
  {
11
+ CHECK(ul1 == 1073741823L);
12
+ CHECK(ul2 == 1073741824L);
11
13
  return ul1 + ul2;
12
14
  }
13
15
 
@@ -33,6 +35,8 @@ int main (void)
33
35
  ffi_call(&cif, FFI_FN(return_ul), &res, values);
34
36
  printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2);
35
37
  /* { dg-output "res: 2147483647, 2147483647" } */
38
+ CHECK(res == 2147483647L);
39
+ CHECK(ul1 + ul2 == 2147483647L);
36
40
 
37
41
  exit(0);
38
42
  }
@@ -0,0 +1,60 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check structures.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ typedef struct
11
+ {
12
+ float f;
13
+ } s55;
14
+
15
+ static s55 ABI_ATTR f55(s55 ts, float f)
16
+ {
17
+ s55 r;
18
+ r.f = ts.f + f;
19
+ printf ("f55>> %g + %g = %g\n", ts.f, f, r.f);
20
+ return r;
21
+ }
22
+
23
+ int main (void)
24
+ {
25
+ ffi_cif cif;
26
+ s55 F, Fr;
27
+ float f;
28
+ void *values[] = { &F, &f };
29
+ ffi_type s55_type;
30
+ ffi_type *args[] = { &s55_type, &ffi_type_float };
31
+ ffi_type *s55_type_elements[] = { &ffi_type_float, NULL };
32
+
33
+ /* This is a hack to get a properly aligned result buffer */
34
+ s55 *s55_result =
35
+ (s55 *) malloc (sizeof(s55));
36
+
37
+ s55_type.size = 0;
38
+ s55_type.alignment = 0;
39
+ s55_type.type = FFI_TYPE_STRUCT;
40
+ s55_type.elements = s55_type_elements;
41
+
42
+ /* Initialize the cif */
43
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &s55_type, args) == FFI_OK);
44
+
45
+ F.f = 1;
46
+ Fr = f55(F, 2.14);
47
+ printf ("%g\n", Fr.f);
48
+
49
+ F.f = 1;
50
+ f = 2.14;
51
+ ffi_call(&cif, FFI_FN(f55), s55_result, values);
52
+ printf ("%g\n", s55_result->f);
53
+
54
+ fflush(0);
55
+
56
+ CHECK(fabs(Fr.f - s55_result->f) < FLT_EPSILON);
57
+
58
+ free (s55_result);
59
+ exit(0);
60
+ }
@@ -7,9 +7,9 @@
7
7
  /* { dg-do run } */
8
8
  #include "ffitest.h"
9
9
 
10
- static size_t ABI_ATTR my_strlen(char *s)
10
+ static unsigned int ABI_ATTR my_strlen(char *s)
11
11
  {
12
- return (strlen(s));
12
+ return (unsigned int) (strlen(s));
13
13
  }
14
14
 
15
15
  int main (void)
@@ -22,23 +22,22 @@ int main (void)
22
22
 
23
23
  args[0] = &ffi_type_pointer;
24
24
  values[0] = (void*) &s;
25
-
25
+
26
26
  /* Initialize the cif */
27
27
  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
28
- &ffi_type_sint, args) == FFI_OK);
29
-
28
+ &ffi_type_uint, args) == FFI_OK);
29
+
30
30
  s = "a";
31
31
  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
32
32
  CHECK(rint == 1);
33
-
33
+
34
34
  s = "1234567";
35
35
  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
36
36
  CHECK(rint == 7);
37
-
37
+
38
38
  s = "1234567890123456789012345";
39
39
  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
40
40
  CHECK(rint == 25);
41
-
41
+
42
42
  exit (0);
43
43
  }
44
-
@@ -8,9 +8,9 @@
8
8
 
9
9
  #include "ffitest.h"
10
10
 
11
- static size_t ABI_ATTR my_f(char *s, float a)
11
+ static int ABI_ATTR my_f(char *s, float a)
12
12
  {
13
- return (size_t) ((int) strlen(s) + (int) a);
13
+ return (int) strlen(s) + (int) a;
14
14
  }
15
15
 
16
16
  int main (void)
@@ -8,9 +8,9 @@
8
8
 
9
9
  #include "ffitest.h"
10
10
 
11
- static size_t ABI_ATTR my_f(float a, char *s)
11
+ static int ABI_ATTR my_f(float a, char *s)
12
12
  {
13
- return (size_t) ((int) strlen(s) + (int) a);
13
+ return (int) strlen(s) + (int) a;
14
14
  }
15
15
 
16
16
  int main (void)
@@ -8,9 +8,9 @@
8
8
 
9
9
  #include "ffitest.h"
10
10
 
11
- static size_t ABI_ATTR my_f(float a, char *s, int i)
11
+ static int ABI_ATTR my_f(float a, char *s, int i)
12
12
  {
13
- return (size_t) ((int) strlen(s) + (int) a + i);
13
+ return (int) strlen(s) + (int) a + i;
14
14
  }
15
15
 
16
16
  int main (void)
@@ -16,7 +16,7 @@ struct s {
16
16
  signed char s8;
17
17
  };
18
18
 
19
- struct s make_s(void) {
19
+ struct s ABI_ATTR make_s(void) {
20
20
  struct s r;
21
21
  r.s32 = 0x1234;
22
22
  r.f32 = 7.0;
@@ -0,0 +1,63 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check structures.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ typedef struct
11
+ {
12
+ unsigned int ui01;
13
+ unsigned int ui02;
14
+ } test_structure_1;
15
+
16
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
17
+ {
18
+ ts.ui02++;
19
+
20
+ return ts;
21
+ }
22
+
23
+ int main (void)
24
+ {
25
+ ffi_cif cif;
26
+ ffi_type *args[MAX_ARGS];
27
+ void *values[MAX_ARGS];
28
+ ffi_type ts1_type;
29
+ ffi_type *ts1_type_elements[3];
30
+
31
+ test_structure_1 ts1_arg;
32
+
33
+ /* This is a hack to get a properly aligned result buffer */
34
+ test_structure_1 *ts1_result =
35
+ (test_structure_1 *) malloc (sizeof(test_structure_1));
36
+
37
+ ts1_type.size = 0;
38
+ ts1_type.alignment = 0;
39
+ ts1_type.type = FFI_TYPE_STRUCT;
40
+ ts1_type.elements = ts1_type_elements;
41
+ ts1_type_elements[0] = &ffi_type_uint;
42
+ ts1_type_elements[1] = &ffi_type_uint;
43
+ ts1_type_elements[2] = NULL;
44
+
45
+ args[0] = &ts1_type;
46
+ values[0] = &ts1_arg;
47
+
48
+ /* Initialize the cif */
49
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
50
+ &ts1_type, args) == FFI_OK);
51
+
52
+ ts1_arg.ui02 = 555;
53
+
54
+ ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
55
+
56
+ CHECK(ts1_result->ui02 == 556);
57
+
58
+ /* This will fail if ffi_call isn't passing the struct by value. */
59
+ CHECK(ts1_arg.ui02 == 555);
60
+
61
+ free (ts1_result);
62
+ exit(0);
63
+ }
@@ -0,0 +1,65 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check structures.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ typedef struct
11
+ {
12
+ unsigned int ui01;
13
+ unsigned int ui02;
14
+ unsigned int ui03;
15
+ } test_structure_1;
16
+
17
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
18
+ {
19
+ ts.ui03++;
20
+
21
+ return ts;
22
+ }
23
+
24
+ int main (void)
25
+ {
26
+ ffi_cif cif;
27
+ ffi_type *args[MAX_ARGS];
28
+ void *values[MAX_ARGS];
29
+ ffi_type ts1_type;
30
+ ffi_type *ts1_type_elements[4];
31
+
32
+ test_structure_1 ts1_arg;
33
+
34
+ /* This is a hack to get a properly aligned result buffer */
35
+ test_structure_1 *ts1_result =
36
+ (test_structure_1 *) malloc (sizeof(test_structure_1));
37
+
38
+ ts1_type.size = 0;
39
+ ts1_type.alignment = 0;
40
+ ts1_type.type = FFI_TYPE_STRUCT;
41
+ ts1_type.elements = ts1_type_elements;
42
+ ts1_type_elements[0] = &ffi_type_uint;
43
+ ts1_type_elements[1] = &ffi_type_uint;
44
+ ts1_type_elements[2] = &ffi_type_uint;
45
+ ts1_type_elements[3] = NULL;
46
+
47
+ args[0] = &ts1_type;
48
+ values[0] = &ts1_arg;
49
+
50
+ /* Initialize the cif */
51
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
52
+ &ts1_type, args) == FFI_OK);
53
+
54
+ ts1_arg.ui03 = 555;
55
+
56
+ ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
57
+
58
+ CHECK(ts1_result->ui03 == 556);
59
+
60
+ /* This will fail if ffi_call isn't passing the struct by value. */
61
+ CHECK(ts1_arg.ui03 == 555);
62
+
63
+ free (ts1_result);
64
+ exit(0);
65
+ }