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 MIPS.
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
  #ifdef linux
31
36
  # include <asm/sgidefs.h>
32
37
  #elif defined(__rtems__)
@@ -226,12 +231,14 @@ typedef enum ffi_abi {
226
231
 
227
232
  #if defined(FFI_MIPS_O32)
228
233
  #define FFI_CLOSURES 1
234
+ #define FFI_GO_CLOSURES 1
229
235
  #define FFI_TRAMPOLINE_SIZE 20
230
236
  #else
231
237
  /* N32/N64. */
232
238
  # define FFI_CLOSURES 1
239
+ #define FFI_GO_CLOSURES 1
233
240
  #if _MIPS_SIM==_ABI64
234
- #define FFI_TRAMPOLINE_SIZE 52
241
+ #define FFI_TRAMPOLINE_SIZE 56
235
242
  #else
236
243
  #define FFI_TRAMPOLINE_SIZE 20
237
244
  #endif
@@ -37,35 +37,41 @@
37
37
  #define flags a3
38
38
  #define raddr a4
39
39
  #define fn a5
40
+ #define closure a6
40
41
 
41
- #define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG )
42
+ /* Note: to keep stack 16 byte aligned we need even number slots
43
+ used 9 slots here
44
+ */
45
+ #define SIZEOF_FRAME ( 10 * FFI_SIZEOF_ARG )
42
46
 
43
47
  #ifdef __GNUC__
44
48
  .abicalls
45
49
  #endif
50
+ .set mips4
46
51
  .text
47
52
  .align 2
48
53
  .globl ffi_call_N32
49
54
  .ent ffi_call_N32
50
55
  ffi_call_N32:
51
- .LFB3:
56
+ .LFB0:
52
57
  .frame $fp, SIZEOF_FRAME, ra
53
58
  .mask 0xc0000000,-FFI_SIZEOF_ARG
54
59
  .fmask 0x00000000,0
55
60
 
56
61
  # Prologue
57
62
  SUBU $sp, SIZEOF_FRAME # Frame size
58
- .LCFI0:
63
+ .LCFI00:
59
64
  REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer
60
65
  REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address
61
- .LCFI1:
66
+ .LCFI01:
62
67
  move $fp, $sp
63
- .LCFI3:
68
+ .LCFI02:
64
69
  move t9, callback # callback function pointer
65
70
  REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes
66
71
  REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags
67
72
  REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr
68
73
  REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn
74
+ REG_S closure, 6*FFI_SIZEOF_ARG($fp) # closure
69
75
 
70
76
  # Allocate at least 4 words in the argstack
71
77
  move v0, bytes
@@ -106,11 +112,19 @@ loadregs:
106
112
 
107
113
  REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6.
108
114
 
115
+ #ifdef __mips_soft_float
116
+ REG_L a0, 0*FFI_SIZEOF_ARG(t9)
117
+ REG_L a1, 1*FFI_SIZEOF_ARG(t9)
118
+ REG_L a2, 2*FFI_SIZEOF_ARG(t9)
119
+ REG_L a3, 3*FFI_SIZEOF_ARG(t9)
120
+ REG_L a4, 4*FFI_SIZEOF_ARG(t9)
121
+ REG_L a5, 5*FFI_SIZEOF_ARG(t9)
122
+ REG_L a6, 6*FFI_SIZEOF_ARG(t9)
123
+ REG_L a7, 7*FFI_SIZEOF_ARG(t9)
124
+ #else
109
125
  and t4, t6, ((1<<FFI_FLAG_BITS)-1)
110
- bnez t4, arg1_floatp
111
126
  REG_L a0, 0*FFI_SIZEOF_ARG(t9)
112
- b arg1_next
113
- arg1_floatp:
127
+ beqz t4, arg1_next
114
128
  bne t4, FFI_TYPE_FLOAT, arg1_doublep
115
129
  l.s $f12, 0*FFI_SIZEOF_ARG(t9)
116
130
  b arg1_next
@@ -120,10 +134,8 @@ arg1_next:
120
134
 
121
135
  SRL t4, t6, 1*FFI_FLAG_BITS
122
136
  and t4, ((1<<FFI_FLAG_BITS)-1)
123
- bnez t4, arg2_floatp
124
137
  REG_L a1, 1*FFI_SIZEOF_ARG(t9)
125
- b arg2_next
126
- arg2_floatp:
138
+ beqz t4, arg2_next
127
139
  bne t4, FFI_TYPE_FLOAT, arg2_doublep
128
140
  l.s $f13, 1*FFI_SIZEOF_ARG(t9)
129
141
  b arg2_next
@@ -133,10 +145,8 @@ arg2_next:
133
145
 
134
146
  SRL t4, t6, 2*FFI_FLAG_BITS
135
147
  and t4, ((1<<FFI_FLAG_BITS)-1)
136
- bnez t4, arg3_floatp
137
148
  REG_L a2, 2*FFI_SIZEOF_ARG(t9)
138
- b arg3_next
139
- arg3_floatp:
149
+ beqz t4, arg3_next
140
150
  bne t4, FFI_TYPE_FLOAT, arg3_doublep
141
151
  l.s $f14, 2*FFI_SIZEOF_ARG(t9)
142
152
  b arg3_next
@@ -146,10 +156,8 @@ arg3_next:
146
156
 
147
157
  SRL t4, t6, 3*FFI_FLAG_BITS
148
158
  and t4, ((1<<FFI_FLAG_BITS)-1)
149
- bnez t4, arg4_floatp
150
159
  REG_L a3, 3*FFI_SIZEOF_ARG(t9)
151
- b arg4_next
152
- arg4_floatp:
160
+ beqz t4, arg4_next
153
161
  bne t4, FFI_TYPE_FLOAT, arg4_doublep
154
162
  l.s $f15, 3*FFI_SIZEOF_ARG(t9)
155
163
  b arg4_next
@@ -159,10 +167,8 @@ arg4_next:
159
167
 
160
168
  SRL t4, t6, 4*FFI_FLAG_BITS
161
169
  and t4, ((1<<FFI_FLAG_BITS)-1)
162
- bnez t4, arg5_floatp
163
170
  REG_L a4, 4*FFI_SIZEOF_ARG(t9)
164
- b arg5_next
165
- arg5_floatp:
171
+ beqz t4, arg5_next
166
172
  bne t4, FFI_TYPE_FLOAT, arg5_doublep
167
173
  l.s $f16, 4*FFI_SIZEOF_ARG(t9)
168
174
  b arg5_next
@@ -172,10 +178,8 @@ arg5_next:
172
178
 
173
179
  SRL t4, t6, 5*FFI_FLAG_BITS
174
180
  and t4, ((1<<FFI_FLAG_BITS)-1)
175
- bnez t4, arg6_floatp
176
181
  REG_L a5, 5*FFI_SIZEOF_ARG(t9)
177
- b arg6_next
178
- arg6_floatp:
182
+ beqz t4, arg6_next
179
183
  bne t4, FFI_TYPE_FLOAT, arg6_doublep
180
184
  l.s $f17, 5*FFI_SIZEOF_ARG(t9)
181
185
  b arg6_next
@@ -185,10 +189,8 @@ arg6_next:
185
189
 
186
190
  SRL t4, t6, 6*FFI_FLAG_BITS
187
191
  and t4, ((1<<FFI_FLAG_BITS)-1)
188
- bnez t4, arg7_floatp
189
192
  REG_L a6, 6*FFI_SIZEOF_ARG(t9)
190
- b arg7_next
191
- arg7_floatp:
193
+ beqz t4, arg7_next
192
194
  bne t4, FFI_TYPE_FLOAT, arg7_doublep
193
195
  l.s $f18, 6*FFI_SIZEOF_ARG(t9)
194
196
  b arg7_next
@@ -198,21 +200,23 @@ arg7_next:
198
200
 
199
201
  SRL t4, t6, 7*FFI_FLAG_BITS
200
202
  and t4, ((1<<FFI_FLAG_BITS)-1)
201
- bnez t4, arg8_floatp
202
203
  REG_L a7, 7*FFI_SIZEOF_ARG(t9)
203
- b arg8_next
204
- arg8_floatp:
204
+ beqz t4, arg8_next
205
205
  bne t4, FFI_TYPE_FLOAT, arg8_doublep
206
206
  l.s $f19, 7*FFI_SIZEOF_ARG(t9)
207
207
  b arg8_next
208
208
  arg8_doublep:
209
209
  l.d $f19, 7*FFI_SIZEOF_ARG(t9)
210
210
  arg8_next:
211
+ #endif
211
212
 
212
213
  callit:
213
214
  # Load the function pointer
214
215
  REG_L t9, 5*FFI_SIZEOF_ARG($fp)
215
216
 
217
+ # install the static chain(t7=$15)
218
+ REG_L t7, 6*FFI_SIZEOF_ARG($fp)
219
+
216
220
  # If the return value pointer is NULL, assume no return value.
217
221
  REG_L t5, 4*FFI_SIZEOF_ARG($fp)
218
222
  beqz t5, noretval
@@ -229,6 +233,7 @@ retint:
229
233
  b epilogue
230
234
 
231
235
  retfloat:
236
+ #ifndef __mips_soft_float
232
237
  bne t6, FFI_TYPE_FLOAT, retdouble
233
238
  jal t9
234
239
  REG_L t4, 4*FFI_SIZEOF_ARG($fp)
@@ -287,6 +292,7 @@ retstruct_f_d:
287
292
  s.s $f0, 0(t4)
288
293
  s.d $f2, 8(t4)
289
294
  b epilogue
295
+ #endif
290
296
 
291
297
  retstruct_d_soft:
292
298
  bne t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft
@@ -361,7 +367,7 @@ epilogue:
361
367
  ADDU $sp, SIZEOF_FRAME # Fix stack pointer
362
368
  j ra
363
369
 
364
- .LFE3:
370
+ .LFE0:
365
371
  .end ffi_call_N32
366
372
 
367
373
  /* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0
@@ -420,6 +426,41 @@ epilogue:
420
426
  #define RA_OFF2 (1 * FFI_SIZEOF_ARG)
421
427
  #define GP_OFF2 (0 * FFI_SIZEOF_ARG)
422
428
 
429
+ .align 2
430
+ .globl ffi_go_closure_N32
431
+ .ent ffi_go_closure_N32
432
+ ffi_go_closure_N32:
433
+ .LFB1:
434
+ .frame $sp, SIZEOF_FRAME2, ra
435
+ .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
436
+ .fmask 0x00000000,0
437
+ SUBU $sp, SIZEOF_FRAME2
438
+ .LCFI10:
439
+ .cpsetup t9, GP_OFF2, ffi_go_closure_N32
440
+ REG_S ra, RA_OFF2($sp) # Save return address
441
+ .LCFI11:
442
+
443
+ REG_S a0, A0_OFF2($sp)
444
+ REG_S a1, A1_OFF2($sp)
445
+ REG_S a2, A2_OFF2($sp)
446
+ REG_S a3, A3_OFF2($sp)
447
+ REG_S a4, A4_OFF2($sp)
448
+ REG_S a5, A5_OFF2($sp)
449
+
450
+ # Call ffi_closure_mips_inner_N32 to do the real work.
451
+ LA t9, ffi_closure_mips_inner_N32
452
+ REG_L a0, 8($15) # cif
453
+ REG_L a1, 16($15) # fun
454
+ move a2, t7 # userdata=closure
455
+ ADDU a3, $sp, V0_OFF2 # rvalue
456
+ ADDU a4, $sp, A0_OFF2 # ar
457
+ ADDU a5, $sp, F12_OFF2 # fpr
458
+
459
+ b $do_closure
460
+
461
+ .LFE1:
462
+ .end ffi_go_closure_N32
463
+
423
464
  .align 2
424
465
  .globl ffi_closure_N32
425
466
  .ent ffi_closure_N32
@@ -429,21 +470,33 @@ ffi_closure_N32:
429
470
  .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
430
471
  .fmask 0x00000000,0
431
472
  SUBU $sp, SIZEOF_FRAME2
432
- .LCFI5:
473
+ .LCFI20:
433
474
  .cpsetup t9, GP_OFF2, ffi_closure_N32
434
475
  REG_S ra, RA_OFF2($sp) # Save return address
435
- .LCFI6:
436
- # Store all possible argument registers. If there are more than
437
- # fit in registers, then they were stored on the stack.
476
+ .LCFI21:
438
477
  REG_S a0, A0_OFF2($sp)
439
478
  REG_S a1, A1_OFF2($sp)
440
479
  REG_S a2, A2_OFF2($sp)
441
480
  REG_S a3, A3_OFF2($sp)
442
481
  REG_S a4, A4_OFF2($sp)
443
482
  REG_S a5, A5_OFF2($sp)
483
+
484
+ # Call ffi_closure_mips_inner_N32 to do the real work.
485
+ LA t9, ffi_closure_mips_inner_N32
486
+ REG_L a0, 56($12) # cif
487
+ REG_L a1, 64($12) # fun
488
+ REG_L a2, 72($12) # user_data
489
+ ADDU a3, $sp, V0_OFF2
490
+ ADDU a4, $sp, A0_OFF2
491
+ ADDU a5, $sp, F12_OFF2
492
+
493
+ $do_closure:
494
+ # Store all possible argument registers. If there are more than
495
+ # fit in registers, then they were stored on the stack.
444
496
  REG_S a6, A6_OFF2($sp)
445
497
  REG_S a7, A7_OFF2($sp)
446
498
 
499
+ #ifndef __mips_soft_float
447
500
  # Store all possible float/double registers.
448
501
  s.d $f12, F12_OFF2($sp)
449
502
  s.d $f13, F13_OFF2($sp)
@@ -453,13 +506,8 @@ ffi_closure_N32:
453
506
  s.d $f17, F17_OFF2($sp)
454
507
  s.d $f18, F18_OFF2($sp)
455
508
  s.d $f19, F19_OFF2($sp)
509
+ #endif
456
510
 
457
- # Call ffi_closure_mips_inner_N32 to do the real work.
458
- LA t9, ffi_closure_mips_inner_N32
459
- move a0, $12 # Pointer to the ffi_closure
460
- ADDU a1, $sp, V0_OFF2
461
- ADDU a2, $sp, A0_OFF2
462
- ADDU a3, $sp, F12_OFF2
463
511
  jalr t9
464
512
 
465
513
  # Return flags are in v0
@@ -473,6 +521,7 @@ cls_retint:
473
521
  b cls_epilogue
474
522
 
475
523
  cls_retfloat:
524
+ #ifndef __mips_soft_float
476
525
  bne v0, FFI_TYPE_FLOAT, cls_retdouble
477
526
  l.s $f0, V0_OFF2($sp)
478
527
  b cls_epilogue
@@ -515,6 +564,7 @@ cls_retstruct_f_d:
515
564
  l.s $f0, V0_OFF2($sp)
516
565
  l.d $f2, V1_OFF2($sp)
517
566
  b cls_epilogue
567
+ #endif
518
568
 
519
569
  cls_retstruct_small2:
520
570
  REG_L v0, V0_OFF2($sp)
@@ -546,46 +596,66 @@ cls_epilogue:
546
596
  .align EH_FRAME_ALIGN
547
597
  .LECIE1:
548
598
 
549
- .LSFDE1:
550
- .4byte .LEFDE1-.LASFDE1 # length.
551
- .LASFDE1:
552
- .4byte .LASFDE1-.Lframe1 # CIE_pointer.
553
- FDE_ADDR_BYTES .LFB3 # initial_location.
554
- FDE_ADDR_BYTES .LFE3-.LFB3 # address_range.
599
+ .LSFDE0:
600
+ .4byte .LEFDE0-.LASFDE0 # length.
601
+ .LASFDE0:
602
+ .4byte .LASFDE0-.Lframe1 # CIE_pointer.
603
+ FDE_ADDR_BYTES .LFB0 # initial_location.
604
+ FDE_ADDR_BYTES .LFE0-.LFB0 # address_range.
555
605
  .byte 0x4 # DW_CFA_advance_loc4
556
- .4byte .LCFI0-.LFB3 # to .LCFI0
606
+ .4byte .LCFI00-.LFB0 # to .LCFI00
557
607
  .byte 0xe # DW_CFA_def_cfa_offset
558
608
  .uleb128 SIZEOF_FRAME # adjust stack.by SIZEOF_FRAME
559
609
  .byte 0x4 # DW_CFA_advance_loc4
560
- .4byte .LCFI1-.LCFI0 # to .LCFI1
610
+ .4byte .LCFI01-.LCFI00 # to .LCFI01
561
611
  .byte 0x9e # DW_CFA_offset of $fp
562
612
  .uleb128 2*FFI_SIZEOF_ARG/4 #
563
613
  .byte 0x9f # DW_CFA_offset of ra
564
614
  .uleb128 1*FFI_SIZEOF_ARG/4 #
565
615
  .byte 0x4 # DW_CFA_advance_loc4
566
- .4byte .LCFI3-.LCFI1 # to .LCFI3
616
+ .4byte .LCFI02-.LCFI01 # to .LCFI02
567
617
  .byte 0xd # DW_CFA_def_cfa_register
568
618
  .uleb128 0x1e # in $fp
569
619
  .align EH_FRAME_ALIGN
620
+ .LEFDE0:
621
+
622
+ .LSFDE1:
623
+ .4byte .LEFDE1-.LASFDE1 # length
624
+ .LASFDE1:
625
+ .4byte .LASFDE1-.Lframe1 # CIE_pointer.
626
+ FDE_ADDR_BYTES .LFB1 # initial_location.
627
+ FDE_ADDR_BYTES .LFE1-.LFB1 # address_range.
628
+ .byte 0x4 # DW_CFA_advance_loc4
629
+ .4byte .LCFI10-.LFB1 # to .LCFI10
630
+ .byte 0xe # DW_CFA_def_cfa_offset
631
+ .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME
632
+ .byte 0x4 # DW_CFA_advance_loc4
633
+ .4byte .LCFI11-.LCFI10 # to .LCFI11
634
+ .byte 0x9c # DW_CFA_offset of $gp ($28)
635
+ .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
636
+ .byte 0x9f # DW_CFA_offset of ra ($31)
637
+ .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
638
+ .align EH_FRAME_ALIGN
570
639
  .LEFDE1:
571
- .LSFDE3:
572
- .4byte .LEFDE3-.LASFDE3 # length
573
- .LASFDE3:
574
- .4byte .LASFDE3-.Lframe1 # CIE_pointer.
640
+
641
+ .LSFDE2:
642
+ .4byte .LEFDE2-.LASFDE2 # length
643
+ .LASFDE2:
644
+ .4byte .LASFDE2-.Lframe1 # CIE_pointer.
575
645
  FDE_ADDR_BYTES .LFB2 # initial_location.
576
646
  FDE_ADDR_BYTES .LFE2-.LFB2 # address_range.
577
647
  .byte 0x4 # DW_CFA_advance_loc4
578
- .4byte .LCFI5-.LFB2 # to .LCFI5
648
+ .4byte .LCFI20-.LFB2 # to .LCFI20
579
649
  .byte 0xe # DW_CFA_def_cfa_offset
580
650
  .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME
581
651
  .byte 0x4 # DW_CFA_advance_loc4
582
- .4byte .LCFI6-.LCFI5 # to .LCFI6
652
+ .4byte .LCFI21-.LCFI20 # to .LCFI21
583
653
  .byte 0x9c # DW_CFA_offset of $gp ($28)
584
654
  .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
585
655
  .byte 0x9f # DW_CFA_offset of ra ($31)
586
656
  .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
587
657
  .align EH_FRAME_ALIGN
588
- .LEFDE3:
658
+ .LEFDE2:
589
659
  #endif /* __GNUC__ */
590
660
 
591
661
  #endif
@@ -50,14 +50,14 @@ ffi_call_O32:
50
50
  $LFB0:
51
51
  # Prologue
52
52
  SUBU $sp, SIZEOF_FRAME # Frame size
53
- $LCFI0:
53
+ $LCFI00:
54
54
  REG_S $fp, FP_OFF($sp) # Save frame pointer
55
- $LCFI1:
55
+ $LCFI01:
56
56
  REG_S ra, RA_OFF($sp) # Save return address
57
- $LCFI2:
57
+ $LCFI02:
58
58
  move $fp, $sp
59
59
 
60
- $LCFI3:
60
+ $LCFI03:
61
61
  move t9, callback # callback function pointer
62
62
  REG_S flags, A3_OFF($fp) # flags
63
63
 
@@ -82,13 +82,16 @@ sixteen:
82
82
 
83
83
  ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args
84
84
 
85
+ #ifndef __mips_soft_float
85
86
  bnez t0, pass_d # make it quick for int
87
+ #endif
86
88
  REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the
87
89
  REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs.
88
90
  REG_L a2, 2*FFI_SIZEOF_ARG($sp)
89
91
  REG_L a3, 3*FFI_SIZEOF_ARG($sp)
90
92
  b call_it
91
93
 
94
+ #ifndef __mips_soft_float
92
95
  pass_d:
93
96
  bne t0, FFI_ARGS_D, pass_f
94
97
  l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args
@@ -130,8 +133,12 @@ pass_f_d:
130
133
  # bne t0, FFI_ARGS_F_D, call_it
131
134
  l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args
132
135
  l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float
136
+ #endif
133
137
 
134
138
  call_it:
139
+ # Load the static chain pointer
140
+ REG_L t7, SIZEOF_FRAME + 6*FFI_SIZEOF_ARG($fp)
141
+
135
142
  # Load the function pointer
136
143
  REG_L t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp)
