ffi 0.4.0-x86-mswin32

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 (316) hide show
  1. data/LICENSE +51 -0
  2. data/README.rdoc +69 -0
  3. data/Rakefile +142 -0
  4. data/ext/ffi_c/AbstractMemory.c +412 -0
  5. data/ext/ffi_c/AbstractMemory.h +68 -0
  6. data/ext/ffi_c/AutoPointer.c +60 -0
  7. data/ext/ffi_c/AutoPointer.h +18 -0
  8. data/ext/ffi_c/Buffer.c +171 -0
  9. data/ext/ffi_c/Callback.c +374 -0
  10. data/ext/ffi_c/Callback.h +47 -0
  11. data/ext/ffi_c/DynamicLibrary.c +213 -0
  12. data/ext/ffi_c/DynamicLibrary.h +22 -0
  13. data/ext/ffi_c/Invoker.c +962 -0
  14. data/ext/ffi_c/LastError.c +135 -0
  15. data/ext/ffi_c/LastError.h +18 -0
  16. data/ext/ffi_c/MemoryPointer.c +156 -0
  17. data/ext/ffi_c/MemoryPointer.h +20 -0
  18. data/ext/ffi_c/NullPointer.c +143 -0
  19. data/ext/ffi_c/Platform.c +59 -0
  20. data/ext/ffi_c/Platform.h +16 -0
  21. data/ext/ffi_c/Pointer.c +164 -0
  22. data/ext/ffi_c/Pointer.h +25 -0
  23. data/ext/ffi_c/Struct.c +477 -0
  24. data/ext/ffi_c/Struct.h +26 -0
  25. data/ext/ffi_c/Type.c +230 -0
  26. data/ext/ffi_c/Type.h +28 -0
  27. data/ext/ffi_c/Types.c +118 -0
  28. data/ext/ffi_c/Types.h +54 -0
  29. data/ext/ffi_c/compat.h +22 -0
  30. data/ext/ffi_c/endian.h +40 -0
  31. data/ext/ffi_c/extconf.rb +31 -0
  32. data/ext/ffi_c/ffi.c +76 -0
  33. data/ext/ffi_c/libffi.bsd.mk +34 -0
  34. data/ext/ffi_c/libffi.darwin.mk +75 -0
  35. data/ext/ffi_c/libffi.gnu.mk +29 -0
  36. data/ext/ffi_c/libffi.mk +13 -0
  37. data/ext/ffi_c/libffi/ChangeLog +3243 -0
  38. data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
  39. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  40. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  41. data/ext/ffi_c/libffi/LICENSE +21 -0
  42. data/ext/ffi_c/libffi/Makefile.am +177 -0
  43. data/ext/ffi_c/libffi/Makefile.in +1640 -0
  44. data/ext/ffi_c/libffi/README +328 -0
  45. data/ext/ffi_c/libffi/TODO +1 -0
  46. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  47. data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
  48. data/ext/ffi_c/libffi/compile +142 -0
  49. data/ext/ffi_c/libffi/config.guess +1516 -0
  50. data/ext/ffi_c/libffi/config.sub +1626 -0
  51. data/ext/ffi_c/libffi/configure +24414 -0
  52. data/ext/ffi_c/libffi/configure.ac +365 -0
  53. data/ext/ffi_c/libffi/configure.host +11 -0
  54. data/ext/ffi_c/libffi/depcomp +584 -0
  55. data/ext/ffi_c/libffi/doc/libffi.info +533 -0
  56. data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
  57. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  58. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  59. data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
  60. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  61. data/ext/ffi_c/libffi/include/Makefile.in +422 -0
  62. data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
  63. data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
  64. data/ext/ffi_c/libffi/install-sh +323 -0
  65. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  66. data/ext/ffi_c/libffi/libtool-version +29 -0
  67. data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
  68. data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
  69. data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
  70. data/ext/ffi_c/libffi/ltconfig +2862 -0
  71. data/ext/ffi_c/libffi/ltmain.sh +6930 -0
  72. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  73. data/ext/ffi_c/libffi/man/Makefile.in +395 -0
  74. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  75. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  76. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  77. data/ext/ffi_c/libffi/mdate-sh +201 -0
  78. data/ext/ffi_c/libffi/missing +353 -0
  79. data/ext/ffi_c/libffi/mkinstalldirs +158 -0
  80. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  81. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  82. data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
  83. data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
  84. data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
  85. data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
  86. data/ext/ffi_c/libffi/src/closures.c +596 -0
  87. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  88. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  89. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  90. data/ext/ffi_c/libffi/src/debug.c +59 -0
  91. data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
  92. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  93. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  94. data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
  95. data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
  96. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  97. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  98. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  99. data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
  100. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  101. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  102. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  103. data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
  104. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  105. data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
  106. data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
  107. data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
  108. data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
  109. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  110. data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
  111. data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
  112. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  113. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  114. data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
  115. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
  116. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  117. data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
  118. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
  119. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
  120. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
  121. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
  122. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  123. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  124. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  125. data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
  126. data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
  127. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  128. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  129. data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
  130. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  131. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  132. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  133. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  134. data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
  135. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  136. data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
  137. data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
  138. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
  139. data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
  140. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  141. data/ext/ffi_c/libffi/src/types.c +77 -0
  142. data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
  143. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  144. data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
  145. data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
  146. data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
  147. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  148. data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
  149. data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
  150. data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
  151. data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
  152. data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
  153. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  154. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
  155. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  156. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  267. data/ext/ffi_c/libffi/texinfo.tex +7482 -0
  268. data/ext/ffi_c/rbffi.h +23 -0
  269. data/gen/Rakefile +12 -0
  270. data/lib/1.8/ffi_c.so +0 -0
  271. data/lib/1.9/ffi_c.so +0 -0
  272. data/lib/ffi.rb +11 -0
  273. data/lib/ffi/autopointer.rb +61 -0
  274. data/lib/ffi/buffer.rb +0 -0
  275. data/lib/ffi/callback.rb +10 -0
  276. data/lib/ffi/enum.rb +78 -0
  277. data/lib/ffi/errno.rb +8 -0
  278. data/lib/ffi/ffi.rb +96 -0
  279. data/lib/ffi/io.rb +21 -0
  280. data/lib/ffi/library.rb +243 -0
  281. data/lib/ffi/managedstruct.rb +55 -0
  282. data/lib/ffi/memorypointer.rb +73 -0
  283. data/lib/ffi/platform.rb +78 -0
  284. data/lib/ffi/pointer.rb +119 -0
  285. data/lib/ffi/struct.rb +354 -0
  286. data/lib/ffi/tools/const_generator.rb +177 -0
  287. data/lib/ffi/tools/generator.rb +58 -0
  288. data/lib/ffi/tools/generator_task.rb +35 -0
  289. data/lib/ffi/tools/struct_generator.rb +194 -0
  290. data/lib/ffi/tools/types_generator.rb +123 -0
  291. data/lib/ffi/types.rb +153 -0
  292. data/lib/ffi/union.rb +17 -0
  293. data/lib/ffi/variadic.rb +30 -0
  294. data/spec/ffi/bool_spec.rb +24 -0
  295. data/spec/ffi/buffer_spec.rb +196 -0
  296. data/spec/ffi/callback_spec.rb +560 -0
  297. data/spec/ffi/enum_spec.rb +164 -0
  298. data/spec/ffi/errno_spec.rb +13 -0
  299. data/spec/ffi/library_spec.rb +144 -0
  300. data/spec/ffi/managed_struct_spec.rb +56 -0
  301. data/spec/ffi/number_spec.rb +231 -0
  302. data/spec/ffi/pointer_spec.rb +195 -0
  303. data/spec/ffi/rbx/attach_function_spec.rb +27 -0
  304. data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
  305. data/spec/ffi/rbx/spec_helper.rb +1 -0
  306. data/spec/ffi/rbx/struct_spec.rb +13 -0
  307. data/spec/ffi/spec_helper.rb +17 -0
  308. data/spec/ffi/string_spec.rb +103 -0
  309. data/spec/ffi/struct_callback_spec.rb +41 -0
  310. data/spec/ffi/struct_initialize_spec.rb +30 -0
  311. data/spec/ffi/struct_spec.rb +476 -0
  312. data/spec/ffi/typedef_spec.rb +48 -0
  313. data/spec/ffi/union_spec.rb +60 -0
  314. data/spec/ffi/variadic_spec.rb +84 -0
  315. data/spec/spec.opts +4 -0
  316. metadata +375 -0
