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,6 +1,7 @@
1
1
  /* -----------------------------------------------------------------------
2
- unix64.S - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
3
- Copyright (c) 2008 Red Hat, Inc
2
+ unix64.S - Copyright (c) 2013 The Written Word, Inc.
3
+ - Copyright (c) 2008 Red Hat, Inc
4
+ - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
4
5
 
5
6
  x86-64 Foreign Function Interface
6
7
 
@@ -29,8 +30,20 @@
29
30
  #define LIBFFI_ASM
30
31
  #include <fficonfig.h>
31
32
  #include <ffi.h>
33
+ #include "internal64.h"
34
+ #include "asmnames.h"
32
35
 
33
- .text
36
+ .text
37
+
38
+ /* This macro allows the safe creation of jump tables without an
39
+ actual table. The entry points into the table are all 8 bytes.
40
+ The use of ORG asserts that we're at the correct location. */
41
+ /* ??? The clang assembler doesn't handle .org with symbolic expressions. */
42
+ #if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
43
+ # define E(BASE, X) .balign 8
44
+ #else
45
+ # define E(BASE, X) .balign 8; .org BASE + X * 8
46
+ #endif
34
47
 
35
48
  /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
36
49
  void *raddr, void (*fnaddr)(void));
@@ -39,12 +52,12 @@
39
52
  for this function. This has been allocated by ffi_call. We also
40
53
  deallocate some of the stack that has been alloca'd. */
41
54
 
42
- .align 2
43
- .globl ffi_call_unix64
44
- .type ffi_call_unix64,@function
55
+ .balign 8
56
+ .globl C(ffi_call_unix64)
57
+ FFI_HIDDEN(C(ffi_call_unix64))
45
58
 
46
- ffi_call_unix64:
47
- .LUW0:
59
+ C(ffi_call_unix64):
60
+ L(UW0):
48
61
  movq (%rsp), %r10 /* Load return address. */
49
62
  leaq (%rdi, %rsi), %rax /* Find local stack base. */
50
63
  movq %rdx, (%rax) /* Save flags. */
@@ -52,24 +65,37 @@ ffi_call_unix64:
52
65
  movq %rbp, 16(%rax) /* Save old frame pointer. */
53
66
  movq %r10, 24(%rax) /* Relocate return address. */
54
67
  movq %rax, %rbp /* Finalize local stack frame. */
55
- .LUW1:
68
+
69
+ /* New stack frame based off rbp. This is a itty bit of unwind
70
+ trickery in that the CFA *has* changed. There is no easy way
71
+ to describe it correctly on entry to the function. Fortunately,
72
+ it doesn't matter too much since at all points we can correctly
73
+ unwind back to ffi_call. Note that the location to which we
74
+ moved the return address is (the new) CFA-8, so from the
75
+ perspective of the unwind info, it hasn't moved. */
76
+ L(UW1):
77
+ /* cfi_def_cfa(%rbp, 32) */
78
+ /* cfi_rel_offset(%rbp, 16) */
79
+
56
80
  movq %rdi, %r10 /* Save a copy of the register area. */
57
81
  movq %r8, %r11 /* Save a copy of the target fn. */
58
82
  movl %r9d, %eax /* Set number of SSE registers. */
59
83
 
60
84
  /* Load up all argument registers. */
61
85
  movq (%r10), %rdi
62
- movq 8(%r10), %rsi
63
- movq 16(%r10), %rdx
64
- movq 24(%r10), %rcx
65
- movq 32(%r10), %r8
66
- movq 40(%r10), %r9
86
+ movq 0x08(%r10), %rsi
87
+ movq 0x10(%r10), %rdx
88
+ movq 0x18(%r10), %rcx
89
+ movq 0x20(%r10), %r8
90
+ movq 0x28(%r10), %r9
91
+ movl 0xb0(%r10), %eax
67
92
  testl %eax, %eax
68
- jnz .Lload_sse
69
- .Lret_from_load_sse:
93
+ jnz L(load_sse)
94
+ L(ret_from_load_sse):
70
95
 
71
- /* Deallocate the reg arg area. */
72
- leaq 176(%r10), %rsp
96
+ /* Deallocate the reg arg area, except for r10, then load via pop. */
97
+ leaq 0xb8(%r10), %rsp
98
+ popq %r10
73
99
 
74
100
  /* Call the user function. */
75
101
  call *%r11
@@ -80,347 +106,420 @@ ffi_call_unix64:
80
106
  movq 0(%rbp), %rcx /* Reload flags. */
81
107
  movq 8(%rbp), %rdi /* Reload raddr. */
82
108
  movq 16(%rbp), %rbp /* Reload old frame pointer. */
83
- .LUW2:
109
+ L(UW2):
110
+ /* cfi_remember_state */
111
+ /* cfi_def_cfa(%rsp, 8) */
112
+ /* cfi_restore(%rbp) */
84
113
 
85
114
  /* The first byte of the flags contains the FFI_TYPE. */
115
+ cmpb $UNIX64_RET_LAST, %cl
86
116
  movzbl %cl, %r10d
87
- leaq .Lstore_table(%rip), %r11
88
- movslq (%r11, %r10, 4), %r10
89
- addq %r11, %r10
117
+ leaq L(store_table)(%rip), %r11
118
+ ja L(sa)
119
+ leaq (%r11, %r10, 8), %r10
120
+
121
+ /* Prep for the structure cases: scratch area in redzone. */
122
+ leaq -20(%rsp), %rsi
90
123
  jmp *%r10
91
124
 
92
- .Lstore_table:
93
- .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */
94
- .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */
95
- .long .Lst_float-.Lstore_table /* FFI_TYPE_FLOAT */
96
- .long .Lst_double-.Lstore_table /* FFI_TYPE_DOUBLE */
97
- .long .Lst_ldouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */
98
- .long .Lst_uint8-.Lstore_table /* FFI_TYPE_UINT8 */
99
- .long .Lst_sint8-.Lstore_table /* FFI_TYPE_SINT8 */
100
- .long .Lst_uint16-.Lstore_table /* FFI_TYPE_UINT16 */
101
- .long .Lst_sint16-.Lstore_table /* FFI_TYPE_SINT16 */
102
- .long .Lst_uint32-.Lstore_table /* FFI_TYPE_UINT32 */
103
- .long .Lst_sint32-.Lstore_table /* FFI_TYPE_SINT32 */
104
- .long .Lst_int64-.Lstore_table /* FFI_TYPE_UINT64 */
105
- .long .Lst_int64-.Lstore_table /* FFI_TYPE_SINT64 */
106
- .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */
107
- .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */
108
-
109
- .align 2
110
- .Lst_void:
125
+ .balign 8
126
+ L(store_table):
127
+ E(L(store_table), UNIX64_RET_VOID)
111
128
  ret
112
- .align 2
113
-
114
- .Lst_uint8:
115
- movzbq %al, %rax
129
+ E(L(store_table), UNIX64_RET_UINT8)
130
+ movzbl %al, %eax
116
131
  movq %rax, (%rdi)
117
132
  ret
118
- .align 2
119
- .Lst_sint8:
120
- movsbq %al, %rax
133
+ E(L(store_table), UNIX64_RET_UINT16)
134
+ movzwl %ax, %eax
121
135
  movq %rax, (%rdi)
122
136
  ret
123
- .align 2
124
- .Lst_uint16:
125
- movzwq %ax, %rax
137
+ E(L(store_table), UNIX64_RET_UINT32)
138
+ movl %eax, %eax
126
139
  movq %rax, (%rdi)
127
- .align 2
128
- .Lst_sint16:
129
- movswq %ax, %rax
140
+ ret
141
+ E(L(store_table), UNIX64_RET_SINT8)
142
+ movsbq %al, %rax
130
143
  movq %rax, (%rdi)
131
144
  ret
132
- .align 2
133
- .Lst_uint32:
134
- movl %eax, %eax
145
+ E(L(store_table), UNIX64_RET_SINT16)
146
+ movswq %ax, %rax
135
147
  movq %rax, (%rdi)
136
- .align 2
137
- .Lst_sint32:
148
+ ret
149
+ E(L(store_table), UNIX64_RET_SINT32)
138
150
  cltq
139
151
  movq %rax, (%rdi)
140
152
  ret
141
- .align 2
142
- .Lst_int64:
153
+ E(L(store_table), UNIX64_RET_INT64)
143
154
  movq %rax, (%rdi)
144
155
  ret
145
-
146
- .align 2
147
- .Lst_float:
148
- movss %xmm0, (%rdi)
156
+ E(L(store_table), UNIX64_RET_XMM32)
157
+ movd %xmm0, (%rdi)
149
158
  ret
150
- .align 2
151
- .Lst_double:
152
- movsd %xmm0, (%rdi)
159
+ E(L(store_table), UNIX64_RET_XMM64)
160
+ movq %xmm0, (%rdi)
153
161
  ret