137
144
 
@@ -158,14 +165,23 @@ retfloat:
158
165
  bne t2, FFI_TYPE_FLOAT, retdouble
159
166
  jalr t9
160
167
  REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
168
+ #ifndef __mips_soft_float
161
169
  s.s $f0, 0(t0)
170
+ #else
171
+ REG_S v0, 0(t0)
172
+ #endif
162
173
  b epilogue
163
174
 
164
175
  retdouble:
165
176
  bne t2, FFI_TYPE_DOUBLE, noretval
166
177
  jalr t9
167
178
  REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
179
+ #ifndef __mips_soft_float
168
180
  s.d $f0, 0(t0)
181
+ #else
182
+ REG_S v1, 4(t0)
183
+ REG_S v0, 0(t0)
184
+ #endif
169
185
  b epilogue
170
186
 
171
187
  noretval:
@@ -204,13 +220,15 @@ $LFE0:
204
220
  -8 - f14 (le low, be high)
205
221
  -9 - f12 (le high, be low)
206
222
  -10 - f12 (le low, be high)
207
- -11 - Called function a3 save
208
- -12 - Called function a2 save
209
- -13 - Called function a1 save
210
- -14 - Called function a0 save, our sp and fp point here
223
+ -11 - Called function a5 save
224
+ -12 - Called function a4 save
225
+ -13 - Called function a3 save
226
+ -14 - Called function a2 save
227
+ -15 - Called function a1 save
228
+ -16 - Called function a0 save, our sp and fp point here
211
229
  */
