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,5 +1,6 @@
1
1
  /* -----------------------------------------------------------------*-C-*-
2
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
2
+ ffitarget.h - Copyright (c) 2012 Anthony Green
3
+ Copyright (c) 1996-2003 Red Hat, Inc.
3
4
  Target configuration macros for SPARC.
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
27
28
  #ifndef LIBFFI_TARGET_H
28
29
  #define LIBFFI_TARGET_H
29
30
 
31
+ #ifndef LIBFFI_H
32
+ #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
33
+ #endif
34
+
30
35
  /* ---- System specific configurations ----------------------------------- */
31
36
 
32
37
  #if defined(__arch64__) || defined(__sparcv9)
@@ -41,21 +46,29 @@ typedef signed long ffi_sarg;
41
46
 
42
47
  typedef enum ffi_abi {
43
48
  FFI_FIRST_ABI = 0,
44
- FFI_V8,
45
- FFI_V8PLUS,
46
- FFI_V9,
47
- FFI_LAST_ABI,
48
49
  #ifdef SPARC64
49
- FFI_DEFAULT_ABI = FFI_V9
50
+ FFI_V9,
51
+ FFI_DEFAULT_ABI = FFI_V9,
50
52
  #else
51
- FFI_DEFAULT_ABI = FFI_V8
53
+ FFI_V8,
54
+ FFI_DEFAULT_ABI = FFI_V8,
52
55
  #endif
56
+ FFI_LAST_ABI
53
57
  } ffi_abi;
54
58
  #endif
55
59
 
60
+ #define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION 1
61
+ #define FFI_TARGET_HAS_COMPLEX_TYPE 1
62
+
63
+ #ifdef SPARC64
64
+ # define FFI_TARGET_SPECIFIC_VARIADIC 1
65
+ # define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs
66
+ #endif
67
+
56
68
  /* ---- Definitions for closures ----------------------------------------- */
57
69
 
58
70
  #define FFI_CLOSURES 1
71
+ #define FFI_GO_CLOSURES 1
59
72
  #define FFI_NATIVE_RAW_API 0
60
73
 
61
74
  #ifdef SPARC64
@@ -0,0 +1,26 @@
1
+ #define SPARC_RET_VOID 0
2
+ #define SPARC_RET_STRUCT 1
3
+ #define SPARC_RET_UINT8 2
4
+ #define SPARC_RET_SINT8 3
5
+ #define SPARC_RET_UINT16 4
6
+ #define SPARC_RET_SINT16 5
7
+ #define SPARC_RET_UINT32 6
8
+ #define SP_V9_RET_SINT32 7 /* v9 only */
9
+ #define SP_V8_RET_CPLX16 7 /* v8 only */
10
+ #define SPARC_RET_INT64 8
11
+ #define SPARC_RET_INT128 9
12
+
13
+ /* Note that F_7 is missing, and is handled by SPARC_RET_STRUCT. */
14
+ #define SPARC_RET_F_8 10
15
+ #define SPARC_RET_F_6 11
16
+ #define SPARC_RET_F_4 12
17
+ #define SPARC_RET_F_2 13
18
+ #define SP_V9_RET_F_3 14 /* v9 only */
19
+ #define SP_V8_RET_CPLX8 14 /* v8 only */
20
+ #define SPARC_RET_F_1 15
21
+
22
+ #define SPARC_FLAG_RET_MASK 15
23
+ #define SPARC_FLAG_RET_IN_MEM 32
24
+ #define SPARC_FLAG_FP_ARGS 64
25
+
26
+ #define SPARC_SIZEMASK_SHIFT 8
@@ -1,7 +1,8 @@
1
1
  /* -----------------------------------------------------------------------
2
- v8.S - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc.
3
-
4
- SPARC Foreign Function Interface
2
+ v8.S - Copyright (c) 2013 The Written Word, Inc.
3
+ Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc.
4
+
5
+ SPARC Foreign Function Interface
5
6
 
6
7
  Permission is hereby granted, free of charge, to any person obtaining
7
8
  a copy of this software and associated documentation files (the
@@ -24,151 +25,253 @@
24
25
  DEALINGS IN THE SOFTWARE.
25
26
  ----------------------------------------------------------------------- */
26
27
 
