ffi 1.9.18 → 1.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +52 -0
  5. data/.yardopts +5 -0
  6. data/Gemfile +15 -0
  7. data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
  8. data/README.md +3 -4
  9. data/Rakefile +41 -5
  10. data/appveyor.yml +22 -0
  11. data/ext/ffi_c/AbstractMemory.c +6 -1
  12. data/ext/ffi_c/Call.c +1 -22
  13. data/ext/ffi_c/Call.h +0 -9
  14. data/ext/ffi_c/Closure.c +54 -0
  15. data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
  16. data/ext/ffi_c/Function.c +16 -25
  17. data/ext/ffi_c/Function.h +1 -2
  18. data/ext/ffi_c/FunctionInfo.c +0 -4
  19. data/ext/ffi_c/MethodHandle.c +33 -268
  20. data/ext/ffi_c/Platform.c +10 -2
  21. data/ext/ffi_c/extconf.rb +10 -5
  22. data/ext/ffi_c/ffi.c +2 -2
  23. data/ext/ffi_c/libffi/.appveyor.yml +48 -0
  24. data/ext/ffi_c/libffi/.gitignore +36 -0
  25. data/ext/ffi_c/libffi/.travis/install.sh +14 -0
  26. data/ext/ffi_c/libffi/.travis.yml +30 -0
  27. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  28. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  29. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  30. data/ext/ffi_c/libffi/LICENSE +1 -1
  31. data/ext/ffi_c/libffi/Makefile.am +169 -158
  32. data/ext/ffi_c/libffi/Makefile.in +927 -938
  33. data/ext/ffi_c/libffi/README +164 -52
  34. data/ext/ffi_c/libffi/acinclude.m4 +387 -0
  35. data/ext/ffi_c/libffi/autogen.sh +2 -0
  36. data/ext/ffi_c/libffi/config.guess +336 -371
  37. data/ext/ffi_c/libffi/config.sub +246 -115
  38. data/ext/ffi_c/libffi/configure +6976 -2189
  39. data/ext/ffi_c/libffi/configure.ac +148 -256
  40. data/ext/ffi_c/libffi/configure.host +277 -4
  41. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  42. data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
  43. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  44. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  45. data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
  46. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  47. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  48. data/ext/ffi_c/libffi/include/Makefile.in +188 -71
  49. data/ext/ffi_c/libffi/include/ffi.h.in +112 -50
  50. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  51. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  52. data/ext/ffi_c/libffi/install-sh +190 -202
  53. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  54. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  55. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  56. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  57. data/ext/ffi_c/libffi/libtool-version +1 -1
  58. data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
  59. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  60. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  61. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  62. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  63. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  64. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  67. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  68. data/ext/ffi_c/libffi/man/Makefile.in +141 -49
  69. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  70. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  71. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  72. data/ext/ffi_c/libffi/missing +150 -311
  73. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  74. data/ext/ffi_c/libffi/src/aarch64/ffi.c +964 -0
  75. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  76. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  77. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  78. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  79. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  80. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  81. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  82. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  83. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  84. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  85. data/ext/ffi_c/libffi/src/arm/ffi.c +608 -517
  86. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  87. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  88. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  89. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  90. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  91. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  92. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  93. data/ext/ffi_c/libffi/src/closures.c +366 -45
  94. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  95. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  96. data/ext/ffi_c/libffi/src/debug.c +6 -1
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  98. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  99. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  100. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  101. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  102. data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
  103. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  104. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  105. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  106. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  107. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  108. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  109. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  110. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  111. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  112. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  113. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  114. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  115. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  116. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  117. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  118. data/ext/ffi_c/libffi/src/mips/ffi.c +103 -28
  119. data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
  120. data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
  121. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  122. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  123. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  124. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  125. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  126. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  127. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  128. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  129. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  130. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  131. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  132. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  133. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  134. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  135. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  136. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  137. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  138. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +111 -30
  139. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  140. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  141. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  142. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +103 -44
  143. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  144. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  145. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  146. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  147. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  148. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  149. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  150. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  151. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  152. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  153. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  154. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  155. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  156. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  157. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  158. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  159. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  160. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  161. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  162. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  163. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  164. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  165. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  166. data/ext/ffi_c/libffi/src/types.c +43 -14
  167. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  168. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  169. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  170. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  171. data/ext/ffi_c/libffi/src/x86/ffi.c +591 -500
  172. data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -116
  173. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  174. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  175. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  176. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  177. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  178. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  179. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  180. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  181. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  182. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  183. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  184. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  185. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -73
  186. data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
  187. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -25
  188. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  293. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  345. data/ext/ffi_c/libffi.bsd.mk +11 -5
  346. data/ext/ffi_c/libffi.darwin.mk +14 -4
  347. data/ext/ffi_c/libffi.gnu.mk +3 -2
  348. data/ext/ffi_c/libffi.mk +10 -5
  349. data/ext/ffi_c/libffi.vc.mk +1 -1
  350. data/ext/ffi_c/libffi.vc64.mk +1 -1
  351. data/ffi.gemspec +16 -3
  352. data/lib/ffi/enum.rb +124 -0
  353. data/lib/ffi/library.rb +66 -14
  354. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  355. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  356. data/lib/ffi/platform.rb +7 -2
  357. data/lib/ffi/pointer.rb +1 -0
  358. data/lib/ffi/struct.rb +0 -2
  359. data/lib/ffi/version.rb +1 -2
  360. data/samples/getlogin.rb +8 -0
  361. data/samples/getpid.rb +8 -0
  362. data/samples/gettimeofday.rb +18 -0
  363. data/samples/hello.rb +7 -0
  364. data/samples/inotify.rb +60 -0
  365. data/samples/pty.rb +76 -0
  366. data/samples/qsort.rb +21 -0
  367. data/samples/sample_helper.rb +6 -0
  368. metadata +164 -115
  369. data/ext/ffi_c/ClosurePool.c +0 -283
  370. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  371. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  372. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  373. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  374. data/ext/ffi_c/libffi/compile +0 -143
  375. data/ext/ffi_c/libffi/depcomp +0 -630
  376. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  377. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  378. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  379. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  380. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  381. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  382. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  383. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  384. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  385. data/ext/ffi_c/libffi/mdate-sh +0 -201
  386. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  387. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  388. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  389. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  390. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  391. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  392. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  395. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  396. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  397. data/gen/Rakefile +0 -30
  398. data/libtest/Benchmark.c +0 -52
  399. data/libtest/BoolTest.c +0 -34
  400. data/libtest/BufferTest.c +0 -31
  401. data/libtest/ClosureTest.c +0 -205
  402. data/libtest/EnumTest.c +0 -51
  403. data/libtest/FunctionTest.c +0 -70
  404. data/libtest/GNUmakefile +0 -149
  405. data/libtest/GlobalVariable.c +0 -62
  406. data/libtest/LastErrorTest.c +0 -21
  407. data/libtest/NumberTest.c +0 -132
  408. data/libtest/PointerTest.c +0 -63
  409. data/libtest/ReferenceTest.c +0 -23
  410. data/libtest/StringTest.c +0 -34
  411. data/libtest/StructTest.c +0 -243
  412. data/libtest/UnionTest.c +0 -43
  413. data/libtest/VariadicTest.c +0 -99
  414. data/spec/ffi/async_callback_spec.rb +0 -35
  415. data/spec/ffi/bool_spec.rb +0 -32
  416. data/spec/ffi/buffer_spec.rb +0 -279
  417. data/spec/ffi/callback_spec.rb +0 -773
  418. data/spec/ffi/custom_param_type.rb +0 -37
  419. data/spec/ffi/custom_type_spec.rb +0 -74
  420. data/spec/ffi/dup_spec.rb +0 -52
  421. data/spec/ffi/enum_spec.rb +0 -423
  422. data/spec/ffi/errno_spec.rb +0 -20
  423. data/spec/ffi/ffi_spec.rb +0 -28
  424. data/spec/ffi/fixtures/Benchmark.c +0 -52
  425. data/spec/ffi/fixtures/BoolTest.c +0 -34
  426. data/spec/ffi/fixtures/BufferTest.c +0 -31
  427. data/spec/ffi/fixtures/ClosureTest.c +0 -205
  428. data/spec/ffi/fixtures/EnumTest.c +0 -51
  429. data/spec/ffi/fixtures/FunctionTest.c +0 -142
  430. data/spec/ffi/fixtures/GNUmakefile +0 -149
  431. data/spec/ffi/fixtures/GlobalVariable.c +0 -62
  432. data/spec/ffi/fixtures/LastErrorTest.c +0 -21
  433. data/spec/ffi/fixtures/NumberTest.c +0 -132
  434. data/spec/ffi/fixtures/PipeHelper.h +0 -21
  435. data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
  436. data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
  437. data/spec/ffi/fixtures/PointerTest.c +0 -63
  438. data/spec/ffi/fixtures/ReferenceTest.c +0 -23
  439. data/spec/ffi/fixtures/StringTest.c +0 -34
  440. data/spec/ffi/fixtures/StructTest.c +0 -243
  441. data/spec/ffi/fixtures/UnionTest.c +0 -43
  442. data/spec/ffi/fixtures/VariadicTest.c +0 -99
  443. data/spec/ffi/fixtures/classes.rb +0 -438
  444. data/spec/ffi/function_spec.rb +0 -97
  445. data/spec/ffi/io_spec.rb +0 -16
  446. data/spec/ffi/library_spec.rb +0 -286
  447. data/spec/ffi/long_double.rb +0 -30
  448. data/spec/ffi/managed_struct_spec.rb +0 -68
  449. data/spec/ffi/memorypointer_spec.rb +0 -78
  450. data/spec/ffi/number_spec.rb +0 -247
  451. data/spec/ffi/platform_spec.rb +0 -114
  452. data/spec/ffi/pointer_spec.rb +0 -285
  453. data/spec/ffi/rbx/attach_function_spec.rb +0 -34
  454. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
  455. data/spec/ffi/rbx/spec_helper.rb +0 -6
  456. data/spec/ffi/rbx/struct_spec.rb +0 -18
  457. data/spec/ffi/spec_helper.rb +0 -93
  458. data/spec/ffi/string_spec.rb +0 -118
  459. data/spec/ffi/strptr_spec.rb +0 -50
  460. data/spec/ffi/struct_by_ref_spec.rb +0 -43
  461. data/spec/ffi/struct_callback_spec.rb +0 -69
  462. data/spec/ffi/struct_initialize_spec.rb +0 -35
  463. data/spec/ffi/struct_packed_spec.rb +0 -50
  464. data/spec/ffi/struct_spec.rb +0 -886
  465. data/spec/ffi/typedef_spec.rb +0 -91
  466. data/spec/ffi/union_spec.rb +0 -67
  467. data/spec/ffi/variadic_spec.rb +0 -132
  468. data/spec/spec.opts +0 -4
@@ -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