212
230
 
213
- #define SIZEOF_FRAME2 (14 * FFI_SIZEOF_ARG)
231
+ #define SIZEOF_FRAME2 (16 * FFI_SIZEOF_ARG)
214
232
  #define A3_OFF2 (SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG)
215
233
  #define A2_OFF2 (SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG)
216
234
  #define A1_OFF2 (SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG)
@@ -225,13 +243,71 @@ $LFE0:
225
243
  #define FA_1_0_OFF2 (SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG)
226
244
  #define FA_0_1_OFF2 (SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG)
227
245
  #define FA_0_0_OFF2 (SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG)
246
+ #define CALLED_A5_OFF2 (SIZEOF_FRAME2 - 11 * FFI_SIZEOF_ARG)
247
+ #define CALLED_A4_OFF2 (SIZEOF_FRAME2 - 12 * FFI_SIZEOF_ARG)
228
248
 
229
249
  .text
250
+
251
+ .align 2
252
+ .globl ffi_go_closure_O32
253
+ .ent ffi_go_closure_O32
254
+ ffi_go_closure_O32:
255
+ $LFB1:
256
+ # Prologue
257
+ .frame $fp, SIZEOF_FRAME2, ra
258
+ .set noreorder
259
+ .cpload t9
260
+ .set reorder
261
+ SUBU $sp, SIZEOF_FRAME2
262
+ .cprestore GP_OFF2
263
+ $LCFI10:
264
+
265
+ REG_S $16, S0_OFF2($sp) # Save s0
266
+ REG_S $fp, FP_OFF2($sp) # Save frame pointer
267
+ REG_S ra, RA_OFF2($sp) # Save return address
268
+ $LCFI11:
269
+
270
+ move $fp, $sp
271
+ $LCFI12:
272
+
273
+ REG_S a0, A0_OFF2($fp)
274
+ REG_S a1, A1_OFF2($fp)
275
+ REG_S a2, A2_OFF2($fp)
276
+ REG_S a3, A3_OFF2($fp)
277
+
278
+ # Load ABI enum to s0
279
+ REG_L $16, 4($15) # cif
280
+ REG_L $16, 0($16) # abi is first member.
281
+
282
+ li $13, 1 # FFI_O32
283
+ bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT
284
+
285
+ # Store all possible float/double registers.
286
+ s.d $f12, FA_0_0_OFF2($fp)
287
+ s.d $f14, FA_1_0_OFF2($fp)
288
+ 1:
289
+ # prepare arguments for ffi_closure_mips_inner_O32
290
+ REG_L a0, 4($15) # cif
291
+ REG_L a1, 8($15) # fun
292
+ move a2, $15 # user_data = go closure
293
+ addu a3, $fp, V0_OFF2 # rvalue
294
+
295
+ addu t9, $fp, A0_OFF2 # ar
296
+ REG_S t9, CALLED_A4_OFF2($fp)
297
+
298
+ addu t9, $fp, FA_0_0_OFF2 #fpr
299
+ REG_S t9, CALLED_A5_OFF2($fp)
300
+
301
+ b $do_closure
302
+
303
+ $LFE1:
304
+ .end ffi_go_closure_O32
305
+
230
306
  .align 2