27
- #define LIBFFI_ASM
28
+ #define LIBFFI_ASM
28
29
  #include <fficonfig.h>
29
30
  #include <ffi.h>
31
+ #include "internal.h"
30
32
 
31
- #define STACKFRAME 96 /* Minimum stack framesize for SPARC */
32
- #define ARGS (64+4) /* Offset of register area in frame */
33
-
34
- .text
35
- .align 8
36
- .globl ffi_call_v8
37
- .globl _ffi_call_v8
38
-
39
- ffi_call_v8:
40
- _ffi_call_v8:
41
- .LLFB1:
42
- save %sp, -STACKFRAME, %sp
43
- .LLCFI0:
44
-
45
- sub %sp, %i2, %sp ! alloca() space in stack for frame to set up
46
- add %sp, STACKFRAME, %l0 ! %l0 has start of
47
- ! frame to set up
48
-
49
- mov %l0, %o0 ! call routine to set up frame
50
- call %i0
51
- mov %i1, %o1 ! (delay)
52
-
53
- ld [%l0+ARGS], %o0 ! call foreign function
54
- ld [%l0+ARGS+4], %o1
55
- ld [%l0+ARGS+8], %o2
56
- ld [%l0+ARGS+12], %o3
57
- ld [%l0+ARGS+16], %o4
58
- ld [%l0+ARGS+20], %o5
59
- call %i5
60
- mov %l0, %sp ! (delay) switch to frame
61
- nop ! STRUCT returning functions skip 12 instead of 8 bytes
62
-
63
- ! If the return value pointer is NULL, assume no return value.
64
- tst %i4
65
- bz done
66
- nop
67
-
68
- cmp %i3, FFI_TYPE_INT
69
- be,a done
70
- st %o0, [%i4] ! (delay)
33
+ #ifndef SPARC64
71
34
 
72
- cmp %i3, FFI_TYPE_FLOAT
73
- be,a done
74
- st %f0, [%i4+0] ! (delay)
35
+ #define C2(X, Y) X ## Y
36
+ #define C1(X, Y) C2(X, Y)
75
37
 
76
- cmp %i3, FFI_TYPE_DOUBLE
77
- be,a double
78
- st %f0, [%i4+0] ! (delay)
38
+ #ifdef __USER_LABEL_PREFIX__
39
+ # define C(Y) C1(__USER_LABEL_PREFIX__, Y)
40
+ #else
41
+ # define C(Y) Y
42
+ #endif
43
+ #define L(Y) C1(.L, Y)
79
44
 
80
- cmp %i3, FFI_TYPE_SINT8
81
- be,a sint8
82
- sll %o0, 24, %o0 ! (delay)
45
+ .text
83
46
 
84
- cmp %i3, FFI_TYPE_UINT8
85
- be,a uint8
86
- sll %o0, 24, %o0 ! (delay)
47
+ #ifndef __GNUC__
48
+ .align 8
49
+ .globl C(ffi_flush_icache)
50
+ .type C(ffi_flush_icache),#function
51
+ FFI_HIDDEN(C(ffi_flush_icache))
87
52
 
88
- cmp %i3, FFI_TYPE_SINT16
89
- be,a sint16
90
- sll %o0, 16, %o0 ! (delay)
53
+ C(ffi_flush_icache):
54
+ 1: iflush %o0
55
+ iflush %o+8
56
+ nop
57
+ nop
58
+ nop
59
+ nop
60
+ nop
61
+ retl
62
+ nop
63
+ .size C(ffi_flush_icache), . - C(ffi_flush_icache)
64
+ #endif
91
65
 
92
- cmp %i3, FFI_TYPE_UINT16
93
- be,a uint16
94
- sll %o0, 16, %o0 ! (delay)
66
+ #if defined(__sun__) && defined(__svr4__)
67
+ # define E(INDEX) .align 16
68
+ #else
69
+ # define E(INDEX) .align 16; .org 2b + INDEX * 16
70
+ #endif
95
71
 
