ffi 0.5.0-x86-mingw32

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 (328) hide show
  1. data/LICENSE +51 -0
  2. data/README.rdoc +69 -0
  3. data/Rakefile +191 -0
  4. data/ext/ffi_c/AbstractMemory.c +489 -0
  5. data/ext/ffi_c/AbstractMemory.h +160 -0
  6. data/ext/ffi_c/ArrayType.c +129 -0
  7. data/ext/ffi_c/ArrayType.h +58 -0
  8. data/ext/ffi_c/AutoPointer.c +61 -0
  9. data/ext/ffi_c/AutoPointer.h +18 -0
  10. data/ext/ffi_c/Buffer.c +187 -0
  11. data/ext/ffi_c/Call.c +853 -0
  12. data/ext/ffi_c/Call.h +86 -0
  13. data/ext/ffi_c/ClosurePool.c +302 -0
  14. data/ext/ffi_c/ClosurePool.h +29 -0
  15. data/ext/ffi_c/DynamicLibrary.c +216 -0
  16. data/ext/ffi_c/DynamicLibrary.h +22 -0
  17. data/ext/ffi_c/Function.c +478 -0
  18. data/ext/ffi_c/Function.h +80 -0
  19. data/ext/ffi_c/FunctionInfo.c +221 -0
  20. data/ext/ffi_c/LastError.c +159 -0
  21. data/ext/ffi_c/LastError.h +18 -0
  22. data/ext/ffi_c/MemoryPointer.c +178 -0
  23. data/ext/ffi_c/MemoryPointer.h +20 -0
  24. data/ext/ffi_c/MethodHandle.c +346 -0
  25. data/ext/ffi_c/MethodHandle.h +53 -0
  26. data/ext/ffi_c/Platform.c +59 -0
  27. data/ext/ffi_c/Platform.h +16 -0
  28. data/ext/ffi_c/Pointer.c +224 -0
  29. data/ext/ffi_c/Pointer.h +49 -0
  30. data/ext/ffi_c/Struct.c +770 -0
  31. data/ext/ffi_c/Struct.h +80 -0
  32. data/ext/ffi_c/StructByValue.c +140 -0
  33. data/ext/ffi_c/StructByValue.h +53 -0
  34. data/ext/ffi_c/StructLayout.c +450 -0
  35. data/ext/ffi_c/Type.c +329 -0
  36. data/ext/ffi_c/Type.h +57 -0
  37. data/ext/ffi_c/Types.c +103 -0
  38. data/ext/ffi_c/Types.h +85 -0
  39. data/ext/ffi_c/Variadic.c +260 -0
  40. data/ext/ffi_c/compat.h +72 -0
  41. data/ext/ffi_c/endian.h +40 -0
  42. data/ext/ffi_c/extconf.rb +30 -0
  43. data/ext/ffi_c/ffi.c +82 -0
  44. data/ext/ffi_c/libffi.bsd.mk +34 -0
  45. data/ext/ffi_c/libffi.darwin.mk +75 -0
  46. data/ext/ffi_c/libffi.gnu.mk +29 -0
  47. data/ext/ffi_c/libffi.mk +13 -0
  48. data/ext/ffi_c/libffi/ChangeLog +3243 -0
  49. data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
  50. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  51. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  52. data/ext/ffi_c/libffi/LICENSE +21 -0
  53. data/ext/ffi_c/libffi/Makefile.am +177 -0
  54. data/ext/ffi_c/libffi/Makefile.in +1640 -0
  55. data/ext/ffi_c/libffi/README +328 -0
  56. data/ext/ffi_c/libffi/TODO +1 -0
  57. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  58. data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
  59. data/ext/ffi_c/libffi/compile +142 -0
  60. data/ext/ffi_c/libffi/config.guess +1516 -0
  61. data/ext/ffi_c/libffi/config.sub +1626 -0
  62. data/ext/ffi_c/libffi/configure +24414 -0
  63. data/ext/ffi_c/libffi/configure.ac +365 -0
  64. data/ext/ffi_c/libffi/configure.host +11 -0
  65. data/ext/ffi_c/libffi/depcomp +584 -0
  66. data/ext/ffi_c/libffi/doc/libffi.info +533 -0
  67. data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
  68. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  69. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  70. data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
  71. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  72. data/ext/ffi_c/libffi/include/Makefile.in +422 -0
  73. data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
  74. data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
  75. data/ext/ffi_c/libffi/install-sh +323 -0
  76. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  77. data/ext/ffi_c/libffi/libtool-version +29 -0
  78. data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
  79. data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
  80. data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
  81. data/ext/ffi_c/libffi/ltconfig +2862 -0
  82. data/ext/ffi_c/libffi/ltmain.sh +6930 -0
  83. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  84. data/ext/ffi_c/libffi/man/Makefile.in +395 -0
  85. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  86. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  87. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  88. data/ext/ffi_c/libffi/mdate-sh +201 -0
  89. data/ext/ffi_c/libffi/missing +353 -0
  90. data/ext/ffi_c/libffi/mkinstalldirs +158 -0
  91. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  92. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  93. data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
  94. data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
  95. data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
  96. data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
  97. data/ext/ffi_c/libffi/src/closures.c +596 -0
  98. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  99. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  100. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  101. data/ext/ffi_c/libffi/src/debug.c +59 -0
  102. data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
  103. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  104. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  105. data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
  106. data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
  107. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  108. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  109. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  110. data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
  111. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  112. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  113. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  114. data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
  115. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  116. data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
  117. data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
  118. data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
  119. data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
  120. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  121. data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
  122. data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
  123. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  124. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  125. data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
  126. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
  127. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  128. data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
  129. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
  130. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
  131. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
  132. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
  133. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  134. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  135. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  136. data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
  137. data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
  138. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  139. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  140. data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
  141. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  142. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  143. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  144. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  145. data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
  146. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  147. data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
  148. data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
  149. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
  150. data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
  151. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  152. data/ext/ffi_c/libffi/src/types.c +77 -0
  153. data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
  154. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  155. data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
  156. data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
  157. data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
  158. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  159. data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
  160. data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
  161. data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
  162. data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
  163. data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
  164. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  165. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
  166. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  167. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  278. data/ext/ffi_c/libffi/texinfo.tex +7482 -0
  279. data/ext/ffi_c/rbffi.h +26 -0
  280. data/gen/Rakefile +12 -0
  281. data/lib/1.8/ffi_c.so +0 -0
  282. data/lib/1.9/ffi_c.so +0 -0
  283. data/lib/ffi.rb +11 -0
  284. data/lib/ffi/autopointer.rb +61 -0
  285. data/lib/ffi/buffer.rb +0 -0
  286. data/lib/ffi/callback.rb +10 -0
  287. data/lib/ffi/enum.rb +78 -0
  288. data/lib/ffi/errno.rb +8 -0
  289. data/lib/ffi/ffi.rb +99 -0
  290. data/lib/ffi/io.rb +21 -0
  291. data/lib/ffi/library.rb +218 -0
  292. data/lib/ffi/managedstruct.rb +55 -0
  293. data/lib/ffi/memorypointer.rb +73 -0
  294. data/lib/ffi/platform.rb +88 -0
  295. data/lib/ffi/pointer.rb +119 -0
  296. data/lib/ffi/struct.rb +183 -0
  297. data/lib/ffi/tools/const_generator.rb +177 -0
  298. data/lib/ffi/tools/generator.rb +58 -0
  299. data/lib/ffi/tools/generator_task.rb +35 -0
  300. data/lib/ffi/tools/struct_generator.rb +194 -0
  301. data/lib/ffi/tools/types_generator.rb +123 -0
  302. data/lib/ffi/types.rb +153 -0
  303. data/lib/ffi/union.rb +12 -0
  304. data/lib/ffi/variadic.rb +25 -0
  305. data/spec/ffi/bool_spec.rb +24 -0
  306. data/spec/ffi/buffer_spec.rb +202 -0
  307. data/spec/ffi/callback_spec.rb +591 -0
  308. data/spec/ffi/enum_spec.rb +164 -0
  309. data/spec/ffi/errno_spec.rb +13 -0
  310. data/spec/ffi/function_spec.rb +73 -0
  311. data/spec/ffi/library_spec.rb +148 -0
  312. data/spec/ffi/managed_struct_spec.rb +56 -0
  313. data/spec/ffi/number_spec.rb +231 -0
  314. data/spec/ffi/pointer_spec.rb +195 -0
  315. data/spec/ffi/rbx/attach_function_spec.rb +27 -0
  316. data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
  317. data/spec/ffi/rbx/spec_helper.rb +1 -0
  318. data/spec/ffi/rbx/struct_spec.rb +13 -0
  319. data/spec/ffi/spec_helper.rb +17 -0
  320. data/spec/ffi/string_spec.rb +103 -0
  321. data/spec/ffi/struct_callback_spec.rb +64 -0
  322. data/spec/ffi/struct_initialize_spec.rb +30 -0
  323. data/spec/ffi/struct_spec.rb +529 -0
  324. data/spec/ffi/typedef_spec.rb +48 -0
  325. data/spec/ffi/union_spec.rb +60 -0
  326. data/spec/ffi/variadic_spec.rb +84 -0
  327. data/spec/spec.opts +4 -0
  328. metadata +396 -0
