ffi 1.1.5 → 1.15.5

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