96
- cmp %i3, FFI_TYPE_SINT64
97
- be,a longlong
98
- st %o0, [%i4+0] ! (delay)
99
- done:
72
+ .align 8
73
+ .globl C(ffi_call_v8)
74
+ .type C(ffi_call_v8),#function
75
+ FFI_HIDDEN(C(ffi_call_v8))
76
+
77
+ C(ffi_call_v8):
78
+ .LUW0:
79
+ ! Allocate a stack frame sized by ffi_call.
80
+ save %sp, %o4, %sp
81
+ .LUW1:
82
+ mov %i0, %o0 ! copy cif
83
+ add %sp, 64+32, %o1 ! load args area
84
+ mov %i2, %o2 ! copy rvalue
85
+ call C(ffi_prep_args_v8)
86
+ mov %i3, %o3 ! copy avalue
87
+
88
+ add %sp, 32, %sp ! deallocate prep frame
89
+ and %o0, SPARC_FLAG_RET_MASK, %l0 ! save return type
90
+ srl %o0, SPARC_SIZEMASK_SHIFT, %l1 ! save return size
91
+ ld [%sp+64+4], %o0 ! load all argument registers
92
+ ld [%sp+64+8], %o1
93
+ ld [%sp+64+12], %o2
94
+ ld [%sp+64+16], %o3
95
+ cmp %l0, SPARC_RET_STRUCT ! struct return needs an unimp 4
96
+ ld [%sp+64+20], %o4
97
+ be 8f
98
+ ld [%sp+64+24], %o5
99
+
100
+ ! Call foreign function
101
+ call %i1
102
+ mov %i5, %g2 ! load static chain
103
+
104
+ 0: call 1f ! load pc in %o7
105
+ sll %l0, 4, %l0
106
+ 1: add %o7, %l0, %o7 ! o7 = 0b + ret_type*16
107
+ jmp %o7+(2f-0b)
108
+ nop
109
+
110
+ ! Note that each entry is 4 insns, enforced by the E macro.
111
+ .align 16
112
+ 2:
113
+ E(SPARC_RET_VOID)
100
114
  ret
101
- restore
102
-
103
- double:
104
- st %f1, [%i4+4]
115
+ restore
116
+ E(SPARC_RET_STRUCT)
117
+ unimp
118
+ E(SPARC_RET_UINT8)
119
+ and %o0, 0xff, %o0
120
+ st %o0, [%i2]
105
121
  ret
106
- restore
107
-
108
- sint8:
109
- sra %o0, 24, %o0
110
- st %o0, [%i4+0]
122
+ restore
123
+ E(SPARC_RET_SINT8)
124
+ sll %o0, 24, %o0
125
+ b 7f
126
+ sra %o0, 24, %o0
127
+ E(SPARC_RET_UINT16)
128
+ sll %o0, 16, %o0
129
+ b 7f
130
+ srl %o0, 16, %o0
131
+ E(SPARC_RET_SINT16)
132
+ sll %o0, 16, %o0
133
+ b 7f
134
+ sra %o0, 16, %o0
135
+ E(SPARC_RET_UINT32)
136
+ 7: st %o0, [%i2]
111
137
  ret
112
- restore
113
-
114
- uint8:
115
- srl %o0, 24, %o0
116
- st %o0, [%i4+0]
138
+ restore
139
+ E(SP_V8_RET_CPLX16)
140
+ sth %o0, [%i2+2]
141
+ b 9f
142
+ srl %o0, 16, %o0
143
+ E(SPARC_RET_INT64)
144
+ st %o0, [%i2]
145
+ st %o1, [%i2+4]
117
146
  ret
118
- restore
119
-
120
- sint16:
121
- sra %o0, 16, %o0
122
- st %o0, [%i4+0]
147
+ restore
148
+ E(SPARC_RET_INT128)
149
+ std %o0, [%i2]
150
+ std %o2, [%i2+8]
123
151
  ret
124
- restore
125
-
126
- uint16:
127
- srl %o0, 16, %o0
128
- st %o0, [%i4+0]
152
+ restore
153
+ E(SPARC_RET_F_8)
154
+ st %f7, [%i2+7*4]
155
+ nop
156
+ st %f6, [%i2+6*4]
157
+ nop
158
+ E(SPARC_RET_F_6)
159
+ st %f5, [%i2+5*4]
160
+ nop
161
+ st %f4, [%i2+4*4]
162
+ nop
163
+ E(SPARC_RET_F_4)
164
+ st %f3, [%i2+3*4]
165
+ nop
166
+ st %f2, [%i2+2*4]
167
+ nop
168
+ E(SPARC_RET_F_2)
169
+ st %f1, [%i2+4]
170
+ st %f0, [%i2]
129
171
  ret