@@ -0,0 +1,77 @@
1
+ /* -----------------------------------------------------------------*-C-*-
2
+ ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
3
+ Target configuration macros for hppa.
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
+ /* ---- System specific configurations ----------------------------------- */
31
+
32
+ #ifndef LIBFFI_ASM
33
+ typedef unsigned long ffi_arg;
34
+ typedef signed long ffi_sarg;
35
+
36
+ typedef enum ffi_abi {
37
+ FFI_FIRST_ABI = 0,
38
+
39
+ #ifdef PA_LINUX
40
+ FFI_PA32,
41
+ FFI_DEFAULT_ABI = FFI_PA32,
42
+ #endif
43
+
44
+ #ifdef PA_HPUX
45
+ FFI_PA32,
46
+ FFI_DEFAULT_ABI = FFI_PA32,
47
+ #endif
48
+
49
+ #ifdef PA64_HPUX
50
+ #error "PA64_HPUX FFI is not yet implemented"
51
+ FFI_PA64,
52
+ FFI_DEFAULT_ABI = FFI_PA64,
53
+ #endif
54
+
55
+ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
56
+ } ffi_abi;
57
+ #endif
58
+
59
+ /* ---- Definitions for closures ----------------------------------------- */
60
+
61
+ #define FFI_CLOSURES 1
62
+ #define FFI_NATIVE_RAW_API 0
63
+
64
+ #ifdef PA_LINUX
65
+ #define FFI_TRAMPOLINE_SIZE 32
66
+ #else
67
+ #define FFI_TRAMPOLINE_SIZE 40
68
+ #endif
69
+
70
+ #define FFI_TYPE_SMALL_STRUCT2 -1
71
+ #define FFI_TYPE_SMALL_STRUCT3 -2
72
+ #define FFI_TYPE_SMALL_STRUCT4 -3
73
+ #define FFI_TYPE_SMALL_STRUCT5 -4
74
+ #define FFI_TYPE_SMALL_STRUCT6 -5
75
+ #define FFI_TYPE_SMALL_STRUCT7 -6
76
+ #define FFI_TYPE_SMALL_STRUCT8 -7
77
+ #endif
@@ -0,0 +1,368 @@
1
+ /* -----------------------------------------------------------------------
2
+ hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc.
3
+ (c) 2008 Red Hat, Inc.
4
+ based on src/pa/linux.S
5
+
6
+ HP-UX PA Foreign Function Interface
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining
9
+ a copy of this software and associated documentation files (the
10
+ ``Software''), to deal in the Software without restriction, including
11
+ without limitation the rights to use, copy, modify, merge, publish,
12
+ distribute, sublicense, and/or sell copies of the Software, and to
13
+ permit persons to whom the Software is furnished to do so, subject to
14
+ the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included
17
+ in all copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
20
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
23
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25
+ OTHER DEALINGS IN THE SOFTWARE.
26
+ ----------------------------------------------------------------------- */
27
+
28
+ #define LIBFFI_ASM
29
+ #include <fficonfig.h>
30
+ #include <ffi.h>
31
+
32
+ .LEVEL 1.1
33
+ .SPACE $PRIVATE$
34
+ .IMPORT $global$,DATA
35
+ .IMPORT $$dyncall,MILLICODE
36
+ .SUBSPA $DATA$
37
+ .align 4
38
+
39
+ /* void ffi_call_pa32(void (*)(char *, extended_cif *),
40
+ extended_cif *ecif,
41
+ unsigned bytes,
42
+ unsigned flags,
43
+ unsigned *rvalue,
44
+ void (*fn)(void));
45
+ */
46
+
47
+ .export ffi_call_pa32,ENTRY,PRIV_LEV=3
48
+ .import ffi_prep_args_pa32,CODE
49
+
50
+ .SPACE $TEXT$
51
+ .SUBSPA $CODE$
52
+ .align 4
53
+
54
+ L$FB1
55
+ ffi_call_pa32
56
+ .proc
57
+ .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
58
+ .entry
59
+ stw %rp, -20(%sp)
60
+ copy %r3, %r1
61
+ L$CFI11
62
+ copy %sp, %r3
63
+ L$CFI12
64
+
65
+ /* Setup the stack for calling prep_args...
66
+ We want the stack to look like this:
67
+
68
+ [ Previous stack ] <- %r3
69
+
70
+ [ 64-bytes register save area ] <- %r4
71
+
72
+ [ Stack space for actual call, passed as ] <- %arg0
73
+ [ arg0 to ffi_prep_args_pa32 ]
74
+
75
+ [ Stack for calling prep_args ] <- %sp
76
+ */
77
+
78
+ stwm %r1, 64(%sp)
79
+ stw %r4, 12(%r3)
80
+ L$CFI13
81
+ copy %sp, %r4
82
+
83
+ addl %arg2, %r4, %arg0 ; arg stack
84
+ stw %arg3, -48(%r3) ; save flags we need it later
85
+
86
+ /* Call prep_args:
87
+ %arg0(stack) -- set up above
88
+ %arg1(ecif) -- same as incoming param
89
+ %arg2(bytes) -- same as incoming param */
90
+ bl ffi_prep_args_pa32,%r2
91
+ ldo 64(%arg0), %sp
92
+ ldo -64(%sp), %sp
93
+
94
+ /* now %sp should point where %arg0 was pointing. */
95
+
96
+ /* Load the arguments that should be passed in registers
97
+ The fp args are loaded by the prep_args function. */
98
+ ldw -36(%sp), %arg0
99
+ ldw -40(%sp), %arg1
100
+ ldw -44(%sp), %arg2
101
+ ldw -48(%sp), %arg3
102
+
103
+ /* in case the function is going to return a structure
104
+ we need to give it a place to put the result. */
105
+ ldw -52(%r3), %ret0 ; %ret0 <- rvalue
106
+ ldw -56(%r3), %r22 ; %r22 <- function to call
107
+ bl $$dyncall, %r31 ; Call the user function
108
+ copy %r31, %rp
109
+
110
+ /* Prepare to store the result; we need to recover flags and rvalue. */
111
+ ldw -48(%r3), %r21 ; r21 <- flags
112
+ ldw -52(%r3), %r20 ; r20 <- rvalue
113
+
114
+ /* Store the result according to the return type. The most
115
+ likely types should come first. */
116
+
117
+ L$checkint
118
+ comib,<>,n FFI_TYPE_INT, %r21, L$checkint8
119
+ b L$done
120
+ stw %ret0, 0(%r20)
121
+
122
+ L$checkint8
123
+ comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16
124
+ b L$done
125
+ stb %ret0, 0(%r20)
126
+
127
+ L$checkint16
128
+ comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl
129
+ b L$done
130
+ sth %ret0, 0(%r20)
131
+
132
+ L$checkdbl
133
+ comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat
134
+ b L$done
135
+ fstd %fr4,0(%r20)
136
+
137
+ L$checkfloat
138
+ comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll
139
+ b L$done
140
+ fstw %fr4L,0(%r20)
141
+
142
+ L$checkll
143
+ comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2
144
+ stw %ret0, 0(%r20)
145
+ b L$done
146
+ stw %ret1, 4(%r20)
147
+
148
+ L$checksmst2
149
+ comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3
150
+ /* 2-byte structs are returned in ret0 as ????xxyy. */
151
+ extru %ret0, 23, 8, %r22
152
+ stbs,ma %r22, 1(%r20)
153
+ b L$done
154
+ stb %ret0, 0(%r20)
155
+
156
+ L$checksmst3
157
+ comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4
158
+ /* 3-byte structs are returned in ret0 as ??xxyyzz. */
159
+ extru %ret0, 15, 8, %r22
160
+ stbs,ma %r22, 1(%r20)
161
+ extru %ret0, 23, 8, %r22
162
+ stbs,ma %r22, 1(%r20)
163
+ b L$done
164
+ stb %ret0, 0(%r20)
165
+
166
+ L$checksmst4
167
+ comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5
168
+ /* 4-byte structs are returned in ret0 as wwxxyyzz. */
169
+ extru %ret0, 7, 8, %r22
170
+ stbs,ma %r22, 1(%r20)
171
+ extru %ret0, 15, 8, %r22
172
+ stbs,ma %r22, 1(%r20)
173
+ extru %ret0, 23, 8, %r22
174
+ stbs,ma %r22, 1(%r20)
175
+ b L$done
176
+ stb %ret0, 0(%r20)
177
+
178
+ L$checksmst5
179
+ comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6
180
+ /* 5 byte values are returned right justified:
181
+ ret0 ret1
182
+ 5: ??????aa bbccddee */
183
+ stbs,ma %ret0, 1(%r20)
184
+ extru %ret1, 7, 8, %r22
185
+ stbs,ma %r22, 1(%r20)
186
+ extru %ret1, 15, 8, %r22
187
+ stbs,ma %r22, 1(%r20)
188
+ extru %ret1, 23, 8, %r22
189
+ stbs,ma %r22, 1(%r20)
190
+ b L$done
191
+ stb %ret1, 0(%r20)
192
+
193
+ L$checksmst6
194
+ comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7
195
+ /* 6 byte values are returned right justified:
196
+ ret0 ret1
197
+ 6: ????aabb ccddeeff */
198
+ extru %ret0, 23, 8, %r22
199
+ stbs,ma %r22, 1(%r20)
200
+ stbs,ma %ret0, 1(%r20)
201
+ extru %ret1, 7, 8, %r22
202
+ stbs,ma %r22, 1(%r20)
203
+ extru %ret1, 15, 8, %r22
204
+ stbs,ma %r22, 1(%r20)
205
+ extru %ret1, 23, 8, %r22
206
+ stbs,ma %r22, 1(%r20)
207
+ b L$done
208
+ stb %ret1, 0(%r20)
209
+
210
+ L$checksmst7
211
+ comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8
212
+ /* 7 byte values are returned right justified:
213
+ ret0 ret1
214
+ 7: ??aabbcc ddeeffgg */
215
+ extru %ret0, 15, 8, %r22
216
+ stbs,ma %r22, 1(%r20)
217
+ extru %ret0, 23, 8, %r22
218
+ stbs,ma %r22, 1(%r20)
219
+ stbs,ma %ret0, 1(%r20)
220
+ extru %ret1, 7, 8, %r22
221
+ stbs,ma %r22, 1(%r20)
222
+ extru %ret1, 15, 8, %r22
223
+ stbs,ma %r22, 1(%r20)
224
+ extru %ret1, 23, 8, %r22
225
+ stbs,ma %r22, 1(%r20)
226
+ b L$done
227
+ stb %ret1, 0(%r20)
228
+
229
+ L$checksmst8
230
+ comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done
231
+ /* 8 byte values are returned right justified:
232
+ ret0 ret1
233
+ 8: aabbccdd eeffgghh */
234
+ extru %ret0, 7, 8, %r22
235
+ stbs,ma %r22, 1(%r20)
236
+ extru %ret0, 15, 8, %r22
237
+ stbs,ma %r22, 1(%r20)
238
+ extru %ret0, 23, 8, %r22
239
+ stbs,ma %r22, 1(%r20)
240
+ stbs,ma %ret0, 1(%r20)
241
+ extru %ret1, 7, 8, %r22
242
+ stbs,ma %r22, 1(%r20)
243
+ extru %ret1, 15, 8, %r22
244
+ stbs,ma %r22, 1(%r20)
245
+ extru %ret1, 23, 8, %r22
246
+ stbs,ma %r22, 1(%r20)
247
+ stb %ret1, 0(%r20)
248
+
249
+ L$done
250
+ /* all done, return */
251
+ copy %r4, %sp ; pop arg stack
252
+ ldw 12(%r3), %r4
253
+ ldwm -64(%sp), %r3 ; .. and pop stack
254
+ ldw -20(%sp), %rp
255
+ bv %r0(%rp)
256
+ nop
257
+ .exit
258
+ .procend
259
+ L$FE1
260
+
261
+ /* void ffi_closure_pa32(void);
262
+ Called with closure argument in %r21 */
263
+
264
+ .SPACE $TEXT$
265
+ .SUBSPA $CODE$
266
+ .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR
267
+ .import ffi_closure_inner_pa32,CODE
268
+ .align 4
269
+ L$FB2
270
+ ffi_closure_pa32
271
+ .proc
272
+ .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
273
+ .entry
274
+
275
+ stw %rp, -20(%sp)
276
+ copy %r3, %r1
277
+ L$CFI21
278
+ copy %sp, %r3
279
+ L$CFI22
280
+ stwm %r1, 64(%sp)
281
+
282
+ /* Put arguments onto the stack and call ffi_closure_inner. */
283
+ stw %arg0, -36(%r3)
284
+ stw %arg1, -40(%r3)
285
+ stw %arg2, -44(%r3)
286
+ stw %arg3, -48(%r3)
287
+
288
+ copy %r21, %arg0
289
+ bl ffi_closure_inner_pa32, %r2
290
+ copy %r3, %arg1
291
+ ldwm -64(%sp), %r3
292
+ ldw -20(%sp), %rp
293
+ ldw -36(%sp), %ret0
294
+ bv %r0(%rp)
295
+ ldw -40(%sp), %ret1
296
+ .exit
297
+ .procend
298
+ L$FE2:
299
+
300
+ .SPACE $PRIVATE$
301
+ .SUBSPA $DATA$
302
+
303
+ .align 4
304
+ .EXPORT _GLOBAL__F_ffi_call_pa32,DATA
305
+ _GLOBAL__F_ffi_call_pa32
306
+ L$frame1:
307
+ .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry
308
+ L$SCIE1:
309
+ .word 0x0 ;# CIE Identifier Tag
310
+ .byte 0x1 ;# CIE Version
311
+ .ascii "\0" ;# CIE Augmentation
312
+ .uleb128 0x1 ;# CIE Code Alignment Factor
313
+ .sleb128 4 ;# CIE Data Alignment Factor
314
+ .byte 0x2 ;# CIE RA Column
315
+ .byte 0xc ;# DW_CFA_def_cfa
316
+ .uleb128 0x1e
317
+ .uleb128 0x0
318
+ .align 4
319
+ L$ECIE1:
320
+ L$SFDE1:
321
+ .word L$EFDE1-L$ASFDE1 ;# FDE Length
322
+ L$ASFDE1:
323
+ .word L$ASFDE1-L$frame1 ;# FDE CIE offset
324
+ .word L$FB1 ;# FDE initial location
325
+ .word L$FE1-L$FB1 ;# FDE address range
326
+
327
+ .byte 0x4 ;# DW_CFA_advance_loc4
328
+ .word L$CFI11-L$FB1
329
+ .byte 0x83 ;# DW_CFA_offset, column 0x3
330
+ .uleb128 0x0
331
+ .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
332
+ .uleb128 0x2
333
+ .sleb128 -5
334
+
335
+ .byte 0x4 ;# DW_CFA_advance_loc4
336
+ .word L$CFI12-L$CFI11
337
+ .byte 0xd ;# DW_CFA_def_cfa_register = r3
338
+ .uleb128 0x3
339
+
340
+ .byte 0x4 ;# DW_CFA_advance_loc4
341
+ .word L$CFI13-L$CFI12
342
+ .byte 0x84 ;# DW_CFA_offset, column 0x4
343
+ .uleb128 0x3
344
+
345
+ .align 4
346
+ L$EFDE1:
347
+
348
+ L$SFDE2:
349
+ .word L$EFDE2-L$ASFDE2 ;# FDE Length
350
+ L$ASFDE2:
351
+ .word L$ASFDE2-L$frame1 ;# FDE CIE offset
352
+ .word L$FB2 ;# FDE initial location
353
+ .word L$FE2-L$FB2 ;# FDE address range
354
+ .byte 0x4 ;# DW_CFA_advance_loc4
355
+ .word L$CFI21-L$FB2
356
+ .byte 0x83 ;# DW_CFA_offset, column 0x3
357
+ .uleb128 0x0
358
+ .byte 0x11 ;# DW_CFA_offset_extended_sf
359
+ .uleb128 0x2
360
+ .sleb128 -5
361
+
362
+ .byte 0x4 ;# DW_CFA_advance_loc4
363
+ .word L$CFI22-L$CFI21
364
+ .byte 0xd ;# DW_CFA_def_cfa_register = r3
365
+ .uleb128 0x3
366
+
367
+ .align 4
368
+ L$EFDE2:
@@ -0,0 +1,357 @@
1
+ /* -----------------------------------------------------------------------
2
+ linux.S - (c) 2003-2004 Randolph Chung <tausq@debian.org>
3
+ (c) 2008 Red Hat, Inc.
4
+
5
+ HPPA Foreign Function Interface
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ ``Software''), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included
16
+ in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21
+ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR 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
+ .text
32
+ .level 1.1
33
+ .align 4
34
+
35
+ /* void ffi_call_pa32(void (*)(char *, extended_cif *),
36
+ extended_cif *ecif,
37
+ unsigned bytes,
38
+ unsigned flags,
39
+ unsigned *rvalue,
40
+ void (*fn)(void));
41
+ */
42
+
43
+ .export ffi_call_pa32,code
44
+ .import ffi_prep_args_pa32,code
45
+
46
+ .type ffi_call_pa32, @function
47
+ .LFB1:
48
+ ffi_call_pa32:
49
+ .proc
50
+ .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
51
+ .entry
52
+ stw %rp, -20(%sp)
53
+ copy %r3, %r1
54
+ .LCFI11:
55
+
56
+ copy %sp, %r3
57
+ .LCFI12:
58
+
59
+ /* Setup the stack for calling prep_args...
60
+ We want the stack to look like this:
61
+
62
+ [ Previous stack ] <- %r3
63
+
64
+ [ 64-bytes register save area ] <- %r4
65
+
66
+ [ Stack space for actual call, passed as ] <- %arg0
67
+ [ arg0 to ffi_prep_args_pa32 ]
68
+
69
+ [ Stack for calling prep_args ] <- %sp
70
+ */
71
+
72
+ stwm %r1, 64(%sp)
73
+ stw %r4, 12(%r3)
74
+ .LCFI13:
75
+ copy %sp, %r4
76
+
77
+ addl %arg2, %r4, %arg0 /* arg stack */
78
+ stw %arg3, -48(%r3) /* save flags; we need it later */
79
+
80
+ /* Call prep_args:
81
+ %arg0(stack) -- set up above
82
+ %arg1(ecif) -- same as incoming param
83
+ %arg2(bytes) -- same as incoming param */
84
+ bl ffi_prep_args_pa32,%r2
85
+ ldo 64(%arg0), %sp
86
+ ldo -64(%sp), %sp
87
+
88
+ /* now %sp should point where %arg0 was pointing. */
89
+
90
+ /* Load the arguments that should be passed in registers
91
+ The fp args were loaded by the prep_args function. */
92
+ ldw -36(%sp), %arg0
93
+ ldw -40(%sp), %arg1
94
+ ldw -44(%sp), %arg2
95
+ ldw -48(%sp), %arg3
96
+
97
+ /* in case the function is going to return a structure
98
+ we need to give it a place to put the result. */
99
+ ldw -52(%r3), %ret0 /* %ret0 <- rvalue */
100
+ ldw -56(%r3), %r22 /* %r22 <- function to call */
101
+ bl $$dyncall, %r31 /* Call the user function */
102
+ copy %r31, %rp
103
+
104
+ /* Prepare to store the result; we need to recover flags and rvalue. */
105
+ ldw -48(%r3), %r21 /* r21 <- flags */
106
+ ldw -52(%r3), %r20 /* r20 <- rvalue */
107
+
108
+ /* Store the result according to the return type. */
109
+
110
+ .Lcheckint:
111
+ comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
112
+ b .Ldone
113
+ stw %ret0, 0(%r20)
114
+
115
+ .Lcheckint8:
116
+ comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
117
+ b .Ldone
118
+ stb %ret0, 0(%r20)
119
+
120
+ .Lcheckint16:
121
+ comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
122
+ b .Ldone
123
+ sth %ret0, 0(%r20)
124
+
125
+ .Lcheckdbl:
126
+ comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
127
+ b .Ldone
128
+ fstd %fr4,0(%r20)
129
+
130
+ .Lcheckfloat:
131
+ comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
132
+ b .Ldone
133
+ fstw %fr4L,0(%r20)
134
+
135
+ .Lcheckll:
136
+ comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
137
+ stw %ret0, 0(%r20)
138
+ b .Ldone
139
+ stw %ret1, 4(%r20)
140
+
141
+ .Lchecksmst2:
142
+ comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
143
+ /* 2-byte structs are returned in ret0 as ????xxyy. */
144
+ extru %ret0, 23, 8, %r22
145
+ stbs,ma %r22, 1(%r20)
146
+ b .Ldone
147
+ stb %ret0, 0(%r20)
148
+
149
+ .Lchecksmst3:
150
+ comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
151
+ /* 3-byte structs are returned in ret0 as ??xxyyzz. */
152
+ extru %ret0, 15, 8, %r22
153
+ stbs,ma %r22, 1(%r20)
154
+ extru %ret0, 23, 8, %r22
155
+ stbs,ma %r22, 1(%r20)
156
+ b .Ldone
157
+ stb %ret0, 0(%r20)
158
+
159
+ .Lchecksmst4:
160
+ comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
161
+ /* 4-byte structs are returned in ret0 as wwxxyyzz. */
162
+ extru %ret0, 7, 8, %r22
163
+ stbs,ma %r22, 1(%r20)
164
+ extru %ret0, 15, 8, %r22
165
+ stbs,ma %r22, 1(%r20)
166
+ extru %ret0, 23, 8, %r22
167
+ stbs,ma %r22, 1(%r20)
168
+ b .Ldone
169
+ stb %ret0, 0(%r20)
170
+
171
+ .Lchecksmst5:
172
+ comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
173
+ /* 5 byte values are returned right justified:
174
+ ret0 ret1
175
+ 5: ??????aa bbccddee */
176
+ stbs,ma %ret0, 1(%r20)
177
+ extru %ret1, 7, 8, %r22
178
+ stbs,ma %r22, 1(%r20)
179
+ extru %ret1, 15, 8, %r22
180
+ stbs,ma %r22, 1(%r20)
181
+ extru %ret1, 23, 8, %r22
182
+ stbs,ma %r22, 1(%r20)
183
+ b .Ldone
184
+ stb %ret1, 0(%r20)
185
+
186
+ .Lchecksmst6:
187
+ comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
188
+ /* 6 byte values are returned right justified:
189
+ ret0 ret1
190
+ 6: ????aabb ccddeeff */
191
+ extru %ret0, 23, 8, %r22
192
+ stbs,ma %r22, 1(%r20)
193
+ stbs,ma %ret0, 1(%r20)
194
+ extru %ret1, 7, 8, %r22
195
+ stbs,ma %r22, 1(%r20)
196
+ extru %ret1, 15, 8, %r22
197
+ stbs,ma %r22, 1(%r20)
198
+ extru %ret1, 23, 8, %r22
199
+ stbs,ma %r22, 1(%r20)
200
+ b .Ldone
201
+ stb %ret1, 0(%r20)
202
+
203
+ .Lchecksmst7:
204
+ comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
205
+ /* 7 byte values are returned right justified:
206
+ ret0 ret1
207
+ 7: ??aabbcc ddeeffgg */
208
+ extru %ret0, 15, 8, %r22
209
+ stbs,ma %r22, 1(%r20)
210
+ extru %ret0, 23, 8, %r22
211
+ stbs,ma %r22, 1(%r20)
212
+ stbs,ma %ret0, 1(%r20)
213
+ extru %ret1, 7, 8, %r22
214
+ stbs,ma %r22, 1(%r20)
215
+ extru %ret1, 15, 8, %r22
216
+ stbs,ma %r22, 1(%r20)
217
+ extru %ret1, 23, 8, %r22
218
+ stbs,ma %r22, 1(%r20)
219
+ b .Ldone
220
+ stb %ret1, 0(%r20)
221
+
222
+ .Lchecksmst8:
223
+ comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
224
+ /* 8 byte values are returned right justified:
225
+ ret0 ret1
226
+ 8: aabbccdd eeffgghh */
227
+ extru %ret0, 7, 8, %r22
228
+ stbs,ma %r22, 1(%r20)
229
+ extru %ret0, 15, 8, %r22
230
+ stbs,ma %r22, 1(%r20)
231
+ extru %ret0, 23, 8, %r22
232
+ stbs,ma %r22, 1(%r20)
233
+ stbs,ma %ret0, 1(%r20)
234
+ extru %ret1, 7, 8, %r22
235
+ stbs,ma %r22, 1(%r20)
236
+ extru %ret1, 15, 8, %r22
237
+ stbs,ma %r22, 1(%r20)
238
+ extru %ret1, 23, 8, %r22
239
+ stbs,ma %r22, 1(%r20)
240
+ stb %ret1, 0(%r20)
241
+
242
+ .Ldone:
243
+ /* all done, return */
244
+ copy %r4, %sp /* pop arg stack */
245
+ ldw 12(%r3), %r4
246
+ ldwm -64(%sp), %r3 /* .. and pop stack */
247
+ ldw -20(%sp), %rp
248
+ bv %r0(%rp)
249
+ nop
250
+ .exit
251
+ .procend
252
+ .LFE1:
253
+
254
+ /* void ffi_closure_pa32(void);
255
+ Called with closure argument in %r21 */
256
+ .export ffi_closure_pa32,code
257
+ .import ffi_closure_inner_pa32,code
258
+
259
+ .type ffi_closure_pa32, @function
260
+ .LFB2:
261
+ ffi_closure_pa32:
262
+ .proc
263
+ .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
264
+ .entry
265
+
266
+ stw %rp, -20(%sp)
267
+ .LCFI20:
268
+ copy %r3, %r1
269
+ .LCFI21:
270
+ copy %sp, %r3
271
+ .LCFI22:
272
+ stwm %r1, 64(%sp)
273
+
274
+ /* Put arguments onto the stack and call ffi_closure_inner. */
275
+ stw %arg0, -36(%r3)
276
+ stw %arg1, -40(%r3)
277
+ stw %arg2, -44(%r3)
278
+ stw %arg3, -48(%r3)
279
+
280
+ copy %r21, %arg0
281
+ bl ffi_closure_inner_pa32, %r2
282
+ copy %r3, %arg1
283
+
284
+ ldwm -64(%sp), %r3
285
+ ldw -20(%sp), %rp
286
+ ldw -36(%sp), %ret0
287
+ bv %r0(%r2)
288
+ ldw -40(%sp), %ret1
289
+
290
+ .exit
291
+ .procend
292
+ .LFE2:
293
+
294
+ .section ".eh_frame",EH_FRAME_FLAGS,@progbits
295
+ .Lframe1:
296
+ .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry
297
+ .LSCIE1:
298
+ .word 0x0 ;# CIE Identifier Tag
299
+ .byte 0x1 ;# CIE Version
300
+ .ascii "\0" ;# CIE Augmentation
301
+ .uleb128 0x1 ;# CIE Code Alignment Factor
302
+ .sleb128 4 ;# CIE Data Alignment Factor
303
+ .byte 0x2 ;# CIE RA Column
304
+ .byte 0xc ;# DW_CFA_def_cfa
305
+ .uleb128 0x1e
306
+ .uleb128 0x0
307
+ .align 4
308
+ .LECIE1:
309
+ .LSFDE1:
310
+ .word .LEFDE1-.LASFDE1 ;# FDE Length
311
+ .LASFDE1:
312
+ .word .LASFDE1-.Lframe1 ;# FDE CIE offset
313
+ .word .LFB1 ;# FDE initial location
314
+ .word .LFE1-.LFB1 ;# FDE address range
315
+
316
+ .byte 0x4 ;# DW_CFA_advance_loc4
317
+ .word .LCFI11-.LFB1
318
+ .byte 0x83 ;# DW_CFA_offset, column 0x3
319
+ .uleb128 0x0
320
+ .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
321
+ .uleb128 0x2
322
+ .sleb128 -5
323
+
324
+ .byte 0x4 ;# DW_CFA_advance_loc4
325
+ .word .LCFI12-.LCFI11
326
+ .byte 0xd ;# DW_CFA_def_cfa_register = r3
327
+ .uleb128 0x3
328
+
329
+ .byte 0x4 ;# DW_CFA_advance_loc4
330
+ .word .LCFI13-.LCFI12
331
+ .byte 0x84 ;# DW_CFA_offset, column 0x4
332
+ .uleb128 0x3
333
+
334
+ .align 4
335
+ .LEFDE1:
336
+
337
+ .LSFDE2:
338
+ .word .LEFDE2-.LASFDE2 ;# FDE Length
339
+ .LASFDE2:
340
+ .word .LASFDE2-.Lframe1 ;# FDE CIE offset
341
+ .word .LFB2 ;# FDE initial location
342
+ .word .LFE2-.LFB2 ;# FDE address range
343
+ .byte 0x4 ;# DW_CFA_advance_loc4
344
+ .word .LCFI21-.LFB2
345
+ .byte 0x83 ;# DW_CFA_offset, column 0x3
346
+ .uleb128 0x0
347
+ .byte 0x11 ;# DW_CFA_offset_extended_sf
348
+ .uleb128 0x2
349
+ .sleb128 -5
350
+
351
+ .byte 0x4 ;# DW_CFA_advance_loc4
352
+ .word .LCFI22-.LCFI21
353
+ .byte 0xd ;# DW_CFA_def_cfa_register = r3
354
+ .uleb128 0x3
355
+
356
+ .align 4
357
+ .LEFDE2: