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,437 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008 Red Hat, Inc.
3
+
4
+ X86 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,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24
+ DEALINGS IN THE SOFTWARE.
25
+ ----------------------------------------------------------------------- */
26
+
27
+ #ifndef __x86_64__
28
+
29
+ #define LIBFFI_ASM
30
+ #include <fficonfig.h>
31
+ #include <ffi.h>
32
+
33
+ .text
34
+
35
+ .globl ffi_prep_args
36
+
37
+ .align 4
38
+ .globl ffi_call_SYSV
39
+ .type ffi_call_SYSV,@function
40
+
41
+ ffi_call_SYSV:
42
+ .LFB1:
43
+ pushl %ebp
44
+ .LCFI0:
45
+ movl %esp,%ebp
46
+ .LCFI1:
47
+ /* Make room for all of the new args. */
48
+ movl 16(%ebp),%ecx
49
+ subl %ecx,%esp
50
+
51
+ movl %esp,%eax
52
+
53
+ /* Place all of the ffi_prep_args in position */
54
+ pushl 12(%ebp)
55
+ pushl %eax
56
+ call *8(%ebp)
57
+
58
+ /* Return stack to previous state and call the function */
59
+ addl $8,%esp
60
+
61
+ call *28(%ebp)
62
+
63
+ /* Load %ecx with the return type code */
64
+ movl 20(%ebp),%ecx
65
+
66
+ /* Protect %esi. We're going to pop it in the epilogue. */
67
+ pushl %esi
68
+
69
+ /* If the return value pointer is NULL, assume no return value. */
70
+ cmpl $0,24(%ebp)
71
+ jne 0f
72
+
73
+ /* Even if there is no space for the return value, we are
74
+ obliged to handle floating-point values. */
75
+ cmpl $FFI_TYPE_FLOAT,%ecx
76
+ jne noretval
77
+ fstp %st(0)
78
+
79
+ jmp epilogue
80
+
81
+ 0:
82
+ call 1f
83
+
84
+ .Lstore_table:
85
+ .long noretval-.Lstore_table /* FFI_TYPE_VOID */
86
+ .long retint-.Lstore_table /* FFI_TYPE_INT */
87
+ .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */
88
+ .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */
89
+ .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */
90
+ .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */
91
+ .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */
92
+ .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */
93
+ .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */
94
+ .long retint-.Lstore_table /* FFI_TYPE_UINT32 */
95
+ .long retint-.Lstore_table /* FFI_TYPE_SINT32 */
96
+ .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */
97
+ .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */
98
+ .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */
99
+ .long retint-.Lstore_table /* FFI_TYPE_POINTER */
100
+
101
+ 1:
102
+ pop %esi
103
+ add (%esi, %ecx, 4), %esi
104
+ jmp *%esi
105
+
106
+ /* Sign/zero extend as appropriate. */
107
+ retsint8:
108
+ movsbl %al, %eax
109
+ jmp retint
110
+
111
+ retsint16:
112
+ movswl %ax, %eax
113
+ jmp retint
114
+
115
+ retuint8:
116
+ movzbl %al, %eax
117
+ jmp retint
118
+
119
+ retuint16:
120
+ movzwl %ax, %eax
121
+ jmp retint
122
+
123
+ retfloat:
124
+ /* Load %ecx with the pointer to storage for the return value */
125
+ movl 24(%ebp),%ecx
126
+ fstps (%ecx)
127
+ jmp epilogue
128
+
129
+ retdouble:
130
+ /* Load %ecx with the pointer to storage for the return value */
131
+ movl 24(%ebp),%ecx
132
+ fstpl (%ecx)
133
+ jmp epilogue
134
+
135
+ retlongdouble:
136
+ /* Load %ecx with the pointer to storage for the return value */
137
+ movl 24(%ebp),%ecx
138
+ fstpt (%ecx)
139
+ jmp epilogue
140
+
141
+ retint64:
142
+ /* Load %ecx with the pointer to storage for the return value */
143
+ movl 24(%ebp),%ecx
144
+ movl %eax,0(%ecx)
145
+ movl %edx,4(%ecx)
146
+ jmp epilogue
147
+
148
+ retint:
149
+ /* Load %ecx with the pointer to storage for the return value */
150
+ movl 24(%ebp),%ecx
151
+ movl %eax,0(%ecx)
152
+
153
+ retstruct:
154
+ /* Nothing to do! */
155
+
156
+ noretval:
157
+ epilogue:
158
+ popl %esi
159
+ movl %ebp,%esp
160
+ popl %ebp
161
+ ret
162
+ .LFE1:
163
+ .ffi_call_SYSV_end:
164
+ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
165
+
166
+ .align 4
167
+ FFI_HIDDEN (ffi_closure_SYSV)
168
+ .globl ffi_closure_SYSV
169
+ .type ffi_closure_SYSV, @function
170
+
171
+ ffi_closure_SYSV:
172
+ .LFB2:
173
+ pushl %ebp
174
+ .LCFI2:
175
+ movl %esp, %ebp
176
+ .LCFI3:
177
+ subl $40, %esp
178
+ leal -24(%ebp), %edx
179
+ movl %edx, -12(%ebp) /* resp */
180
+ leal 8(%ebp), %edx
181
+ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */
182
+ leal -12(%ebp), %edx
183
+ movl %edx, (%esp) /* &resp */
184
+ #if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__
185
+ call ffi_closure_SYSV_inner
186
+ #else
187
+ movl %ebx, 8(%esp)
188
+ .LCFI7:
189
+ call 1f
190
+ 1: popl %ebx
191
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
192
+ call ffi_closure_SYSV_inner@PLT
193
+ movl 8(%esp), %ebx
194
+ #endif
195
+ movl -12(%ebp), %ecx
196
+ cmpl $FFI_TYPE_INT, %eax
197
+ je .Lcls_retint
198
+
199
+ /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
200
+ FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */
201
+ cmpl $FFI_TYPE_UINT64, %eax
202
+ jge 0f
203
+ cmpl $FFI_TYPE_UINT8, %eax
204
+ jge .Lcls_retint
205
+
206
+ 0: cmpl $FFI_TYPE_FLOAT, %eax
207
+ je .Lcls_retfloat
208
+ cmpl $FFI_TYPE_DOUBLE, %eax
209
+ je .Lcls_retdouble
210
+ cmpl $FFI_TYPE_LONGDOUBLE, %eax
211
+ je .Lcls_retldouble
212
+ cmpl $FFI_TYPE_SINT64, %eax
213
+ je .Lcls_retllong
214
+ cmpl $FFI_TYPE_STRUCT, %eax
215
+ je .Lcls_retstruct
216
+ .Lcls_epilogue:
217
+ movl %ebp, %esp
218
+ popl %ebp
219
+ ret
220
+ .Lcls_retint:
221
+ movl (%ecx), %eax
222
+ jmp .Lcls_epilogue
223
+ .Lcls_retfloat:
224
+ flds (%ecx)
225
+ jmp .Lcls_epilogue
226
+ .Lcls_retdouble:
227
+ fldl (%ecx)
228
+ jmp .Lcls_epilogue
229
+ .Lcls_retldouble:
230
+ fldt (%ecx)
231
+ jmp .Lcls_epilogue
232
+ .Lcls_retllong:
233
+ movl (%ecx), %eax
234
+ movl 4(%ecx), %edx
235
+ jmp .Lcls_epilogue
236
+ .Lcls_retstruct:
237
+ movl %ebp, %esp
238
+ popl %ebp
239
+ ret $4
240
+ .LFE2:
241
+ .size ffi_closure_SYSV, .-ffi_closure_SYSV
242
+
243
+ #if !FFI_NO_RAW_API
244
+
245
+ #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
246
+ #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
247
+ #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
248
+ #define CIF_FLAGS_OFFSET 20
249
+
250
+ .align 4
251
+ FFI_HIDDEN (ffi_closure_raw_SYSV)
252
+ .globl ffi_closure_raw_SYSV
253
+ .type ffi_closure_raw_SYSV, @function
254
+
255
+ ffi_closure_raw_SYSV:
256
+ .LFB3:
257
+ pushl %ebp
258
+ .LCFI4:
259
+ movl %esp, %ebp
260
+ .LCFI5:
261
+ pushl %esi
262
+ .LCFI6:
263
+ subl $36, %esp
264
+ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
265
+ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
266
+ movl %edx, 12(%esp) /* user_data */
267
+ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */
268
+ movl %edx, 8(%esp) /* raw_args */
269
+ leal -24(%ebp), %edx
270
+ movl %edx, 4(%esp) /* &res */
271
+ movl %esi, (%esp) /* cif */
272
+ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */
273
+ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */
274
+ cmpl $FFI_TYPE_INT, %eax
275
+ je .Lrcls_retint
276
+
277
+ /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
278
+ FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */
279
+ cmpl $FFI_TYPE_UINT64, %eax
280
+ jge 0f
281
+ cmpl $FFI_TYPE_UINT8, %eax
282
+ jge .Lrcls_retint
283
+ 0:
284
+ cmpl $FFI_TYPE_FLOAT, %eax
285
+ je .Lrcls_retfloat
286
+ cmpl $FFI_TYPE_DOUBLE, %eax
287
+ je .Lrcls_retdouble
288
+ cmpl $FFI_TYPE_LONGDOUBLE, %eax
289
+ je .Lrcls_retldouble
290
+ cmpl $FFI_TYPE_SINT64, %eax
291
+ je .Lrcls_retllong
292
+ .Lrcls_epilogue:
293
+ addl $36, %esp
294
+ popl %esi
295
+ popl %ebp
296
+ ret
297
+ .Lrcls_retint:
298
+ movl -24(%ebp), %eax
299
+ jmp .Lrcls_epilogue
300
+ .Lrcls_retfloat:
301
+ flds -24(%ebp)
302
+ jmp .Lrcls_epilogue
303
+ .Lrcls_retdouble:
304
+ fldl -24(%ebp)
305
+ jmp .Lrcls_epilogue
306
+ .Lrcls_retldouble:
307
+ fldt -24(%ebp)
308
+ jmp .Lrcls_epilogue
309
+ .Lrcls_retllong:
310
+ movl -24(%ebp), %eax
311
+ movl -20(%ebp), %edx
312
+ jmp .Lrcls_epilogue
313
+ .LFE3:
314
+ .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
315
+ #endif
316
+
317
+ .section .eh_frame,EH_FRAME_FLAGS,@progbits
318
+ .Lframe1:
319
+ .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */
320
+ .LSCIE1:
321
+ .long 0x0 /* CIE Identifier Tag */
322
+ .byte 0x1 /* CIE Version */
323
+ #ifdef __PIC__
324
+ .ascii "zR\0" /* CIE Augmentation */
325
+ #else
326
+ .ascii "\0" /* CIE Augmentation */
327
+ #endif
328
+ .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
329
+ .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */
330
+ .byte 0x8 /* CIE RA Column */
331
+ #ifdef __PIC__
332
+ .byte 0x1 /* .uleb128 0x1; Augmentation size */
333
+ .byte 0x1b /* FDE Encoding (pcrel sdata4) */
334
+ #endif
335
+ .byte 0xc /* DW_CFA_def_cfa */
336
+ .byte 0x4 /* .uleb128 0x4 */
337
+ .byte 0x4 /* .uleb128 0x4 */
338
+ .byte 0x88 /* DW_CFA_offset, column 0x8 */
339
+ .byte 0x1 /* .uleb128 0x1 */
340
+ .align 4
341
+ .LECIE1:
342
+ .LSFDE1:
343
+ .long .LEFDE1-.LASFDE1 /* FDE Length */
344
+ .LASFDE1:
345
+ .long .LASFDE1-.Lframe1 /* FDE CIE offset */
346
+ #ifdef __PIC__
347
+ .long .LFB1-. /* FDE initial location */
348
+ #else
349
+ .long .LFB1 /* FDE initial location */
350
+ #endif
351
+ .long .LFE1-.LFB1 /* FDE address range */
352
+ #ifdef __PIC__
353
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
354
+ #endif
355
+ .byte 0x4 /* DW_CFA_advance_loc4 */
356
+ .long .LCFI0-.LFB1
357
+ .byte 0xe /* DW_CFA_def_cfa_offset */
358
+ .byte 0x8 /* .uleb128 0x8 */
359
+ .byte 0x85 /* DW_CFA_offset, column 0x5 */
360
+ .byte 0x2 /* .uleb128 0x2 */
361
+ .byte 0x4 /* DW_CFA_advance_loc4 */
362
+ .long .LCFI1-.LCFI0
363
+ .byte 0xd /* DW_CFA_def_cfa_register */
364
+ .byte 0x5 /* .uleb128 0x5 */
365
+ .align 4
366
+ .LEFDE1:
367
+ .LSFDE2:
368
+ .long .LEFDE2-.LASFDE2 /* FDE Length */
369
+ .LASFDE2:
370
+ .long .LASFDE2-.Lframe1 /* FDE CIE offset */
371
+ #ifdef __PIC__
372
+ .long .LFB2-. /* FDE initial location */
373
+ #else
374
+ .long .LFB2
375
+ #endif
376
+ .long .LFE2-.LFB2 /* FDE address range */
377
+ #ifdef __PIC__
378
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
379
+ #endif
380
+ .byte 0x4 /* DW_CFA_advance_loc4 */
381
+ .long .LCFI2-.LFB2
382
+ .byte 0xe /* DW_CFA_def_cfa_offset */
383
+ .byte 0x8 /* .uleb128 0x8 */
384
+ .byte 0x85 /* DW_CFA_offset, column 0x5 */
385
+ .byte 0x2 /* .uleb128 0x2 */
386
+ .byte 0x4 /* DW_CFA_advance_loc4 */
387
+ .long .LCFI3-.LCFI2
388
+ .byte 0xd /* DW_CFA_def_cfa_register */
389
+ .byte 0x5 /* .uleb128 0x5 */
390
+ #if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__
391
+ .byte 0x4 /* DW_CFA_advance_loc4 */
392
+ .long .LCFI7-.LCFI3
393
+ .byte 0x83 /* DW_CFA_offset, column 0x3 */
394
+ .byte 0xa /* .uleb128 0xa */
395
+ #endif
396
+ .align 4
397
+ .LEFDE2:
398
+
399
+ #if !FFI_NO_RAW_API
400
+
401
+ .LSFDE3:
402
+ .long .LEFDE3-.LASFDE3 /* FDE Length */
403
+ .LASFDE3:
404
+ .long .LASFDE3-.Lframe1 /* FDE CIE offset */
405
+ #ifdef __PIC__
406
+ .long .LFB3-. /* FDE initial location */
407
+ #else
408
+ .long .LFB3
409
+ #endif
410
+ .long .LFE3-.LFB3 /* FDE address range */
411
+ #ifdef __PIC__
412
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
413
+ #endif
414
+ .byte 0x4 /* DW_CFA_advance_loc4 */
415
+ .long .LCFI4-.LFB3
416
+ .byte 0xe /* DW_CFA_def_cfa_offset */
417
+ .byte 0x8 /* .uleb128 0x8 */
418
+ .byte 0x85 /* DW_CFA_offset, column 0x5 */
419
+ .byte 0x2 /* .uleb128 0x2 */
420
+ .byte 0x4 /* DW_CFA_advance_loc4 */
421
+ .long .LCFI5-.LCFI4
422
+ .byte 0xd /* DW_CFA_def_cfa_register */
423
+ .byte 0x5 /* .uleb128 0x5 */
424
+ .byte 0x4 /* DW_CFA_advance_loc4 */
425
+ .long .LCFI6-.LCFI5
426
+ .byte 0x86 /* DW_CFA_offset, column 0x6 */
427
+ .byte 0x3 /* .uleb128 0x3 */
428
+ .align 4
429
+ .LEFDE3:
430
+
431
+ #endif
432
+
433
+ #endif /* ifndef __x86_64__ */
434
+
435
+ #if defined __ELF__ && defined __linux__
436
+ .section .note.GNU-stack,"",@progbits
437
+ #endif
@@ -0,0 +1,418 @@
1
+ /* -----------------------------------------------------------------------
2
+ unix64.S - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
3
+ Copyright (c) 2008 Red Hat, Inc
4
+
5
+ x86-64 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,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
26
+ ----------------------------------------------------------------------- */
27
+
28
+ #ifdef __x86_64__
29
+ #define LIBFFI_ASM
30
+ #include <fficonfig.h>
31
+ #include <ffi.h>
32
+
33
+ .text
34
+
35
+ /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
36
+ void *raddr, void (*fnaddr)(void));
37
+
38
+ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
39
+ for this function. This has been allocated by ffi_call. We also
40
+ deallocate some of the stack that has been alloca'd. */
41
+
42
+ .align 2
43
+ .globl ffi_call_unix64
44
+ .type ffi_call_unix64,@function
45
+
46
+ ffi_call_unix64:
47
+ .LUW0:
48
+ movq (%rsp), %r10 /* Load return address. */
49
+ leaq (%rdi, %rsi), %rax /* Find local stack base. */
50
+ movq %rdx, (%rax) /* Save flags. */
51
+ movq %rcx, 8(%rax) /* Save raddr. */
52
+ movq %rbp, 16(%rax) /* Save old frame pointer. */
53
+ movq %r10, 24(%rax) /* Relocate return address. */
54
+ movq %rax, %rbp /* Finalize local stack frame. */
55
+ .LUW1:
56
+ movq %rdi, %r10 /* Save a copy of the register area. */
57
+ movq %r8, %r11 /* Save a copy of the target fn. */
58
+ movl %r9d, %eax /* Set number of SSE registers. */
59
+
60
+ /* Load up all argument registers. */
61
+ movq (%r10), %rdi
62
+ movq 8(%r10), %rsi
63
+ movq 16(%r10), %rdx
64
+ movq 24(%r10), %rcx
65
+ movq 32(%r10), %r8
66
+ movq 40(%r10), %r9
67
+ testl %eax, %eax
68
+ jnz .Lload_sse
69
+ .Lret_from_load_sse:
70
+
71
+ /* Deallocate the reg arg area. */
72
+ leaq 176(%r10), %rsp
73
+
74
+ /* Call the user function. */
75
+ call *%r11
76
+
77
+ /* Deallocate stack arg area; local stack frame in redzone. */
78
+ leaq 24(%rbp), %rsp
79
+
80
+ movq 0(%rbp), %rcx /* Reload flags. */
81
+ movq 8(%rbp), %rdi /* Reload raddr. */
82
+ movq 16(%rbp), %rbp /* Reload old frame pointer. */
83
+ .LUW2:
84
+
85
+ /* The first byte of the flags contains the FFI_TYPE. */
86
+ movzbl %cl, %r10d
87
+ leaq .Lstore_table(%rip), %r11
88
+ movslq (%r11, %r10, 4), %r10
89
+ addq %r11, %r10
90
+ jmp *%r10
91
+
92
+ .section .rodata
93
+ .Lstore_table:
94
+ .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */
95
+ .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */
96
+ .long .Lst_float-.Lstore_table /* FFI_TYPE_FLOAT */
97
+ .long .Lst_double-.Lstore_table /* FFI_TYPE_DOUBLE */
98
+ .long .Lst_ldouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */
99
+ .long .Lst_uint8-.Lstore_table /* FFI_TYPE_UINT8 */
100
+ .long .Lst_sint8-.Lstore_table /* FFI_TYPE_SINT8 */
101
+ .long .Lst_uint16-.Lstore_table /* FFI_TYPE_UINT16 */
102
+ .long .Lst_sint16-.Lstore_table /* FFI_TYPE_SINT16 */
103
+ .long .Lst_uint32-.Lstore_table /* FFI_TYPE_UINT32 */
104
+ .long .Lst_sint32-.Lstore_table /* FFI_TYPE_SINT32 */
105
+ .long .Lst_int64-.Lstore_table /* FFI_TYPE_UINT64 */
106
+ .long .Lst_int64-.Lstore_table /* FFI_TYPE_SINT64 */
107
+ .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */
108
+ .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */
109
+
110
+ .text
111
+ .align 2
112
+ .Lst_void:
113
+ ret
114
+ .align 2
115
+
116
+ .Lst_uint8:
117
+ movzbq %al, %rax
118
+ movq %rax, (%rdi)
119
+ ret
120
+ .align 2
121
+ .Lst_sint8:
122
+ movsbq %al, %rax
123
+ movq %rax, (%rdi)
124
+ ret
125
+ .align 2
126
+ .Lst_uint16:
127
+ movzwq %ax, %rax
128
+ movq %rax, (%rdi)
129
+ .align 2
130
+ .Lst_sint16:
131
+ movswq %ax, %rax
132
+ movq %rax, (%rdi)
133
+ ret
134
+ .align 2
135
+ .Lst_uint32:
136
+ movl %eax, %eax
137
+ movq %rax, (%rdi)
138
+ .align 2
139
+ .Lst_sint32:
140
+ cltq
141
+ movq %rax, (%rdi)
142
+ ret
143
+ .align 2
144
+ .Lst_int64:
145
+ movq %rax, (%rdi)
146
+ ret
147
+
148
+ .align 2
149
+ .Lst_float:
150
+ movss %xmm0, (%rdi)
151
+ ret
152
+ .align 2
153
+ .Lst_double:
154
+ movsd %xmm0, (%rdi)
155
+ ret
156
+ .Lst_ldouble:
157
+ fstpt (%rdi)
158
+ ret
159
+
160
+ .align 2
161
+ .Lst_struct:
162
+ leaq -20(%rsp), %rsi /* Scratch area in redzone. */
163
+
164
+ /* We have to locate the values now, and since we don't want to
165
+ write too much data into the user's return value, we spill the
166
+ value to a 16 byte scratch area first. Bits 8, 9, and 10
167
+ control where the values are located. Only one of the three
168
+ bits will be set; see ffi_prep_cif_machdep for the pattern. */
169
+ movd %xmm0, %r10
170
+ movd %xmm1, %r11
171
+ testl $0x100, %ecx
172
+ cmovnz %rax, %rdx
173
+ cmovnz %r10, %rax
174
+ testl $0x200, %ecx
175
+ cmovnz %r10, %rdx
176
+ testl $0x400, %ecx
177
+ cmovnz %r10, %rax
178
+ cmovnz %r11, %rdx
179
+ movq %rax, (%rsi)
180
+ movq %rdx, 8(%rsi)
181
+
182
+ /* Bits 12-31 contain the true size of the structure. Copy from
183
+ the scratch area to the true destination. */
184
+ shrl $12, %ecx
185
+ rep movsb
186
+ ret
187
+
188
+ /* Many times we can avoid loading any SSE registers at all.
189
+ It's not worth an indirect jump to load the exact set of
190
+ SSE registers needed; zero or all is a good compromise. */
191
+ .align 2
192
+ .LUW3:
193
+ .Lload_sse:
194
+ movdqa 48(%r10), %xmm0
195
+ movdqa 64(%r10), %xmm1
196
+ movdqa 80(%r10), %xmm2
197
+ movdqa 96(%r10), %xmm3
198
+ movdqa 112(%r10), %xmm4
199
+ movdqa 128(%r10), %xmm5
200
+ movdqa 144(%r10), %xmm6
201
+ movdqa 160(%r10), %xmm7
202
+ jmp .Lret_from_load_sse
203
+
204
+ .LUW4:
205
+ .size ffi_call_unix64,.-ffi_call_unix64
206
+
207
+ .align 2
208
+ .globl ffi_closure_unix64
209
+ .type ffi_closure_unix64,@function
210
+
211
+ ffi_closure_unix64:
212
+ .LUW5:
213
+ /* The carry flag is set by the trampoline iff SSE registers
214
+ are used. Don't clobber it before the branch instruction. */
215
+ leaq -200(%rsp), %rsp
216
+ .LUW6:
217
+ movq %rdi, (%rsp)
218
+ movq %rsi, 8(%rsp)
219
+ movq %rdx, 16(%rsp)
220
+ movq %rcx, 24(%rsp)
221
+ movq %r8, 32(%rsp)
222
+ movq %r9, 40(%rsp)
223
+ jc .Lsave_sse
224
+ .Lret_from_save_sse:
225
+
226
+ movq %r10, %rdi
227
+ leaq 176(%rsp), %rsi
228
+ movq %rsp, %rdx
229
+ leaq 208(%rsp), %rcx
230
+ call ffi_closure_unix64_inner@PLT
231
+
232
+ /* Deallocate stack frame early; return value is now in redzone. */
233
+ addq $200, %rsp
234
+ .LUW7:
235
+
236
+ /* The first byte of the return value contains the FFI_TYPE. */
237
+ movzbl %al, %r10d
238
+ leaq .Lload_table(%rip), %r11
239
+ movslq (%r11, %r10, 4), %r10
240
+ addq %r11, %r10
241
+ jmp *%r10
242
+
243
+ .section .rodata
244
+ .Lload_table:
245
+ .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */
246
+ .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */
247
+ .long .Lld_float-.Lload_table /* FFI_TYPE_FLOAT */
248
+ .long .Lld_double-.Lload_table /* FFI_TYPE_DOUBLE */
249
+ .long .Lld_ldouble-.Lload_table /* FFI_TYPE_LONGDOUBLE */
250
+ .long .Lld_int8-.Lload_table /* FFI_TYPE_UINT8 */
251
+ .long .Lld_int8-.Lload_table /* FFI_TYPE_SINT8 */
252
+ .long .Lld_int16-.Lload_table /* FFI_TYPE_UINT16 */
253
+ .long .Lld_int16-.Lload_table /* FFI_TYPE_SINT16 */
254
+ .long .Lld_int32-.Lload_table /* FFI_TYPE_UINT32 */
255
+ .long .Lld_int32-.Lload_table /* FFI_TYPE_SINT32 */
256
+ .long .Lld_int64-.Lload_table /* FFI_TYPE_UINT64 */
257
+ .long .Lld_int64-.Lload_table /* FFI_TYPE_SINT64 */
258
+ .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */
259
+ .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */
260
+
261
+ .text
262
+ .align 2
263
+ .Lld_void:
264
+ ret
265
+
266
+ .align 2
267
+ .Lld_int8:
268
+ movzbl -24(%rsp), %eax
269
+ ret
270
+ .align 2
271
+ .Lld_int16:
272
+ movzwl -24(%rsp), %eax
273
+ ret
274
+ .align 2
275
+ .Lld_int32:
276
+ movl -24(%rsp), %eax
277
+ ret
278
+ .align 2
279
+ .Lld_int64:
280
+ movq -24(%rsp), %rax
281
+ ret
282
+
283
+ .align 2
284
+ .Lld_float:
285
+ movss -24(%rsp), %xmm0
286
+ ret
287
+ .align 2
288
+ .Lld_double:
289
+ movsd -24(%rsp), %xmm0
290
+ ret
291
+ .align 2
292
+ .Lld_ldouble:
293
+ fldt -24(%rsp)
294
+ ret
295
+
296
+ .align 2
297
+ .Lld_struct:
298
+ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax,
299
+ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading
300
+ both rdx and xmm1 with the second word. For the remaining,
301
+ bit 8 set means xmm0 gets the second word, and bit 9 means
302
+ that rax gets the second word. */
303
+ movq -24(%rsp), %rcx
304
+ movq -16(%rsp), %rdx
305
+ movq -16(%rsp), %xmm1
306
+ testl $0x100, %eax
307
+ cmovnz %rdx, %rcx
308
+ movd %rcx, %xmm0
309
+ testl $0x200, %eax
310
+ movq -24(%rsp), %rax
311
+ cmovnz %rdx, %rax
312
+ ret
313
+
314
+ /* See the comment above .Lload_sse; the same logic applies here. */
315
+ .align 2
316
+ .LUW8:
317
+ .Lsave_sse:
318
+ movdqa %xmm0, 48(%rsp)
319
+ movdqa %xmm1, 64(%rsp)
320
+ movdqa %xmm2, 80(%rsp)
321
+ movdqa %xmm3, 96(%rsp)
322
+ movdqa %xmm4, 112(%rsp)
323
+ movdqa %xmm5, 128(%rsp)
324
+ movdqa %xmm6, 144(%rsp)
325
+ movdqa %xmm7, 160(%rsp)
326
+ jmp .Lret_from_save_sse
327
+
328
+ .LUW9:
329
+ .size ffi_closure_unix64,.-ffi_closure_unix64
330
+
331
+ .section .eh_frame,"a",@progbits
332
+ .Lframe1:
333
+ .long .LECIE1-.LSCIE1 /* CIE Length */
334
+ .LSCIE1:
335
+ .long 0 /* CIE Identifier Tag */
336
+ .byte 1 /* CIE Version */
337
+ .ascii "zR\0" /* CIE Augmentation */
338
+ .uleb128 1 /* CIE Code Alignment Factor */
339
+ .sleb128 -8 /* CIE Data Alignment Factor */
340
+ .byte 0x10 /* CIE RA Column */
341
+ .uleb128 1 /* Augmentation size */
342
+ .byte 0x1b /* FDE Encoding (pcrel sdata4) */
343
+ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */
344
+ .uleb128 7
345
+ .uleb128 8
346
+ .byte 0x80+16 /* DW_CFA_offset, %rip offset 1*-8 */
347
+ .uleb128 1
348
+ .align 8
349
+ .LECIE1:
350
+ .LSFDE1:
351
+ .long .LEFDE1-.LASFDE1 /* FDE Length */
352
+ .LASFDE1:
353
+ .long .LASFDE1-.Lframe1 /* FDE CIE offset */
354
+ .long .LUW0-. /* FDE initial location */
355
+ .long .LUW4-.LUW0 /* FDE address range */
356
+ .uleb128 0x0 /* Augmentation size */
357
+
358
+ .byte 0x4 /* DW_CFA_advance_loc4 */
359
+ .long .LUW1-.LUW0
360
+
361
+ /* New stack frame based off rbp. This is a itty bit of unwind
362
+ trickery in that the CFA *has* changed. There is no easy way
363
+ to describe it correctly on entry to the function. Fortunately,
364
+ it doesn't matter too much since at all points we can correctly
365
+ unwind back to ffi_call. Note that the location to which we
366
+ moved the return address is (the new) CFA-8, so from the
367
+ perspective of the unwind info, it hasn't moved. */
368
+ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */
369
+ .uleb128 6
370
+ .uleb128 32
371
+ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */
372
+ .uleb128 2
373
+ .byte 0xa /* DW_CFA_remember_state */
374
+
375
+ .byte 0x4 /* DW_CFA_advance_loc4 */
376
+ .long .LUW2-.LUW1
377
+ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */
378
+ .uleb128 7
379
+ .uleb128 8
380
+ .byte 0xc0+6 /* DW_CFA_restore, %rbp */
381
+
382
+ .byte 0x4 /* DW_CFA_advance_loc4 */
383
+ .long .LUW3-.LUW2
384
+ .byte 0xb /* DW_CFA_restore_state */
385
+
386
+ .align 8
387
+ .LEFDE1:
388
+ .LSFDE3:
389
+ .long .LEFDE3-.LASFDE3 /* FDE Length */
390
+ .LASFDE3:
391
+ .long .LASFDE3-.Lframe1 /* FDE CIE offset */
392
+ .long .LUW5-. /* FDE initial location */
393
+ .long .LUW9-.LUW5 /* FDE address range */
394
+ .uleb128 0x0 /* Augmentation size */
395
+
396
+ .byte 0x4 /* DW_CFA_advance_loc4 */
397
+ .long .LUW6-.LUW5
398
+ .byte 0xe /* DW_CFA_def_cfa_offset */
399
+ .uleb128 208
400
+ .byte 0xa /* DW_CFA_remember_state */
401
+
402
+ .byte 0x4 /* DW_CFA_advance_loc4 */
403
+ .long .LUW7-.LUW6
404
+ .byte 0xe /* DW_CFA_def_cfa_offset */
405
+ .uleb128 8
406
+
407
+ .byte 0x4 /* DW_CFA_advance_loc4 */
408
+ .long .LUW8-.LUW7
409
+ .byte 0xb /* DW_CFA_restore_state */
410
+
411
+ .align 8
412
+ .LEFDE3:
413
+
414
+ #endif /* __x86_64__ */
415
+
416
+ #if defined __ELF__ && defined __linux__
417
+ .section .note.GNU-stack,"",@progbits
418
+ #endif