154
- .Lst_ldouble:
162
+ E(L(store_table), UNIX64_RET_X87)
155
163
  fstpt (%rdi)
156
164
  ret
157
-
158
- .align 2
159
- .Lst_struct:
160
- leaq -20(%rsp), %rsi /* Scratch area in redzone. */
161
-
162
- /* We have to locate the values now, and since we don't want to
163
- write too much data into the user's return value, we spill the
164
- value to a 16 byte scratch area first. Bits 8, 9, and 10
165
- control where the values are located. Only one of the three
166
- bits will be set; see ffi_prep_cif_machdep for the pattern. */
167
- movd %xmm0, %r10
168
- movd %xmm1, %r11
169
- testl $0x100, %ecx
170
- cmovnz %rax, %rdx
171
- cmovnz %r10, %rax
172
- testl $0x200, %ecx
173
- cmovnz %r10, %rdx
174
- testl $0x400, %ecx
175
- cmovnz %r10, %rax
176
- cmovnz %r11, %rdx
177
- movq %rax, (%rsi)
165
+ E(L(store_table), UNIX64_RET_X87_2)
166
+ fstpt (%rdi)
167
+ fstpt 16(%rdi)
168
+ ret
169
+ E(L(store_table), UNIX64_RET_ST_XMM0_RAX)
170
+ movq %rax, 8(%rsi)
171
+ jmp L(s3)
172
+ E(L(store_table), UNIX64_RET_ST_RAX_XMM0)
173
+ movq %xmm0, 8(%rsi)
174
+ jmp L(s2)
175
+ E(L(store_table), UNIX64_RET_ST_XMM0_XMM1)
176
+ movq %xmm1, 8(%rsi)
177
+ jmp L(s3)
178
+ E(L(store_table), UNIX64_RET_ST_RAX_RDX)
178
179
  movq %rdx, 8(%rsi)
179
-
180
- /* Bits 12-31 contain the true size of the structure. Copy from
181
- the scratch area to the true destination. */
182
- shrl $12, %ecx
180
+ L(s2):
181
+ movq %rax, (%rsi)
182
+ shrl $UNIX64_SIZE_SHIFT, %ecx
183
183
  rep movsb
184
184
  ret
185
+ .balign 8
186
+ L(s3):
187
+ movq %xmm0, (%rsi)
188
+ shrl $UNIX64_SIZE_SHIFT, %ecx
189
+ rep movsb
190
+ ret
191
+
192
+ L(sa): call PLT(C(abort))
185
193
 
186
194
  /* Many times we can avoid loading any SSE registers at all.
187
195
  It's not worth an indirect jump to load the exact set of
188
196
  SSE registers needed; zero or all is a good compromise. */