231
307
  .globl ffi_closure_O32
232
308
  .ent ffi_closure_O32
233
309
  ffi_closure_O32:
234
- $LFB1:
310
+ $LFB2:
235
311
  # Prologue
236
312
  .frame $fp, SIZEOF_FRAME2, ra
237
313
  .set noreorder
@@ -239,14 +315,14 @@ $LFB1:
239
315
  .set reorder
240
316
  SUBU $sp, SIZEOF_FRAME2
241
317
  .cprestore GP_OFF2
242
- $LCFI4:
318
+ $LCFI20:
243
319
  REG_S $16, S0_OFF2($sp) # Save s0
244
320
  REG_S $fp, FP_OFF2($sp) # Save frame pointer
245
321
  REG_S ra, RA_OFF2($sp) # Save return address
246
- $LCFI6:
322
+ $LCFI21:
247
323
  move $fp, $sp
248
324
 
249
- $LCFI7:
325
+ $LCFI22:
250
326
  # Store all possible argument registers. If there are more than
251
327
  # four arguments, then they are stored above where we put a3.
252
328
  REG_S a0, A0_OFF2($fp)
@@ -261,16 +337,27 @@ $LCFI7:
261
337
  li $13, 1 # FFI_O32
262
338
  bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT
263
339
 
340
+ #ifndef __mips_soft_float
264
341
  # Store all possible float/double registers.