130
- restore
172
+ restore
173
+ E(SP_V8_RET_CPLX8)
174
+ stb %o0, [%i2+1]
175
+ b 0f
176
+ srl %o0, 8, %o0
177
+ E(SPARC_RET_F_1)
178
+ st %f0, [%i2]
179
+ ret
180
+ restore
131
181
 
132
- longlong:
133
- st %o1, [%i4+4]
182
+ .align 8
183
+ 9: sth %o0, [%i2]
134
184
  ret
135
- restore
136
- .LLFE1:
185
+ restore
186
+ .align 8
187
+ 0: stb %o0, [%i2]
188
+ ret
189
+ restore
190
+
191
+ ! Struct returning functions expect and skip the unimp here.
192
+ ! To make it worse, conforming callees examine the unimp and
193
+ ! make sure the low 12 bits of the unimp match the size of
194
+ ! the struct being returned.
195
+ .align 8
196
+ 8: call 1f ! load pc in %o7
197
+ sll %l1, 2, %l0 ! size * 4
198
+ 1: sll %l1, 4, %l1 ! size * 16
199
+ add %l0, %l1, %l0 ! size * 20
200
+ add %o7, %l0, %o7 ! o7 = 8b + size*20
201
+ jmp %o7+(2f-8b)
202
+ mov %i5, %g2 ! load static chain
203
+ 2:
204
+
205
+ /* The Sun assembler doesn't understand .rept 0x1000. */
206
+ #define rept1 \
207
+ call %i1; \
208
+ nop; \
209
+ unimp (. - 2b) / 20; \
210
+ ret; \
211
+ restore
212
+
213
+ #define rept16 \
214
+ rept1; rept1; rept1; rept1; \
215
+ rept1; rept1; rept1; rept1; \
216
+ rept1; rept1; rept1; rept1; \
217
+ rept1; rept1; rept1; rept1
218
+
219
+ #define rept256 \
220
+ rept16; rept16; rept16; rept16; \
221
+ rept16; rept16; rept16; rept16; \
222
+ rept16; rept16; rept16; rept16; \
223
+ rept16; rept16; rept16; rept16
137
224
 
138
- .ffi_call_v8_end:
139
- .size ffi_call_v8,.ffi_call_v8_end-ffi_call_v8
225
+ rept256; rept256; rept256; rept256
226
+ rept256; rept256; rept256; rept256
227
+ rept256; rept256; rept256; rept256
228
+ rept256; rept256; rept256; rept256
140
229
 
230
+ .LUW2:
231
+ .size C(ffi_call_v8),. - C(ffi_call_v8)
141
232
 
142
- #undef STACKFRAME
143
- #define STACKFRAME 104 /* 16*4 register window +
144
- 1*4 struct return +
145
- 6*4 args backing store +
146
- 3*4 locals */
233
+
234
+ /* 16*4 register window + 1*4 struct return + 6*4 args backing store
235
+ + 8*4 return storage + 1*4 alignment. */
236
+ #define STACKFRAME (16*4 + 4 + 6*4 + 8*4 + 4)
147
237
 
148
238
  /* ffi_closure_v8(...)
149
239
 
150
240
  Receives the closure argument in %g2. */
151
241
 
152
- .text
153
- .align 8
154
- .globl ffi_closure_v8
155
-
156
- ffi_closure_v8:
157
242
  #ifdef HAVE_AS_REGISTER_PSEUDO_OP
158
- .register %g2, #scratch
243
+ .register %g2, #scratch
159
244
  #endif
160
- .LLFB2:
161
- ! Reserve frame space for all arguments in case
162
- ! we need to align them on a 8-byte boundary.
163
- ld [%g2+FFI_TRAMPOLINE_SIZE], %g1
164
- ld [%g1+4], %g1
165
- sll %g1, 3, %g1
166
- add %g1, STACKFRAME, %g1
167
- ! %g1 == STACKFRAME + 8*nargs
168
- neg %g1
169
- save %sp, %g1, %sp
170
- .LLCFI1:
171
245
 