189
- .align 2
190
- .LUW3:
191
- .Lload_sse:
192
- movdqa 48(%r10), %xmm0
193
- movdqa 64(%r10), %xmm1
194
- movdqa 80(%r10), %xmm2
195
- movdqa 96(%r10), %xmm3
196
- movdqa 112(%r10), %xmm4
197
- movdqa 128(%r10), %xmm5
198
- movdqa 144(%r10), %xmm6
199
- movdqa 160(%r10), %xmm7
200
- jmp .Lret_from_load_sse
201
-
202
- .LUW4:
203
- .size ffi_call_unix64,.-ffi_call_unix64
204
-
205
- .align 2
206
- .globl ffi_closure_unix64
207
- .type ffi_closure_unix64,@function
208
-
209
- ffi_closure_unix64:
210
- .LUW5:
211
- /* The carry flag is set by the trampoline iff SSE registers
212
- are used. Don't clobber it before the branch instruction. */
213
- leaq -200(%rsp), %rsp
214
- .LUW6:
215
- movq %rdi, (%rsp)
216
- movq %rsi, 8(%rsp)
217
- movq %rdx, 16(%rsp)
218
- movq %rcx, 24(%rsp)
219
- movq %r8, 32(%rsp)
220
- movq %r9, 40(%rsp)
221
- jc .Lsave_sse
222
- .Lret_from_save_sse:
223
-
224
- movq %r10, %rdi
225
- leaq 176(%rsp), %rsi
226
- movq %rsp, %rdx
227
- leaq 208(%rsp), %rcx
228
- call ffi_closure_unix64_inner@PLT
197
+ .balign 2
198
+ L(UW3):
199
+ /* cfi_restore_state */
200
+ L(load_sse):
201
+ movdqa 0x30(%r10), %xmm0
202
+ movdqa 0x40(%r10), %xmm1
203
+ movdqa 0x50(%r10), %xmm2
204
+ movdqa 0x60(%r10), %xmm3
205
+ movdqa 0x70(%r10), %xmm4
206
+ movdqa 0x80(%r10), %xmm5
207
+ movdqa 0x90(%r10), %xmm6
208
+ movdqa 0xa0(%r10), %xmm7
209
+ jmp L(ret_from_load_sse)
210
+
211
+ L(UW4):
212
+ ENDF(C(ffi_call_unix64))
213
+
214
+ /* 6 general registers, 8 vector registers,
215
+ 32 bytes of rvalue, 8 bytes of alignment. */
216
+ #define ffi_closure_OFS_G 0
217
+ #define ffi_closure_OFS_V (6*8)
218
+ #define ffi_closure_OFS_RVALUE (ffi_closure_OFS_V + 8*16)
219
+ #define ffi_closure_FS (ffi_closure_OFS_RVALUE + 32 + 8)
220
+
221
+ /* The location of rvalue within the red zone after deallocating the frame. */
222
+ #define ffi_closure_RED_RVALUE (ffi_closure_OFS_RVALUE - ffi_closure_FS)
223
+
224
+ .balign 2
225
+ .globl C(ffi_closure_unix64_sse)
226
+ FFI_HIDDEN(C(ffi_closure_unix64_sse))
227
+
228
+ C(ffi_closure_unix64_sse):
229
+ L(UW5):
230
+ subq $ffi_closure_FS, %rsp
231
+ L(UW6):
232
+ /* cfi_adjust_cfa_offset(ffi_closure_FS) */
233
+
234
+ movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp)
235
+ movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp)
236
+ movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp)
237
+ movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp)
238
+ movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp)
239
+ movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp)
240
+ movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp)
241
+ movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp)
242
+ jmp L(sse_entry1)
243
+
244
+ L(UW7):
245
+ ENDF(C(ffi_closure_unix64_sse))
246
+
247
+ .balign 2
248
+ .globl C(ffi_closure_unix64)
249
+ FFI_HIDDEN(C(ffi_closure_unix64))
250
+
251
+ C(ffi_closure_unix64):
252
+ L(UW8):
253
+ subq $ffi_closure_FS, %rsp
254
+ L(UW9):
255
+ /* cfi_adjust_cfa_offset(ffi_closure_FS) */
256
+ L(sse_entry1):
257
+ movq %rdi, ffi_closure_OFS_G+0x00(%rsp)
258
+ movq %rsi, ffi_closure_OFS_G+0x08(%rsp)
259
+ movq %rdx, ffi_closure_OFS_G+0x10(%rsp)
260
+ movq %rcx, ffi_closure_OFS_G+0x18(%rsp)
261
+ movq %r8, ffi_closure_OFS_G+0x20(%rsp)
262
+ movq %r9, ffi_closure_OFS_G+0x28(%rsp)
263
+
264
+ #ifdef __ILP32__
265
+ movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */
266
+ movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */
267
+ movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */
268
+ #else
269
+ movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */
270
+ movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */
271
+ movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */
272
+ #endif
273
+ L(do_closure):
274
+ leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */
275
+ movq %rsp, %r8 /* Load reg_args */
276
+ leaq ffi_closure_FS+8(%rsp), %r9 /* Load argp */
277
+ call C(ffi_closure_unix64_inner)
229
278
 
230
279
  /* Deallocate stack frame early; return value is now in redzone. */
231
- addq $200, %rsp
232
- .LUW7:
280
+ addq $ffi_closure_FS, %rsp
281
+ L(UW10):
282
+ /* cfi_adjust_cfa_offset(-ffi_closure_FS) */
233
283
 
234
284
  /* The first byte of the return value contains the FFI_TYPE. */
285
+ cmpb $UNIX64_RET_LAST, %al
235
286
  movzbl %al, %r10d
236
- leaq .Lload_table(%rip), %r11
237
- movslq (%r11, %r10, 4), %r10
238
- addq %r11, %r10
287
+ leaq L(load_table)(%rip), %r11
288
+ ja L(la)
289
+ leaq (%r11, %r10, 8), %r10
290
+ leaq ffi_closure_RED_RVALUE(%rsp), %rsi
239
291
  jmp *%r10