265
342
  s.d $f12, FA_0_0_OFF2($fp)
266
343
  s.d $f14, FA_1_0_OFF2($fp)
344
+ #endif
267
345
  1:
268
- # Call ffi_closure_mips_inner_O32 to do the work.
346
+ # prepare arguments for ffi_closure_mips_inner_O32
347
+ REG_L a0, 20($12) # cif pointer follows tramp.
348
+ REG_L a1, 24($12) # fun
349
+ REG_L a2, 28($12) # user_data
350
+ addu a3, $fp, V0_OFF2 # rvalue
351
+
352
+ addu t9, $fp, A0_OFF2 # ar
353
+ REG_S t9, CALLED_A4_OFF2($fp)
354
+
355
+ addu t9, $fp, FA_0_0_OFF2 #fpr
356
+ REG_S t9, CALLED_A5_OFF2($fp)
357
+
358
+ $do_closure:
269
359
  la t9, ffi_closure_mips_inner_O32
270
- move a0, $12 # Pointer to the ffi_closure
271
- addu a1, $fp, V0_OFF2
272
- addu a2, $fp, A0_OFF2
273
- addu a3, $fp, FA_0_0_OFF2
360
+ # Call ffi_closure_mips_inner_O32 to do the work.
274
361
  jalr t9