246
+ .align 8
247
+ .globl C(ffi_go_closure_v8)
248
+ .type C(ffi_go_closure_v8),#function
249
+ FFI_HIDDEN(C(ffi_go_closure_v8))
250
+
251
+ C(ffi_go_closure_v8):
252
+ .LUW3:
253
+ save %sp, -STACKFRAME, %sp
254
+ .LUW4:
255
+ ld [%g2+4], %o0 ! load cif
256
+ ld [%g2+8], %o1 ! load fun
257
+ b 0f
258
+ mov %g2, %o2 ! load user_data
259
+ .LUW5:
260
+ .size C(ffi_go_closure_v8), . - C(ffi_go_closure_v8)
261
+
262
+ .align 8
263
+ .globl C(ffi_closure_v8)
264
+ .type C(ffi_closure_v8),#function
265
+ FFI_HIDDEN(C(ffi_closure_v8))
266
+
267
+ C(ffi_closure_v8):
268
+ .LUW6:
269
+ save %sp, -STACKFRAME, %sp
270
+ .LUW7:
271
+ ld [%g2+FFI_TRAMPOLINE_SIZE], %o0 ! load cif
272
+ ld [%g2+FFI_TRAMPOLINE_SIZE+4], %o1 ! load fun
273
+ ld [%g2+FFI_TRAMPOLINE_SIZE+8], %o2 ! load user_data
274
+ 0:
172
275
  ! Store all of the potential argument registers in va_list format.
173
276
  st %i0, [%fp+68+0]
174
277
  st %i1, [%fp+68+4]
@@ -178,136 +281,163 @@ ffi_closure_v8:
178
281
  st %i5, [%fp+68+20]
179
282
 
180
283
  ! Call ffi_closure_sparc_inner to do the bulk of the work.
181
- mov %g2, %o0
182
- add %fp, -8, %o1
183
- add %fp, 64, %o2
284
+ add %fp, -8*4, %o3
184
285
  call ffi_closure_sparc_inner_v8
185
- add %fp, -16, %o3
186
-
187
- ! Load up the return value in the proper type.
188
- ! See ffi_prep_cif_machdep for the list of cases.
189
- cmp %o0, FFI_TYPE_VOID
190
- be done1
191
-
192
- cmp %o0, FFI_TYPE_INT
193
- be done1
194
- ld [%fp-8], %i0
195
-
196
- cmp %o0, FFI_TYPE_FLOAT
197
- be,a done1
198
- ld [%fp-8], %f0
199
-
200
- cmp %o0, FFI_TYPE_DOUBLE
201
- be,a done1
202
- ldd [%fp-8], %f0
203
-
204
- #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
205
- cmp %o0, FFI_TYPE_LONGDOUBLE
206
- be done2
207
- #endif
208
-
209
- cmp %o0, FFI_TYPE_STRUCT
210
- be done2
211
-
212
- cmp %o0, FFI_TYPE_SINT64
213
- be,a done1
214
- ldd [%fp-8], %i0
215
-
216
- ld [%fp-8], %i0
217
- done1:
218
- jmp %i7+8
286
+ add %fp, 64, %o4
287
+
288
+ 0: call 1f
289
+ and %o0, SPARC_FLAG_RET_MASK, %o0
290
+ 1: sll %o0, 4, %o0 ! o0 = o0 * 16
291
+ add %o7, %o0, %o7 ! o7 = 0b + o0*16
292
+ jmp %o7+(2f-0b)
293
+ add %fp, -8*4, %i2
294
+
295
+ ! Note that each entry is 4 insns, enforced by the E macro.
296
+ .align 16
297
+ 2:
298
+ E(SPARC_RET_VOID)
299
+ ret
219
300
  restore
220
- done2:
221
- ! Skip 'unimp'.
301
+ E(SPARC_RET_STRUCT)
302
+ ld [%i2], %i0
222
303
  jmp %i7+12
223
304
  restore
