ffi 1.9.18 → 1.9.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (366) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/Rakefile +14 -3
  4. data/ext/ffi_c/AbstractMemory.c +6 -1
  5. data/ext/ffi_c/Platform.c +10 -2
  6. data/ext/ffi_c/extconf.rb +7 -2
  7. data/ext/ffi_c/libffi.bsd.mk +9 -3
  8. data/ext/ffi_c/libffi.darwin.mk +14 -4
  9. data/ext/ffi_c/libffi.gnu.mk +2 -1
  10. data/ext/ffi_c/libffi.mk +9 -4
  11. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  12. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  13. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  14. data/ext/ffi_c/libffi/LICENSE +1 -1
  15. data/ext/ffi_c/libffi/Makefile.am +166 -157
  16. data/ext/ffi_c/libffi/README +164 -52
  17. data/ext/ffi_c/libffi/acinclude.m4 +381 -0
  18. data/ext/ffi_c/libffi/autogen.sh +2 -0
  19. data/ext/ffi_c/libffi/configure.ac +148 -256
  20. data/ext/ffi_c/libffi/configure.host +265 -4
  21. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  22. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  23. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  24. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +207 -0
  25. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  26. data/ext/ffi_c/libffi/include/ffi.h.in +107 -50
  27. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  28. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  29. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  30. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  31. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +637 -0
  32. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  33. data/ext/ffi_c/libffi/libtool-version +1 -1
  34. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  35. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  36. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  37. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  38. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  39. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  40. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  41. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  42. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  43. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  44. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  45. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  46. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  47. data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
  48. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  49. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  50. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  51. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  52. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  53. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  54. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  55. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  56. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  57. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  58. data/ext/ffi_c/libffi/src/arm/ffi.c +597 -517
  59. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  60. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  61. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  62. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  63. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  64. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  65. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  66. data/ext/ffi_c/libffi/src/closures.c +319 -44
  67. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  68. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  69. data/ext/ffi_c/libffi/src/debug.c +6 -1
  70. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  71. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  72. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  73. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  74. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  75. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  76. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  77. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  78. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  79. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  80. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  81. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  82. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  83. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  84. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  85. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  86. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  87. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  88. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  89. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  90. data/ext/ffi_c/libffi/src/mips/ffi.c +95 -28
  91. data/ext/ffi_c/libffi/src/mips/ffitarget.h +9 -2
  92. data/ext/ffi_c/libffi/src/mips/n32.S +126 -56
  93. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  94. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  95. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  96. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  97. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  98. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  99. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  100. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  101. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  102. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  103. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  104. data/ext/ffi_c/libffi/src/powerpc/aix.S +6 -6
  105. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +3 -1
  106. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  107. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  108. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  109. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  110. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +25 -25
  111. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  112. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  113. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  114. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +100 -44
  115. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  116. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  117. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  118. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  119. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  120. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  121. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  122. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  123. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  124. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  125. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  126. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  127. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  128. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  129. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  130. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  131. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  132. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  133. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  134. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  135. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  136. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  137. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  138. data/ext/ffi_c/libffi/src/types.c +43 -14
  139. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  140. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  141. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  142. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  143. data/ext/ffi_c/libffi/src/x86/ffi.c +589 -500
  144. data/ext/ffi_c/libffi/src/x86/ffi64.c +338 -116
  145. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  146. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  147. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  148. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  149. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  150. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  151. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  152. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  153. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  154. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  155. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  156. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  157. data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -73
  158. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +120 -25
  159. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  262. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  263. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  284. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  315. data/ffi.gemspec +2 -2
  316. data/lib/ffi/enum.rb +124 -0
  317. data/lib/ffi/library.rb +65 -13
  318. data/lib/ffi/platform.rb +7 -2
  319. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  320. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  321. data/lib/ffi/pointer.rb +1 -0
  322. data/lib/ffi/struct.rb +0 -2
  323. data/lib/ffi/version.rb +1 -1
  324. data/spec/ffi/bitmask_spec.rb +575 -0
  325. data/spec/ffi/fixtures/BitmaskTest.c +51 -0
  326. data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
  327. data/spec/ffi/struct_spec.rb +0 -4
  328. metadata +143 -51
  329. data/ext/ffi_c/libffi/Makefile.in +0 -1820
  330. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  331. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  332. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  333. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  334. data/ext/ffi_c/libffi/compile +0 -143
  335. data/ext/ffi_c/libffi/config.guess +0 -1501
  336. data/ext/ffi_c/libffi/config.sub +0 -1705
  337. data/ext/ffi_c/libffi/configure +0 -17191
  338. data/ext/ffi_c/libffi/depcomp +0 -630
  339. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  340. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  341. data/ext/ffi_c/libffi/fficonfig.h.in +0 -199
  342. data/ext/ffi_c/libffi/include/Makefile.in +0 -487
  343. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  344. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  345. data/ext/ffi_c/libffi/install-sh +0 -520
  346. data/ext/ffi_c/libffi/ltmain.sh +0 -9636
  347. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  348. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  349. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  350. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  351. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  352. data/ext/ffi_c/libffi/man/Makefile.in +0 -466
  353. data/ext/ffi_c/libffi/mdate-sh +0 -201
  354. data/ext/ffi_c/libffi/missing +0 -376
  355. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  356. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  357. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  358. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  359. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  360. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  361. data/ext/ffi_c/libffi/testsuite/Makefile.in +0 -500
  362. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  365. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  366. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