275
362
 
276
363
  # Load the return value into the appropriate register.
@@ -281,6 +368,7 @@ $LCFI7:
281
368
  li $13, 1 # FFI_O32
282
369
  bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT
283
370
 
371
+ #ifndef __mips_soft_float
284
372
  li $9, FFI_TYPE_FLOAT
285
373
  l.s $f0, V0_OFF2($fp)
286
374
  beq $8, $9, closure_done
@@ -288,6 +376,7 @@ $LCFI7:
288
376
  li $9, FFI_TYPE_DOUBLE
289
377
  l.d $f0, V0_OFF2($fp)
290
378
  beq $8, $9, closure_done
379
+ #endif
291
380
  1:
292
381
  REG_L $3, V1_OFF2($fp)
293
382
  REG_L $2, V0_OFF2($fp)
@@ -300,7 +389,7 @@ closure_done:
300
389
  REG_L ra, RA_OFF2($sp) # Restore return address
301
390
  ADDU $sp, SIZEOF_FRAME2
302
391
  j ra
303
- $LFE1:
392
+ $LFE2:
304
393
  .end ffi_closure_O32
305
394
 
306
395
  /* DWARF-2 unwind info. */
@@ -322,6 +411,7 @@ $LSCIE0:
322
411
  .uleb128 0x0