240
292
 
241
- .Lload_table:
242
- .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */
243
- .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */
244
- .long .Lld_float-.Lload_table /* FFI_TYPE_FLOAT */
245
- .long .Lld_double-.Lload_table /* FFI_TYPE_DOUBLE */
246
- .long .Lld_ldouble-.Lload_table /* FFI_TYPE_LONGDOUBLE */
247
- .long .Lld_int8-.Lload_table /* FFI_TYPE_UINT8 */
248
- .long .Lld_int8-.Lload_table /* FFI_TYPE_SINT8 */
249
- .long .Lld_int16-.Lload_table /* FFI_TYPE_UINT16 */
250
- .long .Lld_int16-.Lload_table /* FFI_TYPE_SINT16 */
251
- .long .Lld_int32-.Lload_table /* FFI_TYPE_UINT32 */
252
- .long .Lld_int32-.Lload_table /* FFI_TYPE_SINT32 */
253
- .long .Lld_int64-.Lload_table /* FFI_TYPE_UINT64 */
254
- .long .Lld_int64-.Lload_table /* FFI_TYPE_SINT64 */
255
- .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */
256
- .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */
257
-
258
- .align 2
259
- .Lld_void:
293
+ .balign 8
294
+ L(load_table):
295
+ E(L(load_table), UNIX64_RET_VOID)
260
296
  ret
261
-
262
- .align 2
263
- .Lld_int8:
264
- movzbl -24(%rsp), %eax
297
+ E(L(load_table), UNIX64_RET_UINT8)
298
+ movzbl (%rsi), %eax
265
299
  ret
266
- .align 2
267
- .Lld_int16:
268
- movzwl -24(%rsp), %eax
300
+ E(L(load_table), UNIX64_RET_UINT16)
301
+ movzwl (%rsi), %eax
269
302
  ret
270
- .align 2
271
- .Lld_int32:
272
- movl -24(%rsp), %eax
303
+ E(L(load_table), UNIX64_RET_UINT32)
304
+ movl (%rsi), %eax
273
305
  ret
274
- .align 2
275
- .Lld_int64:
276
- movq -24(%rsp), %rax
306
+ E(L(load_table), UNIX64_RET_SINT8)
307
+ movsbl (%rsi), %eax
277
308
  ret
278
-
279
- .align 2
280
- .Lld_float:
281
- movss -24(%rsp), %xmm0
309
+ E(L(load_table), UNIX64_RET_SINT16)
310
+ movswl (%rsi), %eax
282
311
  ret
283
- .align 2
284
- .Lld_double:
285
- movsd -24(%rsp), %xmm0
312
+ E(L(load_table), UNIX64_RET_SINT32)
313
+ movl (%rsi), %eax
286
314
  ret
287
- .align 2
288
- .Lld_ldouble:
289
- fldt -24(%rsp)
315
+ E(L(load_table), UNIX64_RET_INT64)
316
+ movq (%rsi), %rax
290
317
  ret
291
-
292
- .align 2
293
- .Lld_struct:
294
- /* There are four possibilities here, %rax/%rdx, %xmm0/%rax,
295
- %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading
296
- both rdx and xmm1 with the second word. For the remaining,
297
- bit 8 set means xmm0 gets the second word, and bit 9 means
298
- that rax gets the second word. */
299
- movq -24(%rsp), %rcx
300
- movq -16(%rsp), %rdx
301
- movq -16(%rsp), %xmm1
302
- testl $0x100, %eax
303
- cmovnz %rdx, %rcx
304
- movd %rcx, %xmm0
305
- testl $0x200, %eax
306
- movq -24(%rsp), %rax
307
- cmovnz %rdx, %rax
318
+ E(L(load_table), UNIX64_RET_XMM32)
319
+ movd (%rsi), %xmm0
320
+ ret
321
+ E(L(load_table), UNIX64_RET_XMM64)
322
+ movq (%rsi), %xmm0
323
+ ret
324
+ E(L(load_table), UNIX64_RET_X87)
325
+ fldt (%rsi)
326
+ ret
327
+ E(L(load_table), UNIX64_RET_X87_2)
328
+ fldt 16(%rsi)
329
+ fldt (%rsi)
330
+ ret
331
+ E(L(load_table), UNIX64_RET_ST_XMM0_RAX)
332
+ movq 8(%rsi), %rax
333
+ jmp L(l3)
334
+ E(L(load_table), UNIX64_RET_ST_RAX_XMM0)
335
+ movq 8(%rsi), %xmm0
336
+ jmp L(l2)
337
+ E(L(load_table), UNIX64_RET_ST_XMM0_XMM1)
338
+ movq 8(%rsi), %xmm1
339
+ jmp L(l3)
340
+ E(L(load_table), UNIX64_RET_ST_RAX_RDX)
341
+ movq 8(%rsi), %rdx
342
+ L(l2):
343
+ movq (%rsi), %rax
344
+ ret
345
+ .balign 8
346
+ L(l3):
347
+ movq (%rsi), %xmm0
308
348
  ret