@@ -1,468 +1,232 @@
1
1
  #define LIBFFI_ASM
2
2
  #include <fficonfig.h>
3
3
  #include <ffi.h>
4
-
5
- /* Constants for ffi_call_win64 */
6
- #define STACK 0
7
- #define PREP_ARGS_FN 32
8
- #define ECIF 40
9
- #define CIF_BYTES 48
10
- #define CIF_FLAGS 56
11
- #define RVALUE 64
12
- #define FN 72
4
+ #include <ffi_cfi.h>
5
+ #include "asmnames.h"
13
6
 
14
- /* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *),
15
- extended_cif *ecif, unsigned bytes, unsigned flags,
16
- unsigned *rvalue, void (*fn)());
17
- */
18
-
19
- #ifdef _MSC_VER
20
- PUBLIC ffi_call_win64
21
-
22
- EXTRN __chkstk:NEAR
23
- EXTRN ffi_closure_win64_inner:NEAR
24
-
25
- _TEXT SEGMENT
26
-
27
- ;;; ffi_closure_win64 will be called with these registers set:
28
- ;;; rax points to 'closure'
29
- ;;; r11 contains a bit mask that specifies which of the
30
- ;;; first four parameters are float or double
31
- ;;;
32
- ;;; It must move the parameters passed in registers to their stack location,
33
- ;;; call ffi_closure_win64_inner for the actual work, then return the result.
34
- ;;;
35
- ffi_closure_win64 PROC FRAME
36
- ;; copy register arguments onto stack
37
- test r11, 1
38
- jne first_is_float
39
- mov QWORD PTR [rsp+8], rcx
40
- jmp second
41
- first_is_float:
42
- movlpd QWORD PTR [rsp+8], xmm0
43
-
44
- second:
45
- test r11, 2
46
- jne second_is_float
47
- mov QWORD PTR [rsp+16], rdx
48
- jmp third
49
- second_is_float:
50
- movlpd QWORD PTR [rsp+16], xmm1
51
-
52
- third:
53
- test r11, 4
54
- jne third_is_float
55
- mov QWORD PTR [rsp+24], r8
56
- jmp fourth
57
- third_is_float:
58
- movlpd QWORD PTR [rsp+24], xmm2
59
-
60
- fourth:
61
- test r11, 8
62
- jne fourth_is_float
63
- mov QWORD PTR [rsp+32], r9
64
- jmp done
65
- fourth_is_float:
66
- movlpd QWORD PTR [rsp+32], xmm3
67
-
68
- done:
69
- .ALLOCSTACK 40
70
- sub rsp, 40
71
- .ENDPROLOG
72
- mov rcx, rax ; context is first parameter
73
- mov rdx, rsp ; stack is second parameter
74
- add rdx, 48 ; point to start of arguments
75
- mov rax, ffi_closure_win64_inner
76
- call rax ; call the real closure function
77
- add rsp, 40
78
- movd xmm0, rax ; If the closure returned a float,
79
- ; ffi_closure_win64_inner wrote it to rax
80
- ret 0
81
- ffi_closure_win64 ENDP
82
-
83
- ffi_call_win64 PROC FRAME
84
- ;; copy registers onto stack
85
- mov QWORD PTR [rsp+32], r9
86
- mov QWORD PTR [rsp+24], r8
87
- mov QWORD PTR [rsp+16], rdx
88
- mov QWORD PTR [rsp+8], rcx
89
- .PUSHREG rbp
90
- push rbp
91
- .ALLOCSTACK 48
92
- sub rsp, 48 ; 00000030H
93
- .SETFRAME rbp, 32
94
- lea rbp, QWORD PTR [rsp+32]
95
- .ENDPROLOG
96
-
97
- mov eax, DWORD PTR CIF_BYTES[rbp]
98
- add rax, 15
99
- and rax, -16
100
- call __chkstk
101
- sub rsp, rax
102
- lea rax, QWORD PTR [rsp+32]
103
- mov QWORD PTR STACK[rbp], rax
104
-
105
- mov rdx, QWORD PTR ECIF[rbp]
106
- mov rcx, QWORD PTR STACK[rbp]
107
- call QWORD PTR PREP_ARGS_FN[rbp]
108
-
109
- mov rsp, QWORD PTR STACK[rbp]
110
-
111
- movlpd xmm3, QWORD PTR [rsp+24]
112
- movd r9, xmm3
113
-
114
- movlpd xmm2, QWORD PTR [rsp+16]
115
- movd r8, xmm2
116
-
117
- movlpd xmm1, QWORD PTR [rsp+8]
118
- movd rdx, xmm1
119
-
120
- movlpd xmm0, QWORD PTR [rsp]
121
- movd rcx, xmm0
122
-
123
- call QWORD PTR FN[rbp]
124
- ret_struct4b$:
125
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B
126
- jne ret_struct2b$
127
-
128
- mov rcx, QWORD PTR RVALUE[rbp]
129
- mov DWORD PTR [rcx], eax
130
- jmp ret_void$
131
-
132
- ret_struct2b$:
133
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B
134
- jne ret_struct1b$
135
-
136
- mov rcx, QWORD PTR RVALUE[rbp]
137
- mov WORD PTR [rcx], ax
138
- jmp ret_void$
139
-
140
- ret_struct1b$:
141
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B
142
- jne ret_uint8$
143
-
144
- mov rcx, QWORD PTR RVALUE[rbp]
145
- mov BYTE PTR [rcx], al
146
- jmp ret_void$
147
-
148
- ret_uint8$:
149
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8
150
- jne ret_sint8$
151
-
152
- mov rcx, QWORD PTR RVALUE[rbp]
153
- movzx rax, al
154
- mov QWORD PTR [rcx], rax
155
- jmp ret_void$
156
-
157
- ret_sint8$:
158
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8
159
- jne ret_uint16$
160
-
161
- mov rcx, QWORD PTR RVALUE[rbp]
162
- movsx rax, al
163
- mov QWORD PTR [rcx], rax
164
- jmp ret_void$
165
-
166
- ret_uint16$:
167
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16
168
- jne ret_sint16$
169
-
170
- mov rcx, QWORD PTR RVALUE[rbp]
171
- movzx rax, ax
172
- mov QWORD PTR [rcx], rax
173
- jmp SHORT ret_void$
174
-
175
- ret_sint16$:
176
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16
177
- jne ret_uint32$
178
-
179
- mov rcx, QWORD PTR RVALUE[rbp]
180
- movsx rax, ax
181
- mov QWORD PTR [rcx], rax
182
- jmp SHORT ret_void$
183
-
184
- ret_uint32$:
185
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32
186
- jne ret_sint32$
187
-
188
- mov rcx, QWORD PTR RVALUE[rbp]
189
- mov eax, eax
190
- mov QWORD PTR [rcx], rax
191
- jmp SHORT ret_void$
192
-
193
- ret_sint32$:
194
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32
195
- jne ret_float$
196
-
197
- mov rcx, QWORD PTR RVALUE[rbp]
198
- cdqe
199
- mov QWORD PTR [rcx], rax
200
- jmp SHORT ret_void$
201
-
202
- ret_float$:
203
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT
204
- jne SHORT ret_double$
205
-
206
- mov rax, QWORD PTR RVALUE[rbp]
207
- movss DWORD PTR [rax], xmm0
208
- jmp SHORT ret_void$
209
-
210
- ret_double$:
211
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE
212
- jne SHORT ret_sint64$
213
-
214
- mov rax, QWORD PTR RVALUE[rbp]
215
- movlpd QWORD PTR [rax], xmm0
216
- jmp SHORT ret_void$
217
-
218
- ret_sint64$:
219
- cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64
220
- jne ret_void$
221
-
222
- mov rcx, QWORD PTR RVALUE[rbp]
223
- mov QWORD PTR [rcx], rax
224
- jmp SHORT ret_void$
225
-
226
- ret_void$:
227
- xor rax, rax
228
-
229
- lea rsp, QWORD PTR [rbp+16]
230
- pop rbp
231
- ret 0
232
- ffi_call_win64 ENDP
233
- _TEXT ENDS
234
- END
7
+ #if defined(HAVE_AS_CFI_PSEUDO_OP)
8
+ .cfi_sections .debug_frame
9
+ #endif
235
10
 