323
412
  .align 2
324
413
  $LECIE0:
414
+
325
415
  $LSFDE0:
326
416
  .4byte $LEFDE0-$LASFDE0 # FDE Length
327
417
  $LASFDE0:
@@ -330,11 +420,11 @@ $LASFDE0:
330
420
  .4byte $LFE0-$LFB0 # FDE address range
331
421
  .uleb128 0x0 # Augmentation size
332
422
  .byte 0x4 # DW_CFA_advance_loc4
333
- .4byte $LCFI0-$LFB0
423
+ .4byte $LCFI00-$LFB0
334
424
  .byte 0xe # DW_CFA_def_cfa_offset
335
425
  .uleb128 0x18
336
426
  .byte 0x4 # DW_CFA_advance_loc4
337
- .4byte $LCFI2-$LCFI0
427
+ .4byte $LCFI01-$LCFI00
338
428
  .byte 0x11 # DW_CFA_offset_extended_sf
339
429
  .uleb128 0x1e # $fp
340
430
  .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp)
@@ -342,12 +432,13 @@ $LASFDE0:
342
432
  .uleb128 0x1f # $ra
343
433
  .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
344
434
  .byte 0x4 # DW_CFA_advance_loc4
345
- .4byte $LCFI3-$LCFI2
435
+ .4byte $LCFI02-$LCFI01
346
436
  .byte 0xc # DW_CFA_def_cfa