@@ -0,0 +1,202 @@
1
+ /* -----------------------------------------------------------------*-C-*-
2
+ ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
3
+ Target configuration macros for MIPS.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ ``Software''), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included
14
+ in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
+ DEALINGS IN THE SOFTWARE.
24
+
25
+ ----------------------------------------------------------------------- */
26
+
27
+ #ifndef LIBFFI_TARGET_H
28
+ #define LIBFFI_TARGET_H
29
+
30
+ #ifdef linux
31
+ #include <asm/sgidefs.h>
32
+ # ifndef _ABIN32
33
+ # define _ABIN32 _MIPS_SIM_NABI32
34
+ # endif
35
+ # ifndef _ABI64
36
+ # define _ABI64 _MIPS_SIM_ABI64
37
+ # endif
38
+ # ifndef _ABIO32
39
+ # define _ABIO32 _MIPS_SIM_ABI32
40
+ # endif
41
+ #endif
42
+
43
+ #if !defined(_MIPS_SIM)
44
+ -- something is very wrong --
45
+ #else
46
+ # if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64))
47
+ # define FFI_MIPS_N32
48
+ # else
49
+ # if (_MIPS_SIM==_ABIO32 && defined(_ABIO32))
50
+ # define FFI_MIPS_O32
51
+ # else
52
+ -- this is an unsupported platform --
53
+ # endif
54
+ # endif
55
+ #endif
56
+
57
+ #ifdef FFI_MIPS_O32
58
+ /* O32 stack frames have 32bit integer args */
59
+ # define FFI_SIZEOF_ARG 4
60
+ #else
61
+ /* N32 and N64 frames have 64bit integer args */
62
+ # define FFI_SIZEOF_ARG 8
63
+ # if _MIPS_SIM == _ABIN32
64
+ # define FFI_SIZEOF_JAVA_RAW 4
65
+ # endif
66
+ #endif
67
+
68
+ #define FFI_FLAG_BITS 2
69
+
70
+ /* SGI's strange assembler requires that we multiply by 4 rather
71
+ than shift left by FFI_FLAG_BITS */
72
+
73
+ #define FFI_ARGS_D FFI_TYPE_DOUBLE
74
+ #define FFI_ARGS_F FFI_TYPE_FLOAT
75
+ #define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE
76
+ #define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT
77
+ #define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT
78
+ #define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE
79
+
80
+ /* Needed for N32 structure returns */
81
+ #define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8
82
+ #define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8
83
+
84
+ #if 0
85
+ /* The SGI assembler can't handle this.. */
86
+ #define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT
87
+ /* (and so on) */
88
+ #else
89
+ /* ...so we calculate these by hand! */
90
+ #define FFI_TYPE_STRUCT_D 61
91
+ #define FFI_TYPE_STRUCT_F 45
92
+ #define FFI_TYPE_STRUCT_DD 253
93
+ #define FFI_TYPE_STRUCT_FF 173
94
+ #define FFI_TYPE_STRUCT_FD 237
95
+ #define FFI_TYPE_STRUCT_DF 189
96
+ #define FFI_TYPE_STRUCT_SMALL 93
97
+ #define FFI_TYPE_STRUCT_SMALL2 109
98
+ #endif
99
+
100
+ #ifdef LIBFFI_ASM
101
+ #define v0 $2
102
+ #define v1 $3
103
+ #define a0 $4
104
+ #define a1 $5
105
+ #define a2 $6
106
+ #define a3 $7
107
+ #define a4 $8
108
+ #define a5 $9
109
+ #define a6 $10
110
+ #define a7 $11
111
+ #define t0 $8
112
+ #define t1 $9
113
+ #define t2 $10
114
+ #define t3 $11
115
+ #define t4 $12
116
+ #define t5 $13
117
+ #define t6 $14
118
+ #define t7 $15
119
+ #define t8 $24
120
+ #define t9 $25
121
+ #define ra $31
122
+
123
+ #ifdef FFI_MIPS_O32
124
+ # define REG_L lw
125
+ # define REG_S sw
126
+ # define SUBU subu
127
+ # define ADDU addu
128
+ # define SRL srl
129
+ # define LI li
130
+ #else /* !FFI_MIPS_O32 */
131
+ # define REG_L ld
132
+ # define REG_S sd
133
+ # define SUBU dsubu
134
+ # define ADDU daddu
135
+ # define SRL dsrl
136
+ # define LI dli
137
+ # if (_MIPS_SIM==_ABI64)
138
+ # define LA dla
139
+ # define EH_FRAME_ALIGN 3
140
+ # define FDE_ADDR_BYTES .8byte
141
+ # else
142
+ # define LA la
143
+ # define EH_FRAME_ALIGN 2
144
+ # define FDE_ADDR_BYTES .4byte
145
+ # endif /* _MIPS_SIM==_ABI64 */
146
+ #endif /* !FFI_MIPS_O32 */
147
+ #else /* !LIBFFI_ASM */
148
+ #ifdef FFI_MIPS_O32
149
+ /* O32 stack frames have 32bit integer args */
150
+ typedef unsigned int ffi_arg __attribute__((__mode__(__SI__)));
151
+ typedef signed int ffi_sarg __attribute__((__mode__(__SI__)));
152
+ #else
153
+ /* N32 and N64 frames have 64bit integer args */
154
+ typedef unsigned int ffi_arg __attribute__((__mode__(__DI__)));
155
+ typedef signed int ffi_sarg __attribute__((__mode__(__DI__)));
156
+ #endif
157
+
158
+ typedef enum ffi_abi {
159
+ FFI_FIRST_ABI = 0,
160
+ FFI_O32,
161
+ FFI_N32,
162
+ FFI_N64,
163
+ FFI_O32_SOFT_FLOAT,
164
+
165
+ #ifdef FFI_MIPS_O32
166
+ #ifdef __mips_soft_float
167
+ FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT,
168
+ #else
169
+ FFI_DEFAULT_ABI = FFI_O32,
170
+ #endif
171
+ #else
172
+ # if _MIPS_SIM==_ABI64
173
+ FFI_DEFAULT_ABI = FFI_N64,
174
+ # else
175
+ FFI_DEFAULT_ABI = FFI_N32,
176
+ # endif
177
+ #endif
178
+
179
+ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
180
+ } ffi_abi;
181
+
182
+ #define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag
183
+ #endif /* !LIBFFI_ASM */
184
+
185
+ /* ---- Definitions for closures ----------------------------------------- */
186
+
187
+ #if defined(FFI_MIPS_O32)
188
+ #define FFI_CLOSURES 1
189
+ #define FFI_TRAMPOLINE_SIZE 20
190
+ #else
191
+ /* N32/N64. */
192
+ # define FFI_CLOSURES 1
193
+ #if _MIPS_SIM==_ABI64
194
+ #define FFI_TRAMPOLINE_SIZE 52
195
+ #else
196
+ #define FFI_TRAMPOLINE_SIZE 20
197
+ #endif
198
+ #endif /* FFI_MIPS_O32 */
199
+ #define FFI_NATIVE_RAW_API 0
200
+
201
+ #endif
202
+
@@ -0,0 +1,534 @@
1
+ /* -----------------------------------------------------------------------
2
+ n32.S - Copyright (c) 1996, 1998, 2005 Red Hat, Inc.
3
+
4
+ MIPS Foreign Function Interface
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ ``Software''), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included
15
+ in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
21
+ ANY CLAIM, DAMAGES OR
22
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24
+ OTHER DEALINGS IN THE SOFTWARE.
25
+ ----------------------------------------------------------------------- */
26
+
27
+ #define LIBFFI_ASM
28
+ #include <fficonfig.h>
29
+ #include <ffi.h>
30
+
31
+ /* Only build this code if we are compiling for n32 */
32
+
33
+ #if defined(FFI_MIPS_N32)
34
+
35
+ #define callback a0
36
+ #define bytes a2
37
+ #define flags a3
38
+ #define raddr a4
39
+ #define fn a5
40
+
41
+ #define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG )
42
+
43
+ .abicalls
44
+ .text
45
+ .align 2
46
+ .globl ffi_call_N32
47
+ .ent ffi_call_N32
48
+ ffi_call_N32:
49
+ .LFB3:
50
+ .frame $fp, SIZEOF_FRAME, ra
51
+ .mask 0xc0000000,-FFI_SIZEOF_ARG
52
+ .fmask 0x00000000,0
53
+
54
+ # Prologue
55
+ SUBU $sp, SIZEOF_FRAME # Frame size
56
+ .LCFI0:
57
+ REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer
58
+ REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address
59
+ .LCFI1:
60
+ move $fp, $sp
61
+ .LCFI3:
62
+ move t9, callback # callback function pointer
63
+ REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes
64
+ REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags
65
+ REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr
66
+ REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn
67
+
68
+ # Allocate at least 4 words in the argstack
69
+ move v0, bytes
70
+ bge bytes, 4 * FFI_SIZEOF_ARG, bigger
71
+ LI v0, 4 * FFI_SIZEOF_ARG
72
+ b sixteen
73
+
74
+ bigger:
75
+ ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned
76
+ and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry.
77
+
78
+ sixteen:
79
+ SUBU $sp, $sp, v0 # move the stack pointer to reflect the
80
+ # arg space
81
+
82
+ move a0, $sp # 4 * FFI_SIZEOF_ARG
83
+ ADDU a3, $fp, 3 * FFI_SIZEOF_ARG
84
+
85
+ # Call ffi_prep_args
86
+ jal t9
87
+
88
+ # Copy the stack pointer to t9
89
+ move t9, $sp
90
+
91
+ # Fix the stack if there are more than 8 64bit slots worth
92
+ # of arguments.
93
+
94
+ # Load the number of bytes
95
+ REG_L t6, 2*FFI_SIZEOF_ARG($fp)
96
+
97
+ # Is it bigger than 8 * FFI_SIZEOF_ARG?
98
+ daddiu t8, t6, -(8 * FFI_SIZEOF_ARG)
99
+ bltz t8, loadregs
100
+
101
+ ADDU t9, t9, t8
102
+
103
+ loadregs:
104
+
105
+ REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6.
106
+
107
+ and t4, t6, ((1<<FFI_FLAG_BITS)-1)
108
+ bnez t4, arg1_floatp
109
+ REG_L a0, 0*FFI_SIZEOF_ARG(t9)
110
+ b arg1_next
111
+ arg1_floatp:
112
+ bne t4, FFI_TYPE_FLOAT, arg1_doublep
113
+ l.s $f12, 0*FFI_SIZEOF_ARG(t9)
114
+ b arg1_next
115
+ arg1_doublep:
116
+ l.d $f12, 0*FFI_SIZEOF_ARG(t9)
117
+ arg1_next:
118
+
119
+ SRL t4, t6, 1*FFI_FLAG_BITS
120
+ and t4, ((1<<FFI_FLAG_BITS)-1)
121
+ bnez t4, arg2_floatp
122
+ REG_L a1, 1*FFI_SIZEOF_ARG(t9)
123
+ b arg2_next
124
+ arg2_floatp:
125
+ bne t4, FFI_TYPE_FLOAT, arg2_doublep
126
+ l.s $f13, 1*FFI_SIZEOF_ARG(t9)
127
+ b arg2_next
128
+ arg2_doublep:
129
+ l.d $f13, 1*FFI_SIZEOF_ARG(t9)
130
+ arg2_next:
131
+
132
+ SRL t4, t6, 2*FFI_FLAG_BITS
133
+ and t4, ((1<<FFI_FLAG_BITS)-1)
134
+ bnez t4, arg3_floatp
135
+ REG_L a2, 2*FFI_SIZEOF_ARG(t9)
136
+ b arg3_next
137
+ arg3_floatp:
138
+ bne t4, FFI_TYPE_FLOAT, arg3_doublep
139
+ l.s $f14, 2*FFI_SIZEOF_ARG(t9)
140
+ b arg3_next
141
+ arg3_doublep:
142
+ l.d $f14, 2*FFI_SIZEOF_ARG(t9)
143
+ arg3_next:
144
+
145
+ SRL t4, t6, 3*FFI_FLAG_BITS
146
+ and t4, ((1<<FFI_FLAG_BITS)-1)
147
+ bnez t4, arg4_floatp
148
+ REG_L a3, 3*FFI_SIZEOF_ARG(t9)
149
+ b arg4_next
150
+ arg4_floatp:
151
+ bne t4, FFI_TYPE_FLOAT, arg4_doublep
152
+ l.s $f15, 3*FFI_SIZEOF_ARG(t9)
153
+ b arg4_next
154
+ arg4_doublep:
155
+ l.d $f15, 3*FFI_SIZEOF_ARG(t9)
156
+ arg4_next:
157
+
158
+ SRL t4, t6, 4*FFI_FLAG_BITS
159
+ and t4, ((1<<FFI_FLAG_BITS)-1)
160
+ bnez t4, arg5_floatp
161
+ REG_L a4, 4*FFI_SIZEOF_ARG(t9)
162
+ b arg5_next
163
+ arg5_floatp:
164
+ bne t4, FFI_TYPE_FLOAT, arg5_doublep
165
+ l.s $f16, 4*FFI_SIZEOF_ARG(t9)
166
+ b arg5_next
167
+ arg5_doublep:
168
+ l.d $f16, 4*FFI_SIZEOF_ARG(t9)
169
+ arg5_next:
170
+
171
+ SRL t4, t6, 5*FFI_FLAG_BITS
172
+ and t4, ((1<<FFI_FLAG_BITS)-1)
173
+ bnez t4, arg6_floatp
174
+ REG_L a5, 5*FFI_SIZEOF_ARG(t9)
175
+ b arg6_next
176
+ arg6_floatp:
177
+ bne t4, FFI_TYPE_FLOAT, arg6_doublep
178
+ l.s $f17, 5*FFI_SIZEOF_ARG(t9)
179
+ b arg6_next
180
+ arg6_doublep:
181
+ l.d $f17, 5*FFI_SIZEOF_ARG(t9)
182
+ arg6_next:
183
+
184
+ SRL t4, t6, 6*FFI_FLAG_BITS
185
+ and t4, ((1<<FFI_FLAG_BITS)-1)
186
+ bnez t4, arg7_floatp
187
+ REG_L a6, 6*FFI_SIZEOF_ARG(t9)
188
+ b arg7_next
189
+ arg7_floatp:
190
+ bne t4, FFI_TYPE_FLOAT, arg7_doublep
191
+ l.s $f18, 6*FFI_SIZEOF_ARG(t9)
192
+ b arg7_next
193
+ arg7_doublep:
194
+ l.d $f18, 6*FFI_SIZEOF_ARG(t9)
195
+ arg7_next:
196
+
197
+ SRL t4, t6, 7*FFI_FLAG_BITS
198
+ and t4, ((1<<FFI_FLAG_BITS)-1)
199
+ bnez t4, arg8_floatp
200
+ REG_L a7, 7*FFI_SIZEOF_ARG(t9)
201
+ b arg8_next
202
+ arg8_floatp:
203
+ bne t4, FFI_TYPE_FLOAT, arg8_doublep
204
+ l.s $f19, 7*FFI_SIZEOF_ARG(t9)
205
+ b arg8_next
206
+ arg8_doublep:
207
+ l.d $f19, 7*FFI_SIZEOF_ARG(t9)
208
+ arg8_next:
209
+
210
+ callit:
211
+ # Load the function pointer
212
+ REG_L t9, 5*FFI_SIZEOF_ARG($fp)
213
+
214
+ # If the return value pointer is NULL, assume no return value.
215
+ REG_L t5, 4*FFI_SIZEOF_ARG($fp)
216
+ beqz t5, noretval
217
+
218
+ # Shift the return type flag over
219
+ SRL t6, 8*FFI_FLAG_BITS
220
+
221
+ bne t6, FFI_TYPE_INT, retfloat
222
+ jal t9
223
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
224
+ REG_S v0, 0(t4)
225
+ b epilogue
226
+
227
+ retfloat:
228
+ bne t6, FFI_TYPE_FLOAT, retdouble
229
+ jal t9
230
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
231
+ s.s $f0, 0(t4)
232
+ b epilogue
233
+
234
+ retdouble:
235
+ bne t6, FFI_TYPE_DOUBLE, retstruct_d
236
+ jal t9
237
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
238
+ s.d $f0, 0(t4)
239
+ b epilogue
240
+
241
+ retstruct_d:
242
+ bne t6, FFI_TYPE_STRUCT_D, retstruct_f
243
+ jal t9
244
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
245
+ s.d $f0, 0(t4)
246
+ b epilogue
247
+
248
+ retstruct_f:
249
+ bne t6, FFI_TYPE_STRUCT_F, retstruct_d_d
250
+ jal t9
251
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
252
+ s.s $f0, 0(t4)
253
+ b epilogue
254
+
255
+ retstruct_d_d:
256
+ bne t6, FFI_TYPE_STRUCT_DD, retstruct_f_f
257
+ jal t9
258
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
259
+ s.d $f0, 0(t4)
260
+ s.d $f2, 8(t4)
261
+ b epilogue
262
+
263
+ retstruct_f_f:
264
+ bne t6, FFI_TYPE_STRUCT_FF, retstruct_d_f
265
+ jal t9
266
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
267
+ s.s $f0, 0(t4)
268
+ s.s $f2, 4(t4)
269
+ b epilogue
270
+
271
+ retstruct_d_f:
272
+ bne t6, FFI_TYPE_STRUCT_DF, retstruct_f_d
273
+ jal t9
274
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
275
+ s.d $f0, 0(t4)
276
+ s.s $f2, 8(t4)
277
+ b epilogue
278
+
279
+ retstruct_f_d:
280
+ bne t6, FFI_TYPE_STRUCT_FD, retstruct_small
281
+ jal t9
282
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
283
+ s.s $f0, 0(t4)
284
+ s.d $f2, 8(t4)
285
+ b epilogue
286
+
287
+ retstruct_small:
288
+ bne t6, FFI_TYPE_STRUCT_SMALL, retstruct_small2
289
+ jal t9
290
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
291
+ REG_S v0, 0(t4)
292
+ b epilogue
293
+
294
+ retstruct_small2:
295
+ bne t6, FFI_TYPE_STRUCT_SMALL2, retstruct
296
+ jal t9
297
+ REG_L t4, 4*FFI_SIZEOF_ARG($fp)
298
+ REG_S v0, 0(t4)
299
+ REG_S v1, 8(t4)
300
+ b epilogue
301
+
302
+ retstruct:
303
+ noretval:
304
+ jal t9
305
+
306
+ # Epilogue
307
+ epilogue:
308
+ move $sp, $fp
309
+ REG_L $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Restore frame pointer
310
+ REG_L ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Restore return address
311
+ ADDU $sp, SIZEOF_FRAME # Fix stack pointer
312
+ j ra
313
+
314
+ .LFE3:
315
+ .end ffi_call_N32
316
+
317
+ /* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0
318
+ ($12). Stores any arguments passed in registers onto the stack,
319
+ then calls ffi_closure_mips_inner_N32, which then decodes
320
+ them.
321
+
322
+ Stack layout:
323
+
324
+ 20 - Start of parameters, original sp
325
+ 19 - Called function a7 save
326
+ 18 - Called function a6 save
327
+ 17 - Called function a5 save
328
+ 16 - Called function a4 save
329
+ 15 - Called function a3 save
330
+ 14 - Called function a2 save
331
+ 13 - Called function a1 save
332
+ 12 - Called function a0 save
333
+ 11 - Called function f19
334
+ 10 - Called function f18
335
+ 9 - Called function f17
336
+ 8 - Called function f16
337
+ 7 - Called function f15
338
+ 6 - Called function f14
339
+ 5 - Called function f13
340
+ 4 - Called function f12
341
+ 3 - return value high (v1 or $f2)
342
+ 2 - return value low (v0 or $f0)
343
+ 1 - ra save
344
+ 0 - gp save our sp points here
345
+ */
346
+
347
+ #define SIZEOF_FRAME2 (20 * FFI_SIZEOF_ARG)
348
+
349
+ #define A7_OFF2 (19 * FFI_SIZEOF_ARG)
350
+ #define A6_OFF2 (18 * FFI_SIZEOF_ARG)
351
+ #define A5_OFF2 (17 * FFI_SIZEOF_ARG)
352
+ #define A4_OFF2 (16 * FFI_SIZEOF_ARG)
353
+ #define A3_OFF2 (15 * FFI_SIZEOF_ARG)
354
+ #define A2_OFF2 (14 * FFI_SIZEOF_ARG)
355
+ #define A1_OFF2 (13 * FFI_SIZEOF_ARG)
356
+ #define A0_OFF2 (12 * FFI_SIZEOF_ARG)
357
+
358
+ #define F19_OFF2 (11 * FFI_SIZEOF_ARG)
359
+ #define F18_OFF2 (10 * FFI_SIZEOF_ARG)
360
+ #define F17_OFF2 (9 * FFI_SIZEOF_ARG)
361
+ #define F16_OFF2 (8 * FFI_SIZEOF_ARG)
362
+ #define F15_OFF2 (7 * FFI_SIZEOF_ARG)
363
+ #define F14_OFF2 (6 * FFI_SIZEOF_ARG)
364
+ #define F13_OFF2 (5 * FFI_SIZEOF_ARG)
365
+ #define F12_OFF2 (4 * FFI_SIZEOF_ARG)
366
+
367
+ #define V1_OFF2 (3 * FFI_SIZEOF_ARG)
368
+ #define V0_OFF2 (2 * FFI_SIZEOF_ARG)
369
+
370
+ #define RA_OFF2 (1 * FFI_SIZEOF_ARG)
371
+ #define GP_OFF2 (0 * FFI_SIZEOF_ARG)
372
+
373
+ .align 2
374
+ .globl ffi_closure_N32
375
+ .ent ffi_closure_N32
376
+ ffi_closure_N32:
377
+ .LFB2:
378
+ .frame $sp, SIZEOF_FRAME2, ra
379
+ .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
380
+ .fmask 0x00000000,0
381
+ SUBU $sp, SIZEOF_FRAME2
382
+ .LCFI5:
383
+ .cpsetup t9, GP_OFF2, ffi_closure_N32
384
+ REG_S ra, RA_OFF2($sp) # Save return address
385
+ .LCFI6:
386
+ # Store all possible argument registers. If there are more than
387
+ # fit in registers, then they were stored on the stack.
388
+ REG_S a0, A0_OFF2($sp)
389
+ REG_S a1, A1_OFF2($sp)
390
+ REG_S a2, A2_OFF2($sp)
391
+ REG_S a3, A3_OFF2($sp)
392
+ REG_S a4, A4_OFF2($sp)
393
+ REG_S a5, A5_OFF2($sp)
394
+ REG_S a6, A6_OFF2($sp)
395
+ REG_S a7, A7_OFF2($sp)
396
+
397
+ # Store all possible float/double registers.
398
+ s.d $f12, F12_OFF2($sp)
399
+ s.d $f13, F13_OFF2($sp)
400
+ s.d $f14, F14_OFF2($sp)
401
+ s.d $f15, F15_OFF2($sp)
402
+ s.d $f16, F16_OFF2($sp)
403
+ s.d $f17, F17_OFF2($sp)
404
+ s.d $f18, F18_OFF2($sp)
405
+ s.d $f19, F19_OFF2($sp)
406
+
407
+ # Call ffi_closure_mips_inner_N32 to do the real work.
408
+ LA t9, ffi_closure_mips_inner_N32
409
+ move a0, $12 # Pointer to the ffi_closure
410
+ ADDU a1, $sp, V0_OFF2
411
+ ADDU a2, $sp, A0_OFF2
412
+ ADDU a3, $sp, F12_OFF2
413
+ jalr t9
414
+
415
+ # Return flags are in v0
416
+ bne v0, FFI_TYPE_INT, cls_retfloat
417
+ REG_L v0, V0_OFF2($sp)
418
+ b cls_epilogue
419
+
420
+ cls_retfloat:
421
+ bne v0, FFI_TYPE_FLOAT, cls_retdouble
422
+ l.s $f0, V0_OFF2($sp)
423
+ b cls_epilogue
424
+
425
+ cls_retdouble:
426
+ bne v0, FFI_TYPE_DOUBLE, cls_retstruct_d
427
+ l.d $f0, V0_OFF2($sp)
428
+ b cls_epilogue
429
+
430
+ cls_retstruct_d:
431
+ bne v0, FFI_TYPE_STRUCT_D, cls_retstruct_f
432
+ l.d $f0, V0_OFF2($sp)
433
+ b cls_epilogue
434
+
435
+ cls_retstruct_f:
436
+ bne v0, FFI_TYPE_STRUCT_F, cls_retstruct_d_d
437
+ l.s $f0, V0_OFF2($sp)
438
+ b cls_epilogue
439
+
440
+ cls_retstruct_d_d:
441
+ bne v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f
442
+ l.d $f0, V0_OFF2($sp)
443
+ l.d $f2, V1_OFF2($sp)
444
+ b cls_epilogue
445
+
446
+ cls_retstruct_f_f:
447
+ bne v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f
448
+ l.s $f0, V0_OFF2($sp)
449
+ l.s $f2, V1_OFF2($sp)
450
+ b cls_epilogue
451
+
452
+ cls_retstruct_d_f:
453
+ bne v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
454
+ l.d $f0, V0_OFF2($sp)
455
+ l.s $f2, V1_OFF2($sp)
456
+ b cls_epilogue
457
+
458
+ cls_retstruct_f_d:
459
+ bne v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2
460
+ l.s $f0, V0_OFF2($sp)
461
+ l.d $f2, V1_OFF2($sp)
462
+ b cls_epilogue
463
+
464
+ cls_retstruct_small2:
465
+ REG_L v0, V0_OFF2($sp)
466
+ REG_L v1, V1_OFF2($sp)
467
+
468
+ # Epilogue
469
+ cls_epilogue:
470
+ REG_L ra, RA_OFF2($sp) # Restore return address
471
+ .cpreturn
472
+ ADDU $sp, SIZEOF_FRAME2
473
+ j ra
474
+ .LFE2:
475
+ .end ffi_closure_N32
476
+
477
+ .section .eh_frame,"aw",@progbits
478
+ .Lframe1:
479
+ .4byte .LECIE1-.LSCIE1 # length
480
+ .LSCIE1:
481
+ .4byte 0x0 # CIE
482
+ .byte 0x1 # Version 1
483
+ .ascii "\000" # Augmentation
484
+ .uleb128 0x1 # Code alignment 1
485
+ .sleb128 -4 # Data alignment -4
486
+ .byte 0x1f # Return Address $31
487
+ .byte 0xc # DW_CFA_def_cfa
488
+ .uleb128 0x1d # in $sp
489
+ .uleb128 0x0 # offset 0
490
+ .align EH_FRAME_ALIGN
491
+ .LECIE1:
492
+
493
+ .LSFDE1:
494
+ .4byte .LEFDE1-.LASFDE1 # length.
495
+ .LASFDE1:
496
+ .4byte .LASFDE1-.Lframe1 # CIE_pointer.
497
+ FDE_ADDR_BYTES .LFB3 # initial_location.
498
+ FDE_ADDR_BYTES .LFE3-.LFB3 # address_range.
499
+ .byte 0x4 # DW_CFA_advance_loc4
500
+ .4byte .LCFI0-.LFB3 # to .LCFI0
501
+ .byte 0xe # DW_CFA_def_cfa_offset
502
+ .uleb128 SIZEOF_FRAME # adjust stack.by SIZEOF_FRAME
503
+ .byte 0x4 # DW_CFA_advance_loc4
504
+ .4byte .LCFI1-.LCFI0 # to .LCFI1
505
+ .byte 0x9e # DW_CFA_offset of $fp
506
+ .uleb128 2*FFI_SIZEOF_ARG/4 #
507
+ .byte 0x9f # DW_CFA_offset of ra
508
+ .uleb128 1*FFI_SIZEOF_ARG/4 #
509
+ .byte 0x4 # DW_CFA_advance_loc4
510
+ .4byte .LCFI3-.LCFI1 # to .LCFI3
511
+ .byte 0xd # DW_CFA_def_cfa_register
512
+ .uleb128 0x1e # in $fp
513
+ .align EH_FRAME_ALIGN
514
+ .LEFDE1:
515
+ .LSFDE3:
516
+ .4byte .LEFDE3-.LASFDE3 # length
517
+ .LASFDE3:
518
+ .4byte .LASFDE3-.Lframe1 # CIE_pointer.
519
+ FDE_ADDR_BYTES .LFB2 # initial_location.
520
+ FDE_ADDR_BYTES .LFE2-.LFB2 # address_range.
521
+ .byte 0x4 # DW_CFA_advance_loc4
522
+ .4byte .LCFI5-.LFB2 # to .LCFI5
523
+ .byte 0xe # DW_CFA_def_cfa_offset
524
+ .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME
525
+ .byte 0x4 # DW_CFA_advance_loc4
526
+ .4byte .LCFI6-.LCFI5 # to .LCFI6
527
+ .byte 0x9c # DW_CFA_offset of $gp ($28)
528
+ .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
529
+ .byte 0x9f # DW_CFA_offset of ra ($31)
530
+ .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
531
+ .align EH_FRAME_ALIGN
532
+ .LEFDE3:
533
+
534
+ #endif