11
+ #ifdef X86_WIN64
12
+ #define SEH(...) __VA_ARGS__
13
+ #define arg0 %rcx
14
+ #define arg1 %rdx
15
+ #define arg2 %r8
16
+ #define arg3 %r9
236
17
  #else
18
+ #define SEH(...)
19
+ #define arg0 %rdi
20
+ #define arg1 %rsi
21
+ #define arg2 %rdx
22
+ #define arg3 %rcx
23
+ #endif
237
24
 
238
- #ifdef SYMBOL_UNDERSCORE
239
- #define SYMBOL_NAME(name) _##name
25
+ /* This macro allows the safe creation of jump tables without an
26
+ actual table. The entry points into the table are all 8 bytes.
27
+ The use of ORG asserts that we're at the correct location. */
28
+ /* ??? The clang assembler doesn't handle .org with symbolic expressions. */
29
+ #if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
30
+ # define E(BASE, X) .balign 8
240
31
  #else
241
- #define SYMBOL_NAME(name) name
32
+ # define E(BASE, X) .balign 8; .org BASE + X * 8
242
33
  #endif
243
34
 
244
- .text
245
-
246
- .extern SYMBOL_NAME(ffi_closure_win64_inner)
247
-
248
- # ffi_closure_win64 will be called with these registers set:
249
- # rax points to 'closure'
250
- # r11 contains a bit mask that specifies which of the
251
- # first four parameters are float or double
252
- #
253
- # It must move the parameters passed in registers to their stack location,
254
- # call ffi_closure_win64_inner for the actual work, then return the result.
255
- #
256
- .balign 16
257
- .globl SYMBOL_NAME(ffi_closure_win64)
258
- SYMBOL_NAME(ffi_closure_win64):
259
- # copy register arguments onto stack
260
- test $1,%r11
261
- jne .Lfirst_is_float
262
- mov %rcx, 8(%rsp)
263
- jmp .Lsecond
264
- .Lfirst_is_float:
265
- movlpd %xmm0, 8(%rsp)
266
-
267
- .Lsecond:
268
- test $2, %r11
269
- jne .Lsecond_is_float
270
- mov %rdx, 16(%rsp)
271
- jmp .Lthird
272
- .Lsecond_is_float:
273
- movlpd %xmm1, 16(%rsp)
274
-
275
- .Lthird:
276
- test $4, %r11
277
- jne .Lthird_is_float
278
- mov %r8,24(%rsp)
279
- jmp .Lfourth
280
- .Lthird_is_float:
281
- movlpd %xmm2, 24(%rsp)
282
-
283
- .Lfourth:
284
- test $8, %r11
285
- jne .Lfourth_is_float
286
- mov %r9, 32(%rsp)
287
- jmp .Ldone
288
- .Lfourth_is_float:
289
- movlpd %xmm3, 32(%rsp)
290
-
291
- .Ldone:
292
- #.ALLOCSTACK 40
293
- sub $40, %rsp
294
- #.ENDPROLOG
295
- mov %rax, %rcx # context is first parameter
296
- mov %rsp, %rdx # stack is second parameter
297
- add $48, %rdx # point to start of arguments
298
- mov $SYMBOL_NAME(ffi_closure_win64_inner), %rax
299
- callq *%rax # call the real closure function
300
- add $40, %rsp
301
- movq %rax, %xmm0 # If the closure returned a float,
302
- # ffi_closure_win64_inner wrote it to rax
303
- retq
304
- .ffi_closure_win64_end:
305
-
306
- .balign 16
307
- .globl SYMBOL_NAME(ffi_call_win64)
308
- SYMBOL_NAME(ffi_call_win64):
309
- # copy registers onto stack
310
- mov %r9,32(%rsp)
311
- mov %r8,24(%rsp)
312
- mov %rdx,16(%rsp)
313
- mov %rcx,8(%rsp)
314
- #.PUSHREG rbp
315
- push %rbp
316
- #.ALLOCSTACK 48
317
- sub $48,%rsp
318
- #.SETFRAME rbp, 32
319
- lea 32(%rsp),%rbp
320
- #.ENDPROLOG
321
-
322
- mov CIF_BYTES(%rbp),%eax
323
- add $15, %rax
324
- and $-16, %rax
325
- cmpq $0x1000, %rax
326
- jb Lch_done
327
- Lch_probe:
328
- subq $0x1000,%rsp
329
- orl $0x0, (%rsp)
330
- subq $0x1000,%rax
331
- cmpq $0x1000,%rax
332
- ja Lch_probe
333
- Lch_done:
334
- subq %rax, %rsp
335
- orl $0x0, (%rsp)
336
- lea 32(%rsp), %rax
337
- mov %rax, STACK(%rbp)
338
-
339
- mov ECIF(%rbp), %rdx
340
- mov STACK(%rbp), %rcx
341
- callq *PREP_ARGS_FN(%rbp)
342
-
343
- mov STACK(%rbp), %rsp
344
-
345
- movlpd 24(%rsp), %xmm3
346
- movd %xmm3, %r9
347
-
348
- movlpd 16(%rsp), %xmm2
349
- movd %xmm2, %r8
350
-
351
- movlpd 8(%rsp), %xmm1
352
- movd %xmm1, %rdx
353
-
354
- movlpd (%rsp), %xmm0
355
- movd %xmm0, %rcx
356
-
357
- callq *FN(%rbp)
358
- .Lret_struct4b:
359
- cmpl $FFI_TYPE_SMALL_STRUCT_4B, CIF_FLAGS(%rbp)
360
- jne .Lret_struct2b
361
-
362
- mov RVALUE(%rbp), %rcx
363
- mov %eax, (%rcx)
364
- jmp .Lret_void
365
-
366
- .Lret_struct2b:
367
- cmpl $FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp)
368
- jne .Lret_struct1b
369
-
370
- mov RVALUE(%rbp), %rcx
371
- mov %ax, (%rcx)
372
- jmp .Lret_void
373
-
374
- .Lret_struct1b:
375
- cmpl $FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp)
376
- jne .Lret_uint8
377
-
378
- mov RVALUE(%rbp), %rcx
379
- mov %al, (%rcx)
380
- jmp .Lret_void
381
-
382
- .Lret_uint8:
383
- cmpl $FFI_TYPE_UINT8, CIF_FLAGS(%rbp)
384
- jne .Lret_sint8
385
-
386
- mov RVALUE(%rbp), %rcx
387
- movzbq %al, %rax
388
- movq %rax, (%rcx)
389
- jmp .Lret_void
390
-
391
- .Lret_sint8:
392
- cmpl $FFI_TYPE_SINT8, CIF_FLAGS(%rbp)
393
- jne .Lret_uint16
394
-
395
- mov RVALUE(%rbp), %rcx
396
- movsbq %al, %rax
397
- movq %rax, (%rcx)
398
- jmp .Lret_void
399
-
400
- .Lret_uint16:
401
- cmpl $FFI_TYPE_UINT16, CIF_FLAGS(%rbp)
402
- jne .Lret_sint16
403
-
404
- mov RVALUE(%rbp), %rcx
405
- movzwq %ax, %rax
406
- movq %rax, (%rcx)
407
- jmp .Lret_void
408
-
409
- .Lret_sint16:
410
- cmpl $FFI_TYPE_SINT16, CIF_FLAGS(%rbp)
411
- jne .Lret_uint32
412
-
413
- mov RVALUE(%rbp), %rcx
414
- movswq %ax, %rax
415
- movq %rax, (%rcx)
416
- jmp .Lret_void
417
-
418
- .Lret_uint32:
419
- cmpl $FFI_TYPE_UINT32, CIF_FLAGS(%rbp)
420
- jne .Lret_sint32
421
-
422
- mov RVALUE(%rbp), %rcx
423
- movl %eax, %eax
424
- movq %rax, (%rcx)
425
- jmp .Lret_void
426
-
427
- .Lret_sint32:
428
- cmpl $FFI_TYPE_SINT32, CIF_FLAGS(%rbp)
429
- jne .Lret_float
430
-
431
- mov RVALUE(%rbp), %rcx
432
- cltq
433
- movq %rax, (%rcx)
434
- jmp .Lret_void
435
-
436
- .Lret_float:
437
- cmpl $FFI_TYPE_FLOAT, CIF_FLAGS(%rbp)
438
- jne .Lret_double
439
-
440
- mov RVALUE(%rbp), %rax
441
- movss %xmm0, (%rax)
442
- jmp .Lret_void
443
-
444
- .Lret_double:
445
- cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp)
446
- jne .Lret_sint64
447
-
448
- mov RVALUE(%rbp), %rax
449
- movlpd %xmm0, (%rax)
450
- jmp .Lret_void
451
-
452
- .Lret_sint64:
453
- cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp)
454
- jne .Lret_void
455
-
456
- mov RVALUE(%rbp), %rcx
457
- mov %rax, (%rcx)
458
- jmp .Lret_void
459
-
460
- .Lret_void:
461
- xor %rax, %rax
462
-
463
- lea 16(%rbp), %rsp
464
- pop %rbp
465
- retq
466
- .ffi_call_win64_end:
467
- #endif /* !_MSC_VER */
468
-
35
+ .text
36
+
37
+ /* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10)
38
+
39
+ Bit o trickiness here -- FRAME is the base of the stack frame
40
+ for this function. This has been allocated by ffi_call. We also
41
+ deallocate some of the stack that has been alloca'd. */
42
+
43
+ .align 8
44
+ .globl C(ffi_call_win64)
45
+
46
+ SEH(.seh_proc ffi_call_win64)
47
+ C(ffi_call_win64):
48
+ cfi_startproc
49
+ /* Set up the local stack frame and install it in rbp/rsp. */
50
+ movq (%rsp), %rax
51
+ movq %rbp, (arg1)
52
+ movq %rax, 8(arg1)
53
+ movq arg1, %rbp
54
+ cfi_def_cfa(%rbp, 16)
55
+ cfi_rel_offset(%rbp, 0)
56
+ SEH(.seh_pushreg %rbp)
57
+ SEH(.seh_setframe %rbp, 0)
58
+ SEH(.seh_endprologue)
59
+ movq arg0, %rsp
60
+
61
+ movq arg2, %r10
62
+
63
+ /* Load all slots into both general and xmm registers. */
64
+ movq (%rsp), %rcx
65
+ movsd (%rsp), %xmm0
66
+ movq 8(%rsp), %rdx
67
+ movsd 8(%rsp), %xmm1
68
+ movq 16(%rsp), %r8
69
+ movsd 16(%rsp), %xmm2
70
+ movq 24(%rsp), %r9
71
+ movsd 24(%rsp), %xmm3
72
+
73
+ call *16(%rbp)
74
+
75
+ movl 24(%rbp), %ecx
76
+ movq 32(%rbp), %r8
77
+ leaq 0f(%rip), %r10
78
+ cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx
79
+ leaq (%r10, %rcx, 8), %r10
80
+ ja 99f
81
+ jmp *%r10
82
+
83
+ /* Below, we're space constrained most of the time. Thus we eschew the
84
+ modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */
85
+ .macro epilogue
86
+ leaveq
87
+ cfi_remember_state
88
+ cfi_def_cfa(%rsp, 8)
89
+ cfi_restore(%rbp)
90
+ ret
91
+ cfi_restore_state
92
+ .endm
93
+
94
+ .align 8
95
+ 0:
96
+ E(0b, FFI_TYPE_VOID)
97
+ epilogue
98
+ E(0b, FFI_TYPE_INT)
99
+ movslq %eax, %rax
100
+ movq %rax, (%r8)
101
+ epilogue
102
+ E(0b, FFI_TYPE_FLOAT)
103
+ movss %xmm0, (%r8)
104
+ epilogue
105
+ E(0b, FFI_TYPE_DOUBLE)
106
+ movsd %xmm0, (%r8)
107
+ epilogue
108
+ E(0b, FFI_TYPE_LONGDOUBLE)
109
+ call PLT(C(abort))
110
+ E(0b, FFI_TYPE_UINT8)
111
+ movzbl %al, %eax
112
+ movq %rax, (%r8)
113
+ epilogue
114
+ E(0b, FFI_TYPE_SINT8)
115
+ movsbq %al, %rax
116
+ jmp 98f
117
+ E(0b, FFI_TYPE_UINT16)
118
+ movzwl %ax, %eax
119
+ movq %rax, (%r8)
120
+ epilogue
121
+ E(0b, FFI_TYPE_SINT16)
122
+ movswq %ax, %rax
123
+ jmp 98f
124
+ E(0b, FFI_TYPE_UINT32)
125
+ movl %eax, %eax
126
+ movq %rax, (%r8)
127
+ epilogue
128
+ E(0b, FFI_TYPE_SINT32)
129
+ movslq %eax, %rax
130
+ movq %rax, (%r8)
131
+ epilogue
132
+ E(0b, FFI_TYPE_UINT64)
133
+ 98: movq %rax, (%r8)
134
+ epilogue
135
+ E(0b, FFI_TYPE_SINT64)
136
+ movq %rax, (%r8)
137
+ epilogue
138
+ E(0b, FFI_TYPE_STRUCT)
139
+ epilogue
140
+ E(0b, FFI_TYPE_POINTER)
141
+ movq %rax, (%r8)
142
+ epilogue
143
+ E(0b, FFI_TYPE_COMPLEX)
144
+ call PLT(C(abort))
145
+ E(0b, FFI_TYPE_SMALL_STRUCT_1B)
146
+ movb %al, (%r8)
147
+ epilogue
148
+ E(0b, FFI_TYPE_SMALL_STRUCT_2B)
149
+ movw %ax, (%r8)
150
+ epilogue
151
+ E(0b, FFI_TYPE_SMALL_STRUCT_4B)
152
+ movl %eax, (%r8)
153
+ epilogue
154
+
155
+ .align 8
156
+ 99: call PLT(C(abort))
157
+
158
+ epilogue
159
+
160
+ cfi_endproc
161
+ SEH(.seh_endproc)
162
+
163
+
164
+ /* 32 bytes of outgoing register stack space, 8 bytes of alignment,
165
+ 16 bytes of result, 32 bytes of xmm registers. */
166
+ #define ffi_clo_FS (32+8+16+32)
167
+ #define ffi_clo_OFF_R (32+8)
168
+ #define ffi_clo_OFF_X (32+8+16)
169
+
170
+ .align 8
171
+ .globl C(ffi_go_closure_win64)
172
+
173
+ SEH(.seh_proc ffi_go_closure_win64)
174
+ C(ffi_go_closure_win64):
175
+ cfi_startproc
176
+ /* Save all integer arguments into the incoming reg stack space. */
177
+ movq %rcx, 8(%rsp)
178
+ movq %rdx, 16(%rsp)
179
+ movq %r8, 24(%rsp)
180
+ movq %r9, 32(%rsp)
181
+
182
+ movq 8(%r10), %rcx /* load cif */
183
+ movq 16(%r10), %rdx /* load fun */
184
+ movq %r10, %r8 /* closure is user_data */
185
+ jmp 0f
186
+ cfi_endproc
187
+ SEH(.seh_endproc)
188
+
189
+ .align 8
190
+ .globl C(ffi_closure_win64)
191
+
192
+ SEH(.seh_proc ffi_closure_win64)
193
+ C(ffi_closure_win64):
194
+ cfi_startproc
195
+ /* Save all integer arguments into the incoming reg stack space. */
196
+ movq %rcx, 8(%rsp)
197
+ movq %rdx, 16(%rsp)
198
+ movq %r8, 24(%rsp)
199
+ movq %r9, 32(%rsp)
200
+
201
+ movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */
202
+ movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */
203
+ movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */
204
+ 0:
205
+ subq $ffi_clo_FS, %rsp
206
+ cfi_adjust_cfa_offset(ffi_clo_FS)
207
+ SEH(.seh_stackalloc ffi_clo_FS)
208
+ SEH(.seh_endprologue)
209
+
210
+ /* Save all sse arguments into the stack frame. */
211
+ movsd %xmm0, ffi_clo_OFF_X(%rsp)
212
+ movsd %xmm1, ffi_clo_OFF_X+8(%rsp)
213
+ movsd %xmm2, ffi_clo_OFF_X+16(%rsp)
214
+ movsd %xmm3, ffi_clo_OFF_X+24(%rsp)
215
+
216
+ leaq ffi_clo_OFF_R(%rsp), %r9
217
+ call C(ffi_closure_win64_inner)
218
+
219
+ /* Load the result into both possible result registers. */
220
+ movq ffi_clo_OFF_R(%rsp), %rax
221
+ movsd ffi_clo_OFF_R(%rsp), %xmm0
222
+
223
+ addq $ffi_clo_FS, %rsp
224
+ cfi_adjust_cfa_offset(-ffi_clo_FS)
225
+ ret
226
+
227
+ cfi_endproc
228
+ SEH(.seh_endproc)
229
+
230
+ #if defined __ELF__ && defined __linux__
231
+ .section .note.GNU-stack,"",@progbits
232
+ #endif