347
437
  .uleb128 0x1e
348
438
  .uleb128 0x18
349
439
  .align 2
350
440
  $LEFDE0:
441
+
351
442
  $LSFDE1:
352
443
  .4byte $LEFDE1-$LASFDE1 # FDE Length
353
444
  $LASFDE1:
@@ -356,11 +447,11 @@ $LASFDE1:
356
447
  .4byte $LFE1-$LFB1 # FDE address range
357
448
  .uleb128 0x0 # Augmentation size
358
449
  .byte 0x4 # DW_CFA_advance_loc4
359
- .4byte $LCFI4-$LFB1
450
+ .4byte $LCFI10-$LFB1
360
451
  .byte 0xe # DW_CFA_def_cfa_offset
361
- .uleb128 0x38
452
+ .uleb128 SIZEOF_FRAME2
362
453
  .byte 0x4 # DW_CFA_advance_loc4
363
- .4byte $LCFI6-$LCFI4
454
+ .4byte $LCFI11-$LCFI10
364
455
  .byte 0x11 # DW_CFA_offset_extended_sf
365
456
  .uleb128 0x10 # $16
366
457
  .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp)
@@ -371,11 +462,41 @@ $LASFDE1:
371
462
  .uleb128 0x1f # $ra
372
463
  .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
373
464
  .byte 0x4 # DW_CFA_advance_loc4
374
- .4byte $LCFI7-$LCFI6
465
+ .4byte $LCFI12-$LCFI11
375
466
  .byte 0xc # DW_CFA_def_cfa
376
467
  .uleb128 0x1e
377
- .uleb128 0x38
468
+ .uleb128 SIZEOF_FRAME2
378
469
  .align 2
379
470
  $LEFDE1:
380
471
 
472
+ $LSFDE2:
473
+ .4byte $LEFDE2-$LASFDE2 # FDE Length
474
+ $LASFDE2:
475
+ .4byte $LASFDE2-$Lframe0 # FDE CIE offset
476
+ .4byte $LFB2 # FDE initial location
477
+ .4byte $LFE2-$LFB2 # FDE address range
478
+ .uleb128 0x0 # Augmentation size
479
+ .byte 0x4 # DW_CFA_advance_loc4
480
+ .4byte $LCFI20-$LFB2
481
+ .byte 0xe # DW_CFA_def_cfa_offset
482
+ .uleb128 SIZEOF_FRAME2
483
+ .byte 0x4 # DW_CFA_advance_loc4
484
+ .4byte $LCFI21-$LCFI20
485
+ .byte 0x11 # DW_CFA_offset_extended_sf
486
+ .uleb128 0x10 # $16
487
+ .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp)
488
+ .byte 0x11 # DW_CFA_offset_extended_sf
489
+ .uleb128 0x1e # $fp
490
+ .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp)
491
+ .byte 0x11 # DW_CFA_offset_extended_sf
492
+ .uleb128 0x1f # $ra
493
+ .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
494
+ .byte 0x4 # DW_CFA_advance_loc4
495
+ .4byte $LCFI22-$LCFI21
496
+ .byte 0xc # DW_CFA_def_cfa
497
+ .uleb128 0x1e
498
+ .uleb128 SIZEOF_FRAME2
499
+ .align 2
500
+ $LEFDE2:
501
+
381
502
  #endif