224
- .LLFE2:
225
-
226
- .ffi_closure_v8_end:
227
- .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
305
+ E(SPARC_RET_UINT8)
306
+ ldub [%i2+3], %i0
307
+ ret
308
+ restore
309
+ E(SPARC_RET_SINT8)
310
+ ldsb [%i2+3], %i0
311
+ ret
312
+ restore
313
+ E(SPARC_RET_UINT16)
314
+ lduh [%i2+2], %i0
315
+ ret
316
+ restore
317
+ E(SPARC_RET_SINT16)
318
+ ldsh [%i2+2], %i0
319
+ ret
320
+ restore
321
+ E(SPARC_RET_UINT32)
322
+ ld [%i2], %i0
323
+ ret
324
+ restore
325
+ E(SP_V8_RET_CPLX16)
326
+ ld [%i2], %i0
327
+ ret
328
+ restore
329
+ E(SPARC_RET_INT64)
330
+ ldd [%i2], %i0
331
+ ret
332
+ restore
333
+ E(SPARC_RET_INT128)
334
+ ldd [%i2], %i0
335
+ ldd [%i2+8], %i2
336
+ ret
337
+ restore
338
+ E(SPARC_RET_F_8)
339
+ ld [%i2+7*4], %f7
340
+ nop
341
+ ld [%i2+6*4], %f6
342
+ nop
343
+ E(SPARC_RET_F_6)
344
+ ld [%i2+5*4], %f5
345
+ nop
346
+ ld [%i2+4*4], %f4
347
+ nop
348
+ E(SPARC_RET_F_4)
349
+ ld [%i2+3*4], %f3
350
+ nop
351
+ ld [%i2+2*4], %f2
352
+ nop
353
+ E(SPARC_RET_F_2)
354
+ ldd [%i2], %f0
355
+ ret
356
+ restore
357
+ E(SP_V8_RET_CPLX8)
358
+ lduh [%i2], %i0
359
+ ret
360
+ restore
361
+ E(SPARC_RET_F_1)
362
+ ld [%i2], %f0
363
+ ret
364
+ restore
228
365
 
229
- #ifdef SPARC64
230
- #define WS 8
231
- #define nword xword
232
- #define uanword uaxword
233
- #else
234
- #define WS 4
235
- #define nword long
236
- #define uanword uaword
237
- #endif
366
+ .LUW8:
367
+ .size C(ffi_closure_v8), . - C(ffi_closure_v8)
238
368
 
239
369
  #ifdef HAVE_RO_EH_FRAME
240
- .section ".eh_frame",#alloc
370
+ .section ".eh_frame",#alloc
241
371
  #else
242
- .section ".eh_frame",#alloc,#write
372
+ .section ".eh_frame",#alloc,#write
243
373
  #endif
244
- .LLframe1:
245
- .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry
246
- .LLSCIE1:
247
- .uaword 0x0 ! CIE Identifier Tag
248
- .byte 0x1 ! CIE Version
249
- .ascii "zR\0" ! CIE Augmentation
250
- .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor
251
- .byte 0x80-WS ! sleb128 -WS; CIE Data Alignment Factor
252
- .byte 0xf ! CIE RA Column
253
- .byte 0x1 ! uleb128 0x1; Augmentation size
254
- #ifdef HAVE_AS_SPARC_UA_PCREL
255
- .byte 0x1b ! FDE Encoding (pcrel sdata4)
256
- #else
257
- .byte 0x50 ! FDE Encoding (aligned absolute)
258
- #endif
259
- .byte 0xc ! DW_CFA_def_cfa
260
- .byte 0xe ! uleb128 0xe
261
- .byte 0x0 ! uleb128 0x0
262
- .align WS
263
- .LLECIE1:
264
- .LLSFDE1:
265
- .uaword .LLEFDE1-.LLASFDE1 ! FDE Length
266
- .LLASFDE1:
267
- .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset
374
+
268
375
  #ifdef HAVE_AS_SPARC_UA_PCREL
269
- .uaword %r_disp32(.LLFB1)
270
- .uaword .LLFE1-.LLFB1 ! FDE address range
376
+ # define FDE_ADDR(X) %r_disp32(X)
271
377
  #else
272
- .align WS
273
- .nword .LLFB1
274
- .uanword .LLFE1-.LLFB1 ! FDE address range
378
+ # define FDE_ADDR(X) X
275
379
  #endif