309
349
 
310
- /* See the comment above .Lload_sse; the same logic applies here. */
311
- .align 2
312
- .LUW8:
313
- .Lsave_sse:
314
- movdqa %xmm0, 48(%rsp)
315
- movdqa %xmm1, 64(%rsp)
316
- movdqa %xmm2, 80(%rsp)
317
- movdqa %xmm3, 96(%rsp)
318
- movdqa %xmm4, 112(%rsp)
319
- movdqa %xmm5, 128(%rsp)
320
- movdqa %xmm6, 144(%rsp)
321
- movdqa %xmm7, 160(%rsp)
322
- jmp .Lret_from_save_sse
323
-
324
- .LUW9:
325
- .size ffi_closure_unix64,.-ffi_closure_unix64
326
-
327
- #ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
328
- .section .eh_frame,"a",@unwind
329
- #else
330
- .section .eh_frame,"a",@progbits
331
- #endif
332
- .Lframe1:
333
- .long .LECIE1-.LSCIE1 /* CIE Length */
334
- .LSCIE1:
335
- .long 0 /* CIE Identifier Tag */
336
- .byte 1 /* CIE Version */
337
- .ascii "zR\0" /* CIE Augmentation */
338
- .uleb128 1 /* CIE Code Alignment Factor */
339
- .sleb128 -8 /* CIE Data Alignment Factor */
340
- .byte 0x10 /* CIE RA Column */
341
- .uleb128 1 /* Augmentation size */
342
- .byte 0x1b /* FDE Encoding (pcrel sdata4) */
343
- .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */
344
- .uleb128 7
345
- .uleb128 8
346
- .byte 0x80+16 /* DW_CFA_offset, %rip offset 1*-8 */
347
- .uleb128 1
348
- .align 8
349
- .LECIE1:
350
- .LSFDE1:
351
- .long .LEFDE1-.LASFDE1 /* FDE Length */
352
- .LASFDE1:
353
- .long .LASFDE1-.Lframe1 /* FDE CIE offset */
354
- #if HAVE_AS_X86_PCREL
355
- .long .LUW0-. /* FDE initial location */
350
+ L(la): call PLT(C(abort))
351
+
352
+ L(UW11):
353
+ ENDF(C(ffi_closure_unix64))
354
+
355
+ .balign 2
356
+ .globl C(ffi_go_closure_unix64_sse)
357
+ FFI_HIDDEN(C(ffi_go_closure_unix64_sse))
358
+
359
+ C(ffi_go_closure_unix64_sse):
360
+ L(UW12):
361
+ subq $ffi_closure_FS, %rsp
362
+ L(UW13):
363
+ /* cfi_adjust_cfa_offset(ffi_closure_FS) */
364
+
365
+ movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp)
366
+ movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp)
367
+ movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp)
368
+ movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp)
369
+ movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp)
370
+ movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp)
371
+ movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp)
372
+ movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp)
373
+ jmp L(sse_entry2)
374
+
375
+ L(UW14):
376
+ ENDF(C(ffi_go_closure_unix64_sse))
377
+
378
+ .balign 2
379
+ .globl C(ffi_go_closure_unix64)
380
+ FFI_HIDDEN(C(ffi_go_closure_unix64))
381
+
382
+ C(ffi_go_closure_unix64):
383
+ L(UW15):
384
+ subq $ffi_closure_FS, %rsp
385
+ L(UW16):
386
+ /* cfi_adjust_cfa_offset(ffi_closure_FS) */
387
+ L(sse_entry2):
388
+ movq %rdi, ffi_closure_OFS_G+0x00(%rsp)
389
+ movq %rsi, ffi_closure_OFS_G+0x08(%rsp)
390
+ movq %rdx, ffi_closure_OFS_G+0x10(%rsp)
391
+ movq %rcx, ffi_closure_OFS_G+0x18(%rsp)
392
+ movq %r8, ffi_closure_OFS_G+0x20(%rsp)
393
+ movq %r9, ffi_closure_OFS_G+0x28(%rsp)
394
+
395
+ #ifdef __ILP32__
396
+ movl 4(%r10), %edi /* Load cif */
397
+ movl 8(%r10), %esi /* Load fun */
398
+ movl %r10d, %edx /* Load closure (user_data) */
356
399
  #else