276
- .byte 0x0 ! uleb128 0x0; Augmentation size
277
- .byte 0x4 ! DW_CFA_advance_loc4
278
- .uaword .LLCFI0-.LLFB1
279
- .byte 0xd ! DW_CFA_def_cfa_register
280
- .byte 0x1e ! uleb128 0x1e
281
- .byte 0x2d ! DW_CFA_GNU_window_save
282
- .byte 0x9 ! DW_CFA_register
283
- .byte 0xf ! uleb128 0xf
284
- .byte 0x1f ! uleb128 0x1f
285
- .align WS
286
- .LLEFDE1:
287
- .LLSFDE2:
288
- .uaword .LLEFDE2-.LLASFDE2 ! FDE Length
289
- .LLASFDE2:
290
- .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset
380
+
381
+ .align 4
382
+ .LCIE:
383
+ .long .LECIE - .LSCIE ! CIE Length
384
+ .LSCIE:
385
+ .long 0 ! CIE Identifier Tag
386
+ .byte 1 ! CIE Version
387
+ .ascii "zR\0" ! CIE Augmentation
388
+ .byte 4 ! CIE Code Alignment Factor
389
+ .byte 0x7c ! CIE Data Alignment Factor
390
+ .byte 15 ! CIE RA Column
391
+ .byte 1 ! Augmentation size
291
392
  #ifdef HAVE_AS_SPARC_UA_PCREL
292
- .uaword %r_disp32(.LLFB2)
293
- .uaword .LLFE2-.LLFB2 ! FDE address range
393
+ .byte 0x1b ! FDE Encoding (pcrel sdata4)
294
394
  #else
295
- .align WS
296
- .nword .LLFB2
297
- .uanword .LLFE2-.LLFB2 ! FDE address range
395
+ .byte 0x50 ! FDE Encoding (aligned absolute)
298
396
  #endif
299
- .byte 0x0 ! uleb128 0x0; Augmentation size
300
- .byte 0x4 ! DW_CFA_advance_loc4
301
- .uaword .LLCFI1-.LLFB2
302
- .byte 0xd ! DW_CFA_def_cfa_register
303
- .byte 0x1e ! uleb128 0x1e
304
- .byte 0x2d ! DW_CFA_GNU_window_save
305
- .byte 0x9 ! DW_CFA_register
306
- .byte 0xf ! uleb128 0xf
307
- .byte 0x1f ! uleb128 0x1f
308
- .align WS
309
- .LLEFDE2:
310
-
397
+ .byte 0xc, 14, 0 ! DW_CFA_def_cfa, %o6, offset 0
398
+ .align 4
399
+ .LECIE:
400
+
401
+ .long .LEFDE1 - .LSFDE1 ! FDE Length
402
+ .LSFDE1:
403
+ .long .LSFDE1 - .LCIE ! FDE CIE offset
404
+ .long FDE_ADDR(.LUW0) ! Initial location
405
+ .long .LUW2 - .LUW0 ! Address range
406
+ .byte 0 ! Augmentation size
407
+ .byte 0x40+1 ! DW_CFA_advance_loc 4
408
+ .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
409
+ .byte 0x2d ! DW_CFA_GNU_window_save
410
+ .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
411
+ .align 4
412
+ .LEFDE1:
413
+
414
+ .long .LEFDE2 - .LSFDE2 ! FDE Length
415
+ .LSFDE2:
416
+ .long .LSFDE2 - .LCIE ! FDE CIE offset
417
+ .long FDE_ADDR(.LUW3) ! Initial location
418
+ .long .LUW5 - .LUW3 ! Address range
419
+ .byte 0 ! Augmentation size
420
+ .byte 0x40+1 ! DW_CFA_advance_loc 4
421
+ .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
422
+ .byte 0x2d ! DW_CFA_GNU_window_save
423
+ .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
424
+ .align 4
425
+ .LEFDE2:
426
+
427
+ .long .LEFDE3 - .LSFDE3 ! FDE Length
428
+ .LSFDE3:
429
+ .long .LSFDE3 - .LCIE ! FDE CIE offset
430
+ .long FDE_ADDR(.LUW6) ! Initial location
431
+ .long .LUW8 - .LUW6 ! Address range
432
+ .byte 0 ! Augmentation size
433
+ .byte 0x40+1 ! DW_CFA_advance_loc 4
434
+ .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
435
+ .byte 0x2d ! DW_CFA_GNU_window_save
436
+ .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
437
+ .align 4
438
+ .LEFDE3:
439
+
440
+ #endif /* !SPARC64 */
311
441
  #if defined __ELF__ && defined __linux__
312
442
  .section .note.GNU-stack,"",@progbits
313
443
  #endif