357
- .long .LUW0@rel
400
+ movq 8(%r10), %rdi /* Load cif */
401
+ movq 16(%r10), %rsi /* Load fun */
402
+ movq %r10, %rdx /* Load closure (user_data) */
358
403
  #endif
359
- .long .LUW4-.LUW0 /* FDE address range */
360
- .uleb128 0x0 /* Augmentation size */
361
-
362
- .byte 0x4 /* DW_CFA_advance_loc4 */
363
- .long .LUW1-.LUW0
404
+ jmp L(do_closure)
364
405
 
365
- /* New stack frame based off rbp. This is a itty bit of unwind
366
- trickery in that the CFA *has* changed. There is no easy way
367
- to describe it correctly on entry to the function. Fortunately,
368
- it doesn't matter too much since at all points we can correctly
369
- unwind back to ffi_call. Note that the location to which we
370
- moved the return address is (the new) CFA-8, so from the
371
- perspective of the unwind info, it hasn't moved. */
372
- .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */
373
- .uleb128 6
374
- .uleb128 32
375
- .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */
376
- .uleb128 2
377
- .byte 0xa /* DW_CFA_remember_state */
406
+ L(UW17):
407
+ ENDF(C(ffi_go_closure_unix64))
378
408
 
379
- .byte 0x4 /* DW_CFA_advance_loc4 */
380
- .long .LUW2-.LUW1
381
- .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */
382
- .uleb128 7
383
- .uleb128 8
384
- .byte 0xc0+6 /* DW_CFA_restore, %rbp */
409
+ /* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */
385
410
 
386
- .byte 0x4 /* DW_CFA_advance_loc4 */
387
- .long .LUW3-.LUW2
388
- .byte 0xb /* DW_CFA_restore_state */
389
-
390
- .align 8
391
- .LEFDE1:
392
- .LSFDE3:
393
- .long .LEFDE3-.LASFDE3 /* FDE Length */
394
- .LASFDE3:
395
- .long .LASFDE3-.Lframe1 /* FDE CIE offset */
396
- #if HAVE_AS_X86_PCREL
397
- .long .LUW5-. /* FDE initial location */
411
+ #ifdef __APPLE__
412
+ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
413
+ EHFrame0:
414
+ #elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE)
415
+ .section .eh_frame,"a",@unwind
398
416
  #else
399
- .long .LUW5@rel
417
+ .section .eh_frame,"a",@progbits
400
418
  #endif
401
- .long .LUW9-.LUW5 /* FDE address range */
402
- .uleb128 0x0 /* Augmentation size */
403
419
 
404
- .byte 0x4 /* DW_CFA_advance_loc4 */
405
- .long .LUW6-.LUW5
406
- .byte 0xe /* DW_CFA_def_cfa_offset */
407
- .uleb128 208
408
- .byte 0xa /* DW_CFA_remember_state */
420
+ #ifdef HAVE_AS_X86_PCREL
421
+ # define PCREL(X) X - .
422
+ #else
423
+ # define PCREL(X) X@rel
424
+ #endif
409
425
 
410
- .byte 0x4 /* DW_CFA_advance_loc4 */
411
- .long .LUW7-.LUW6
412
- .byte 0xe /* DW_CFA_def_cfa_offset */
413
- .uleb128 8
426
+ /* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */
427
+ #define ADV(N, P) .byte 2, L(N)-L(P)
414
428
 
415
- .byte 0x4 /* DW_CFA_advance_loc4 */
416
- .long .LUW8-.LUW7
429
+ .balign 8
430
+ L(CIE):
431
+ .set L(set0),L(ECIE)-L(SCIE)
432
+ .long L(set0) /* CIE Length */
433
+ L(SCIE):
434
+ .long 0 /* CIE Identifier Tag */
435
+ .byte 1 /* CIE Version */
436
+ .ascii "zR\0" /* CIE Augmentation */
437
+ .byte 1 /* CIE Code Alignment Factor */
438
+ .byte 0x78 /* CIE Data Alignment Factor */
439
+ .byte 0x10 /* CIE RA Column */
440
+ .byte 1 /* Augmentation size */
441
+ .byte 0x1b /* FDE Encoding (pcrel sdata4) */
442
+ .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp offset 8 */
443
+ .byte 0x80+16, 1 /* DW_CFA_offset, %rip offset 1*-8 */
444
+ .balign 8
445
+ L(ECIE):
446
+
447
+ .set L(set1),L(EFDE1)-L(SFDE1)
448
+ .long L(set1) /* FDE Length */
449
+ L(SFDE1):
450
+ .long L(SFDE1)-L(CIE) /* FDE CIE offset */
451
+ .long PCREL(L(UW0)) /* Initial location */
452
+ .long L(UW4)-L(UW0) /* Address range */
453
+ .byte 0 /* Augmentation size */
454
+ ADV(UW1, UW0)
455
+ .byte 0xc, 6, 32 /* DW_CFA_def_cfa, %rbp 32 */
456
+ .byte 0x80+6, 2 /* DW_CFA_offset, %rbp 2*-8 */
457
+ ADV(UW2, UW1)
458
+ .byte 0xa /* DW_CFA_remember_state */
459
+ .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp 8 */
460
+ .byte 0xc0+6 /* DW_CFA_restore, %rbp */
461
+ ADV(UW3, UW2)
417
462
  .byte 0xb /* DW_CFA_restore_state */
418
-
419
- .align 8
420
- .LEFDE3:
463
+ .balign 8
464
+ L(EFDE1):
465
+
466
+ .set L(set2),L(EFDE2)-L(SFDE2)
467
+ .long L(set2) /* FDE Length */
468
+ L(SFDE2):
469
+ .long L(SFDE2)-L(CIE) /* FDE CIE offset */
470
+ .long PCREL(L(UW5)) /* Initial location */
471
+ .long L(UW7)-L(UW5) /* Address range */
472
+ .byte 0 /* Augmentation size */
473
+ ADV(UW6, UW5)
474
+ .byte 0xe /* DW_CFA_def_cfa_offset */
475
+ .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
476
+ .balign 8
477
+ L(EFDE2):
478
+
479
+ .set L(set3),L(EFDE3)-L(SFDE3)
480
+ .long L(set3) /* FDE Length */
481
+ L(SFDE3):
482
+ .long L(SFDE3)-L(CIE) /* FDE CIE offset */
483
+ .long PCREL(L(UW8)) /* Initial location */
484
+ .long L(UW11)-L(UW8) /* Address range */
485
+ .byte 0 /* Augmentation size */
486
+ ADV(UW9, UW8)
487
+ .byte 0xe /* DW_CFA_def_cfa_offset */
488
+ .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
489
+ ADV(UW10, UW9)
490
+ .byte 0xe, 8 /* DW_CFA_def_cfa_offset 8 */
491
+ L(EFDE3):
492
+
493
+ .set L(set4),L(EFDE4)-L(SFDE4)
494
+ .long L(set4) /* FDE Length */
495
+ L(SFDE4):
496
+ .long L(SFDE4)-L(CIE) /* FDE CIE offset */
497
+ .long PCREL(L(UW12)) /* Initial location */
498
+ .long L(UW14)-L(UW12) /* Address range */
499
+ .byte 0 /* Augmentation size */
500
+ ADV(UW13, UW12)
501
+ .byte 0xe /* DW_CFA_def_cfa_offset */
502
+ .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
503
+ .balign 8
504
+ L(EFDE4):
505
+
506
+ .set L(set5),L(EFDE5)-L(SFDE5)
507
+ .long L(set5) /* FDE Length */
508
+ L(SFDE5):
509
+ .long L(SFDE5)-L(CIE) /* FDE CIE offset */
510
+ .long PCREL(L(UW15)) /* Initial location */
511
+ .long L(UW17)-L(UW15) /* Address range */
512
+ .byte 0 /* Augmentation size */
513
+ ADV(UW16, UW15)
514
+ .byte 0xe /* DW_CFA_def_cfa_offset */
515
+ .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */
516
+ .balign 8
517
+ L(EFDE5):
518
+ #ifdef __APPLE__
519
+ .subsections_via_symbols
520
+ #endif
421
521
 
422
522
  #endif /* __x86_64__ */
423
-
424
523
  #if defined __ELF__ && defined __linux__
425
524
  .section .note.GNU-stack,"",@progbits
426
525
  #endif