ffi 1.9.3-x64-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 (436) hide show
  1. data/COPYING +49 -0
  2. data/LICENSE +24 -0
  3. data/README.md +109 -0
  4. data/Rakefile +220 -0
  5. data/ext/ffi_c/AbstractMemory.c +1032 -0
  6. data/ext/ffi_c/AbstractMemory.h +175 -0
  7. data/ext/ffi_c/ArrayType.c +162 -0
  8. data/ext/ffi_c/ArrayType.h +59 -0
  9. data/ext/ffi_c/Buffer.c +365 -0
  10. data/ext/ffi_c/Call.c +465 -0
  11. data/ext/ffi_c/Call.h +93 -0
  12. data/ext/ffi_c/ClosurePool.c +283 -0
  13. data/ext/ffi_c/ClosurePool.h +57 -0
  14. data/ext/ffi_c/DataConverter.c +91 -0
  15. data/ext/ffi_c/DynamicLibrary.c +333 -0
  16. data/ext/ffi_c/DynamicLibrary.h +49 -0
  17. data/ext/ffi_c/Function.c +999 -0
  18. data/ext/ffi_c/Function.h +87 -0
  19. data/ext/ffi_c/FunctionInfo.c +271 -0
  20. data/ext/ffi_c/LastError.c +184 -0
  21. data/ext/ffi_c/LastError.h +47 -0
  22. data/ext/ffi_c/LongDouble.c +63 -0
  23. data/ext/ffi_c/LongDouble.h +51 -0
  24. data/ext/ffi_c/MappedType.c +168 -0
  25. data/ext/ffi_c/MappedType.h +59 -0
  26. data/ext/ffi_c/MemoryPointer.c +197 -0
  27. data/ext/ffi_c/MemoryPointer.h +53 -0
  28. data/ext/ffi_c/MethodHandle.c +360 -0
  29. data/ext/ffi_c/MethodHandle.h +55 -0
  30. data/ext/ffi_c/Platform.c +121 -0
  31. data/ext/ffi_c/Platform.h +45 -0
  32. data/ext/ffi_c/Pointer.c +508 -0
  33. data/ext/ffi_c/Pointer.h +63 -0
  34. data/ext/ffi_c/Struct.c +828 -0
  35. data/ext/ffi_c/Struct.h +106 -0
  36. data/ext/ffi_c/StructByReference.c +190 -0
  37. data/ext/ffi_c/StructByReference.h +50 -0
  38. data/ext/ffi_c/StructByValue.c +150 -0
  39. data/ext/ffi_c/StructByValue.h +55 -0
  40. data/ext/ffi_c/StructLayout.c +698 -0
  41. data/ext/ffi_c/Thread.c +352 -0
  42. data/ext/ffi_c/Thread.h +95 -0
  43. data/ext/ffi_c/Type.c +397 -0
  44. data/ext/ffi_c/Type.h +62 -0
  45. data/ext/ffi_c/Types.c +139 -0
  46. data/ext/ffi_c/Types.h +89 -0
  47. data/ext/ffi_c/Variadic.c +276 -0
  48. data/ext/ffi_c/compat.h +83 -0
  49. data/ext/ffi_c/extconf.rb +64 -0
  50. data/ext/ffi_c/ffi.c +98 -0
  51. data/ext/ffi_c/libffi.bsd.mk +34 -0
  52. data/ext/ffi_c/libffi.darwin.mk +95 -0
  53. data/ext/ffi_c/libffi.gnu.mk +31 -0
  54. data/ext/ffi_c/libffi.mk +13 -0
  55. data/ext/ffi_c/libffi.vc.mk +26 -0
  56. data/ext/ffi_c/libffi.vc64.mk +26 -0
  57. data/ext/ffi_c/libffi/ChangeLog +4600 -0
  58. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  59. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  60. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  61. data/ext/ffi_c/libffi/LICENSE +21 -0
  62. data/ext/ffi_c/libffi/Makefile.am +196 -0
  63. data/ext/ffi_c/libffi/Makefile.in +1820 -0
  64. data/ext/ffi_c/libffi/Makefile.vc +141 -0
  65. data/ext/ffi_c/libffi/Makefile.vc64 +141 -0
  66. data/ext/ffi_c/libffi/README +342 -0
  67. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  68. data/ext/ffi_c/libffi/aclocal.m4 +1873 -0
  69. data/ext/ffi_c/libffi/build-ios.sh +67 -0
  70. data/ext/ffi_c/libffi/compile +143 -0
  71. data/ext/ffi_c/libffi/config.guess +1501 -0
  72. data/ext/ffi_c/libffi/config.sub +1705 -0
  73. data/ext/ffi_c/libffi/configure +17191 -0
  74. data/ext/ffi_c/libffi/configure.ac +496 -0
  75. data/ext/ffi_c/libffi/configure.host +11 -0
  76. data/ext/ffi_c/libffi/depcomp +630 -0
  77. data/ext/ffi_c/libffi/doc/libffi.info +593 -0
  78. data/ext/ffi_c/libffi/doc/libffi.texi +600 -0
  79. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  80. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  81. data/ext/ffi_c/libffi/fficonfig.h.in +199 -0
  82. data/ext/ffi_c/libffi/fficonfig.hw +57 -0
  83. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  84. data/ext/ffi_c/libffi/include/Makefile.in +487 -0
  85. data/ext/ffi_c/libffi/include/ffi.h.in +427 -0
  86. data/ext/ffi_c/libffi/include/ffi.h.vc +427 -0
  87. data/ext/ffi_c/libffi/include/ffi.h.vc64 +427 -0
  88. data/ext/ffi_c/libffi/include/ffi_common.h +126 -0
  89. data/ext/ffi_c/libffi/install-sh +520 -0
  90. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  91. data/ext/ffi_c/libffi/libtool-version +29 -0
  92. data/ext/ffi_c/libffi/ltmain.sh +9636 -0
  93. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +176 -0
  94. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +195 -0
  95. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +76 -0
  96. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +63 -0
  97. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  98. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +300 -0
  99. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +215 -0
  100. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +79 -0
  101. data/ext/ffi_c/libffi/m4/libtool.m4 +7831 -0
  102. data/ext/ffi_c/libffi/m4/ltoptions.m4 +369 -0
  103. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  104. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  105. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +98 -0
  106. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  107. data/ext/ffi_c/libffi/man/Makefile.in +466 -0
  108. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  109. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  110. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  111. data/ext/ffi_c/libffi/mdate-sh +201 -0
  112. data/ext/ffi_c/libffi/missing +376 -0
  113. data/ext/ffi_c/libffi/msvcc.sh +197 -0
  114. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  115. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  116. data/ext/ffi_c/libffi/src/alpha/osf.S +387 -0
  117. data/ext/ffi_c/libffi/src/arm/ffi.c +728 -0
  118. data/ext/ffi_c/libffi/src/arm/ffitarget.h +65 -0
  119. data/ext/ffi_c/libffi/src/arm/gentramp.sh +118 -0
  120. data/ext/ffi_c/libffi/src/arm/sysv.S +497 -0
  121. data/ext/ffi_c/libffi/src/arm/trampoline.S +4450 -0
  122. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  123. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  124. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  125. data/ext/ffi_c/libffi/src/closures.c +615 -0
  126. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  127. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  128. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  129. data/ext/ffi_c/libffi/src/debug.c +59 -0
  130. data/ext/ffi_c/libffi/src/dlmalloc.c +5161 -0
  131. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  132. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  133. data/ext/ffi_c/libffi/src/frv/ffitarget.h +57 -0
  134. data/ext/ffi_c/libffi/src/ia64/ffi.c +582 -0
  135. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  136. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  137. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  138. data/ext/ffi_c/libffi/src/java_raw_api.c +356 -0
  139. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  140. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  141. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  142. data/ext/ffi_c/libffi/src/m68k/ffi.c +288 -0
  143. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  144. data/ext/ffi_c/libffi/src/m68k/sysv.S +270 -0
  145. data/ext/ffi_c/libffi/src/mips/ffi.c +1036 -0
  146. data/ext/ffi_c/libffi/src/mips/ffitarget.h +242 -0
  147. data/ext/ffi_c/libffi/src/mips/n32.S +591 -0
  148. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  149. data/ext/ffi_c/libffi/src/moxie/eabi.S +128 -0
  150. data/ext/ffi_c/libffi/src/moxie/ffi.c +276 -0
  151. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  152. data/ext/ffi_c/libffi/src/pa/ffitarget.h +78 -0
  153. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  154. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  155. data/ext/ffi_c/libffi/src/powerpc/aix.S +328 -0
  156. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +445 -0
  157. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  158. data/ext/ffi_c/libffi/src/powerpc/darwin.S +383 -0
  159. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +575 -0
  160. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1448 -0
  161. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1359 -0
  162. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +139 -0
  163. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  164. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  165. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  166. data/ext/ffi_c/libffi/src/powerpc/sysv.S +219 -0
  167. data/ext/ffi_c/libffi/src/prep_cif.c +177 -0
  168. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  169. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  170. data/ext/ffi_c/libffi/src/s390/ffitarget.h +62 -0
  171. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  172. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  173. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  174. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  175. data/ext/ffi_c/libffi/src/sh64/ffi.c +468 -0
  176. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  177. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  178. data/ext/ffi_c/libffi/src/sparc/ffi.c +669 -0
  179. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +68 -0
  180. data/ext/ffi_c/libffi/src/sparc/v8.S +313 -0
  181. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  182. data/ext/ffi_c/libffi/src/types.c +77 -0
  183. data/ext/ffi_c/libffi/src/x86/darwin.S +444 -0
  184. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  185. data/ext/ffi_c/libffi/src/x86/ffi.c +644 -0
  186. data/ext/ffi_c/libffi/src/x86/ffi64.c +635 -0
  187. data/ext/ffi_c/libffi/src/x86/ffitarget.h +121 -0
  188. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  189. data/ext/ffi_c/libffi/src/x86/sysv.S +468 -0
  190. data/ext/ffi_c/libffi/src/x86/unix64.S +426 -0
  191. data/ext/ffi_c/libffi/src/x86/win32.S +1065 -0
  192. data/ext/ffi_c/libffi/src/x86/win64.S +468 -0
  193. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -0
  194. data/ext/ffi_c/libffi/testsuite/Makefile.in +500 -0
  195. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  196. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +300 -0
  197. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +350 -0
  198. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  199. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +32 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +64 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +60 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +60 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +153 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +58 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +133 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +96 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +35 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +124 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  327. data/ext/ffi_c/libffi/texinfo.tex +7210 -0
  328. data/ext/ffi_c/rbffi.h +57 -0
  329. data/ext/ffi_c/rbffi_endian.h +59 -0
  330. data/ext/ffi_c/win32/stdbool.h +8 -0
  331. data/ext/ffi_c/win32/stdint.h +201 -0
  332. data/ffi.gemspec +22 -0
  333. data/gen/Rakefile +30 -0
  334. data/lib/ffi.rb +28 -0
  335. data/lib/ffi/autopointer.rb +194 -0
  336. data/lib/ffi/buffer.rb +4 -0
  337. data/lib/ffi/callback.rb +4 -0
  338. data/lib/ffi/enum.rb +173 -0
  339. data/lib/ffi/errno.rb +43 -0
  340. data/lib/ffi/ffi.rb +44 -0
  341. data/lib/ffi/io.rb +62 -0
  342. data/lib/ffi/library.rb +499 -0
  343. data/lib/ffi/managedstruct.rb +84 -0
  344. data/lib/ffi/memorypointer.rb +1 -0
  345. data/lib/ffi/platform.rb +148 -0
  346. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  347. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  348. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  349. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  350. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  351. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  352. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  353. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  354. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  355. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  356. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  357. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  358. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  359. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  360. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  361. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  362. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  363. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  364. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  365. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  366. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  367. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  368. data/lib/ffi/platform/x86_64-darwin/types.conf +100 -0
  369. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  370. data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
  371. data/lib/ffi/platform/x86_64-netbsd/types.conf +126 -0
  372. data/lib/ffi/platform/x86_64-openbsd/types.conf +128 -0
  373. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  374. data/lib/ffi/platform/x86_64-windows/types.conf +27 -0
  375. data/lib/ffi/pointer.rb +134 -0
  376. data/lib/ffi/struct.rb +367 -0
  377. data/lib/ffi/struct_layout_builder.rb +222 -0
  378. data/lib/ffi/tools/const_generator.rb +229 -0
  379. data/lib/ffi/tools/generator.rb +60 -0
  380. data/lib/ffi/tools/generator_task.rb +36 -0
  381. data/lib/ffi/tools/struct_generator.rb +194 -0
  382. data/lib/ffi/tools/types_generator.rb +135 -0
  383. data/lib/ffi/types.rb +190 -0
  384. data/lib/ffi/union.rb +43 -0
  385. data/lib/ffi/variadic.rb +78 -0
  386. data/lib/ffi/version.rb +4 -0
  387. data/lib/ffi_c.so +0 -0
  388. data/libtest/Benchmark.c +52 -0
  389. data/libtest/BoolTest.c +34 -0
  390. data/libtest/BufferTest.c +31 -0
  391. data/libtest/ClosureTest.c +190 -0
  392. data/libtest/EnumTest.c +34 -0
  393. data/libtest/FunctionTest.c +58 -0
  394. data/libtest/GNUmakefile +149 -0
  395. data/libtest/GlobalVariable.c +62 -0
  396. data/libtest/LastErrorTest.c +21 -0
  397. data/libtest/NumberTest.c +132 -0
  398. data/libtest/PointerTest.c +63 -0
  399. data/libtest/ReferenceTest.c +23 -0
  400. data/libtest/StringTest.c +34 -0
  401. data/libtest/StructTest.c +243 -0
  402. data/libtest/UnionTest.c +43 -0
  403. data/libtest/VariadicTest.c +62 -0
  404. data/spec/ffi/async_callback_spec.rb +35 -0
  405. data/spec/ffi/bool_spec.rb +29 -0
  406. data/spec/ffi/buffer_spec.rb +251 -0
  407. data/spec/ffi/callback_spec.rb +667 -0
  408. data/spec/ffi/custom_param_type.rb +36 -0
  409. data/spec/ffi/custom_type_spec.rb +74 -0
  410. data/spec/ffi/dup_spec.rb +54 -0
  411. data/spec/ffi/enum_spec.rb +220 -0
  412. data/spec/ffi/errno_spec.rb +18 -0
  413. data/spec/ffi/ffi_spec.rb +29 -0
  414. data/spec/ffi/function_spec.rb +76 -0
  415. data/spec/ffi/library_spec.rb +216 -0
  416. data/spec/ffi/long_double.rb +30 -0
  417. data/spec/ffi/managed_struct_spec.rb +57 -0
  418. data/spec/ffi/number_spec.rb +236 -0
  419. data/spec/ffi/pointer_spec.rb +265 -0
  420. data/spec/ffi/rbx/attach_function_spec.rb +28 -0
  421. data/spec/ffi/rbx/memory_pointer_spec.rb +123 -0
  422. data/spec/ffi/rbx/spec_helper.rb +1 -0
  423. data/spec/ffi/rbx/struct_spec.rb +13 -0
  424. data/spec/ffi/spec_helper.rb +33 -0
  425. data/spec/ffi/string_spec.rb +108 -0
  426. data/spec/ffi/strptr_spec.rb +50 -0
  427. data/spec/ffi/struct_by_ref_spec.rb +43 -0
  428. data/spec/ffi/struct_callback_spec.rb +69 -0
  429. data/spec/ffi/struct_initialize_spec.rb +35 -0
  430. data/spec/ffi/struct_packed_spec.rb +51 -0
  431. data/spec/ffi/struct_spec.rb +748 -0
  432. data/spec/ffi/typedef_spec.rb +78 -0
  433. data/spec/ffi/union_spec.rb +65 -0
  434. data/spec/ffi/variadic_spec.rb +92 -0
  435. data/spec/spec.opts +4 -0
  436. metadata +562 -0
@@ -0,0 +1,327 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
3
+ Copyright (c) 2008 Red Hat, Inc.
4
+
5
+ PowerPC Assembly glue.
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
+ #define LIBFFI_ASM
28
+ #include <fficonfig.h>
29
+ #include <ffi.h>
30
+ #include <powerpc/asm.h>
31
+
32
+ .file "ppc_closure.S"
33
+
34
+ #ifndef __powerpc64__
35
+
36
+ ENTRY(ffi_closure_SYSV)
37
+ .LFB1:
38
+ stwu %r1,-144(%r1)
39
+ .LCFI0:
40
+ mflr %r0
41
+ .LCFI1:
42
+ stw %r0,148(%r1)
43
+
44
+ # we want to build up an areas for the parameters passed
45
+ # in registers (both floating point and integer)
46
+
47
+ # so first save gpr 3 to gpr 10 (aligned to 4)
48
+ stw %r3, 16(%r1)
49
+ stw %r4, 20(%r1)
50
+ stw %r5, 24(%r1)
51
+ stw %r6, 28(%r1)
52
+ stw %r7, 32(%r1)
53
+ stw %r8, 36(%r1)
54
+ stw %r9, 40(%r1)
55
+ stw %r10,44(%r1)
56
+
57
+ #ifndef __NO_FPRS__
58
+ # next save fpr 1 to fpr 8 (aligned to 8)
59
+ stfd %f1, 48(%r1)
60
+ stfd %f2, 56(%r1)
61
+ stfd %f3, 64(%r1)
62
+ stfd %f4, 72(%r1)
63
+ stfd %f5, 80(%r1)
64
+ stfd %f6, 88(%r1)
65
+ stfd %f7, 96(%r1)
66
+ stfd %f8, 104(%r1)
67
+ #endif
68
+
69
+ # set up registers for the routine that actually does the work
70
+ # get the context pointer from the trampoline
71
+ mr %r3,%r11
72
+
73
+ # now load up the pointer to the result storage
74
+ addi %r4,%r1,112
75
+
76
+ # now load up the pointer to the saved gpr registers
77
+ addi %r5,%r1,16
78
+
79
+ # now load up the pointer to the saved fpr registers */
80
+ addi %r6,%r1,48
81
+
82
+ # now load up the pointer to the outgoing parameter
83
+ # stack in the previous frame
84
+ # i.e. the previous frame pointer + 8
85
+ addi %r7,%r1,152
86
+
87
+ # make the call
88
+ bl ffi_closure_helper_SYSV@local
89
+ .Lret:
90
+ # now r3 contains the return type
91
+ # so use it to look up in a table
92
+ # so we know how to deal with each type
93
+
94
+ # look up the proper starting point in table
95
+ # by using return type as offset
96
+
97
+ mflr %r4 # move address of .Lret to r4
98
+ slwi %r3,%r3,4 # now multiply return type by 16
99
+ addi %r4, %r4, .Lret_type0 - .Lret
100
+ lwz %r0,148(%r1)
101
+ add %r3,%r3,%r4 # add contents of table to table address
102
+ mtctr %r3
103
+ bctr # jump to it
104
+ .LFE1:
105
+
106
+ # Each of the ret_typeX code fragments has to be exactly 16 bytes long
107
+ # (4 instructions). For cache effectiveness we align to a 16 byte boundary
108
+ # first.
109
+ .align 4
110
+ # case FFI_TYPE_VOID
111
+ .Lret_type0:
112
+ mtlr %r0
113
+ addi %r1,%r1,144
114
+ blr
115
+ nop
116
+
117
+ # case FFI_TYPE_INT
118
+ lwz %r3,112+0(%r1)
119
+ mtlr %r0
120
+ .Lfinish:
121
+ addi %r1,%r1,144
122
+ blr
123
+
124
+ # case FFI_TYPE_FLOAT
125
+ lfs %f1,112+0(%r1)
126
+ mtlr %r0
127
+ addi %r1,%r1,144
128
+ blr
129
+
130
+ # case FFI_TYPE_DOUBLE
131
+ lfd %f1,112+0(%r1)
132
+ mtlr %r0
133
+ addi %r1,%r1,144
134
+ blr
135
+
136
+ # case FFI_TYPE_LONGDOUBLE
137
+ lfd %f1,112+0(%r1)
138
+ lfd %f2,112+8(%r1)
139
+ mtlr %r0
140
+ b .Lfinish
141
+
142
+ # case FFI_TYPE_UINT8
143
+ lbz %r3,112+3(%r1)
144
+ mtlr %r0
145
+ addi %r1,%r1,144
146
+ blr
147
+
148
+ # case FFI_TYPE_SINT8
149
+ lbz %r3,112+3(%r1)
150
+ extsb %r3,%r3
151
+ mtlr %r0
152
+ b .Lfinish
153
+
154
+ # case FFI_TYPE_UINT16
155
+ lhz %r3,112+2(%r1)
156
+ mtlr %r0
157
+ addi %r1,%r1,144
158
+ blr
159
+
160
+ # case FFI_TYPE_SINT16
161
+ lha %r3,112+2(%r1)
162
+ mtlr %r0
163
+ addi %r1,%r1,144
164
+ blr
165
+
166
+ # case FFI_TYPE_UINT32
167
+ lwz %r3,112+0(%r1)
168
+ mtlr %r0
169
+ addi %r1,%r1,144
170
+ blr
171
+
172
+ # case FFI_TYPE_SINT32
173
+ lwz %r3,112+0(%r1)
174
+ mtlr %r0
175
+ addi %r1,%r1,144
176
+ blr
177
+
178
+ # case FFI_TYPE_UINT64
179
+ lwz %r3,112+0(%r1)
180
+ lwz %r4,112+4(%r1)
181
+ mtlr %r0
182
+ b .Lfinish
183
+
184
+ # case FFI_TYPE_SINT64
185
+ lwz %r3,112+0(%r1)
186
+ lwz %r4,112+4(%r1)
187
+ mtlr %r0
188
+ b .Lfinish
189
+
190
+ # case FFI_TYPE_STRUCT
191
+ mtlr %r0
192
+ addi %r1,%r1,144
193
+ blr
194
+ nop
195
+
196
+ # case FFI_TYPE_POINTER
197
+ lwz %r3,112+0(%r1)
198
+ mtlr %r0
199
+ addi %r1,%r1,144
200
+ blr
201
+
202
+ # case FFI_TYPE_UINT128
203
+ lwz %r3,112+0(%r1)
204
+ lwz %r4,112+4(%r1)
205
+ lwz %r5,112+8(%r1)
206
+ bl .Luint128
207
+
208
+ # The return types below are only used when the ABI type is FFI_SYSV.
209
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct.
210
+ lbz %r3,112+0(%r1)
211
+ mtlr %r0
212
+ addi %r1,%r1,144
213
+ blr
214
+
215
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct.
216
+ lhz %r3,112+0(%r1)
217
+ mtlr %r0
218
+ addi %r1,%r1,144
219
+ blr
220
+
221
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
222
+ lwz %r3,112+0(%r1)
223
+ srwi %r3,%r3,8
224
+ mtlr %r0
225
+ b .Lfinish
226
+
227
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
228
+ lwz %r3,112+0(%r1)
229
+ mtlr %r0
230
+ addi %r1,%r1,144
231
+ blr
232
+
233
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
234
+ lwz %r3,112+0(%r1)
235
+ lwz %r4,112+4(%r1)
236
+ li %r5,24
237
+ b .Lstruct567
238
+
239
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
240
+ lwz %r3,112+0(%r1)
241
+ lwz %r4,112+4(%r1)
242
+ li %r5,16
243
+ b .Lstruct567
244
+
245
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
246
+ lwz %r3,112+0(%r1)
247
+ lwz %r4,112+4(%r1)
248
+ li %r5,8
249
+ b .Lstruct567
250
+
251
+ # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
252
+ lwz %r3,112+0(%r1)
253
+ lwz %r4,112+4(%r1)
254
+ mtlr %r0
255
+ b .Lfinish
256
+
257
+ .Lstruct567:
258
+ subfic %r6,%r5,32
259
+ srw %r4,%r4,%r5
260
+ slw %r6,%r3,%r6
261
+ srw %r3,%r3,%r5
262
+ or %r4,%r6,%r4
263
+ mtlr %r0
264
+ addi %r1,%r1,144
265
+ blr
266
+
267
+ .Luint128:
268
+ lwz %r6,112+12(%r1)
269
+ mtlr %r0
270
+ addi %r1,%r1,144
271
+ blr
272
+
273
+ END(ffi_closure_SYSV)
274
+
275
+ .section ".eh_frame",EH_FRAME_FLAGS,@progbits
276
+ .Lframe1:
277
+ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
278
+ .LSCIE1:
279
+ .4byte 0x0 # CIE Identifier Tag
280
+ .byte 0x1 # CIE Version
281
+ #if defined _RELOCATABLE || defined __PIC__
282
+ .ascii "zR\0" # CIE Augmentation
283
+ #else
284
+ .ascii "\0" # CIE Augmentation
285
+ #endif
286
+ .uleb128 0x1 # CIE Code Alignment Factor
287
+ .sleb128 -4 # CIE Data Alignment Factor
288
+ .byte 0x41 # CIE RA Column
289
+ #if defined _RELOCATABLE || defined __PIC__
290
+ .uleb128 0x1 # Augmentation size
291
+ .byte 0x1b # FDE Encoding (pcrel sdata4)
292
+ #endif
293
+ .byte 0xc # DW_CFA_def_cfa
294
+ .uleb128 0x1
295
+ .uleb128 0x0
296
+ .align 2
297
+ .LECIE1:
298
+ .LSFDE1:
299
+ .4byte .LEFDE1-.LASFDE1 # FDE Length
300
+ .LASFDE1:
301
+ .4byte .LASFDE1-.Lframe1 # FDE CIE offset
302
+ #if defined _RELOCATABLE || defined __PIC__
303
+ .4byte .LFB1-. # FDE initial location
304
+ #else
305
+ .4byte .LFB1 # FDE initial location
306
+ #endif
307
+ .4byte .LFE1-.LFB1 # FDE address range
308
+ #if defined _RELOCATABLE || defined __PIC__
309
+ .uleb128 0x0 # Augmentation size
310
+ #endif
311
+ .byte 0x4 # DW_CFA_advance_loc4
312
+ .4byte .LCFI0-.LFB1
313
+ .byte 0xe # DW_CFA_def_cfa_offset
314
+ .uleb128 144
315
+ .byte 0x4 # DW_CFA_advance_loc4
316
+ .4byte .LCFI1-.LCFI0
317
+ .byte 0x11 # DW_CFA_offset_extended_sf
318
+ .uleb128 0x41
319
+ .sleb128 -1
320
+ .align 2
321
+ .LEFDE1:
322
+
323
+ #endif
324
+
325
+ #if defined __ELF__ && defined __linux__
326
+ .section .note.GNU-stack,"",@progbits
327
+ #endif
@@ -0,0 +1,219 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.S - Copyright (c) 1998 Geoffrey Keating
3
+ Copyright (C) 2007 Free Software Foundation, Inc
4
+
5
+ PowerPC Assembly glue.
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
+ #define LIBFFI_ASM
29
+ #include <fficonfig.h>
30
+ #include <ffi.h>
31
+ #include <powerpc/asm.h>
32
+
33
+ #ifndef __powerpc64__
34
+ .globl ffi_prep_args_SYSV
35
+ ENTRY(ffi_call_SYSV)
36
+ .LFB1:
37
+ /* Save the old stack pointer as AP. */
38
+ mr %r8,%r1
39
+
40
+ .LCFI0:
41
+ /* Allocate the stack space we need. */
42
+ stwux %r1,%r1,%r4
43
+ /* Save registers we use. */
44
+ mflr %r9
45
+ stw %r28,-16(%r8)
46
+ .LCFI1:
47
+ stw %r29,-12(%r8)
48
+ .LCFI2:
49
+ stw %r30, -8(%r8)
50
+ .LCFI3:
51
+ stw %r31, -4(%r8)
52
+ .LCFI4:
53
+ stw %r9, 4(%r8)
54
+ .LCFI5:
55
+
56
+ /* Save arguments over call... */
57
+ mr %r31,%r5 /* flags, */
58
+ mr %r30,%r6 /* rvalue, */
59
+ mr %r29,%r7 /* function address, */
60
+ mr %r28,%r8 /* our AP. */
61
+ .LCFI6:
62
+
63
+ /* Call ffi_prep_args_SYSV. */
64
+ mr %r4,%r1
65
+ bl ffi_prep_args_SYSV@local
66
+
67
+ /* Now do the call. */
68
+ /* Set up cr1 with bits 4-7 of the flags. */
69
+ mtcrf 0x40,%r31
70
+ /* Get the address to call into CTR. */
71
+ mtctr %r29
72
+ /* Load all those argument registers. */
73
+ lwz %r3,-16-(8*4)(%r28)
74
+ lwz %r4,-16-(7*4)(%r28)
75
+ lwz %r5,-16-(6*4)(%r28)
76
+ lwz %r6,-16-(5*4)(%r28)
77
+ bf- 5,1f
78
+ nop
79
+ lwz %r7,-16-(4*4)(%r28)
80
+ lwz %r8,-16-(3*4)(%r28)
81
+ lwz %r9,-16-(2*4)(%r28)
82
+ lwz %r10,-16-(1*4)(%r28)
83
+ nop
84
+ 1:
85
+
86
+ /* Load all the FP registers. */
87
+ bf- 6,2f
88
+ lfd %f1,-16-(8*4)-(8*8)(%r28)
89
+ lfd %f2,-16-(8*4)-(7*8)(%r28)
90
+ lfd %f3,-16-(8*4)-(6*8)(%r28)
91
+ lfd %f4,-16-(8*4)-(5*8)(%r28)
92
+ nop
93
+ lfd %f5,-16-(8*4)-(4*8)(%r28)
94
+ lfd %f6,-16-(8*4)-(3*8)(%r28)
95
+ lfd %f7,-16-(8*4)-(2*8)(%r28)
96
+ lfd %f8,-16-(8*4)-(1*8)(%r28)
97
+ 2:
98
+
99
+ /* Make the call. */
100
+ bctrl
101
+
102
+ /* Now, deal with the return value. */
103
+ mtcrf 0x01,%r31 /* cr7 */
104
+ bt- 31,L(small_struct_return_value)
105
+ bt- 30,L(done_return_value)
106
+ bt- 29,L(fp_return_value)
107
+ stw %r3,0(%r30)
108
+ bf+ 28,L(done_return_value)
109
+ stw %r4,4(%r30)
110
+ mtcrf 0x02,%r31 /* cr6 */
111
+ bf 27,L(done_return_value)
112
+ stw %r5,8(%r30)
113
+ stw %r6,12(%r30)
114
+ /* Fall through... */
115
+
116
+ L(done_return_value):
117
+ /* Restore the registers we used and return. */
118
+ lwz %r9, 4(%r28)
119
+ lwz %r31, -4(%r28)
120
+ mtlr %r9
121
+ lwz %r30, -8(%r28)
122
+ lwz %r29,-12(%r28)
123
+ lwz %r28,-16(%r28)
124
+ lwz %r1,0(%r1)
125
+ blr
126
+
127
+ L(fp_return_value):
128
+ bf 28,L(float_return_value)
129
+ stfd %f1,0(%r30)
130
+ mtcrf 0x02,%r31 /* cr6 */
131
+ bf 27,L(done_return_value)
132
+ stfd %f2,8(%r30)
133
+ b L(done_return_value)
134
+ L(float_return_value):
135
+ stfs %f1,0(%r30)
136
+ b L(done_return_value)
137
+
138
+ L(small_struct_return_value):
139
+ extrwi %r6,%r31,2,19 /* number of bytes padding = shift/8 */
140
+ mtcrf 0x02,%r31 /* copy flags to cr[24:27] (cr6) */
141
+ extrwi %r5,%r31,5,19 /* r5 <- number of bits of padding */
142
+ subfic %r6,%r6,4 /* r6 <- number of useful bytes in r3 */
143
+ bf- 25,L(done_return_value) /* struct in r3 ? if not, done. */
144
+ /* smst_one_register: */
145
+ slw %r3,%r3,%r5 /* Left-justify value in r3 */
146
+ mtxer %r6 /* move byte count to XER ... */
147
+ stswx %r3,0,%r30 /* ... and store that many bytes */
148
+ bf+ 26,L(done_return_value) /* struct in r3:r4 ? */
149
+ add %r6,%r6,%r30 /* adjust pointer */
150
+ stswi %r4,%r6,4 /* store last four bytes */
151
+ b L(done_return_value)
152
+
153
+ .LFE1:
154
+ END(ffi_call_SYSV)
155
+
156
+ .section ".eh_frame",EH_FRAME_FLAGS,@progbits
157
+ .Lframe1:
158
+ .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */
159
+ .LSCIE1:
160
+ .4byte 0x0 /* CIE Identifier Tag */
161
+ .byte 0x1 /* CIE Version */
162
+ #if defined _RELOCATABLE || defined __PIC__
163
+ .ascii "zR\0" /* CIE Augmentation */
164
+ #else
165
+ .ascii "\0" /* CIE Augmentation */
166
+ #endif
167
+ .uleb128 0x1 /* CIE Code Alignment Factor */
168
+ .sleb128 -4 /* CIE Data Alignment Factor */
169
+ .byte 0x41 /* CIE RA Column */
170
+ #if defined _RELOCATABLE || defined __PIC__
171
+ .uleb128 0x1 /* Augmentation size */
172
+ .byte 0x1b /* FDE Encoding (pcrel sdata4) */
173
+ #endif
174
+ .byte 0xc /* DW_CFA_def_cfa */
175
+ .uleb128 0x1
176
+ .uleb128 0x0
177
+ .align 2
178
+ .LECIE1:
179
+ .LSFDE1:
180
+ .4byte .LEFDE1-.LASFDE1 /* FDE Length */
181
+ .LASFDE1:
182
+ .4byte .LASFDE1-.Lframe1 /* FDE CIE offset */
183
+ #if defined _RELOCATABLE || defined __PIC__
184
+ .4byte .LFB1-. /* FDE initial location */
185
+ #else
186
+ .4byte .LFB1 /* FDE initial location */
187
+ #endif
188
+ .4byte .LFE1-.LFB1 /* FDE address range */
189
+ #if defined _RELOCATABLE || defined __PIC__
190
+ .uleb128 0x0 /* Augmentation size */
191
+ #endif
192
+ .byte 0x4 /* DW_CFA_advance_loc4 */
193
+ .4byte .LCFI0-.LFB1
194
+ .byte 0xd /* DW_CFA_def_cfa_register */
195
+ .uleb128 0x08
196
+ .byte 0x4 /* DW_CFA_advance_loc4 */
197
+ .4byte .LCFI5-.LCFI0
198
+ .byte 0x11 /* DW_CFA_offset_extended_sf */
199
+ .uleb128 0x41
200
+ .sleb128 -1
201
+ .byte 0x9f /* DW_CFA_offset, column 0x1f */
202
+ .uleb128 0x1
203
+ .byte 0x9e /* DW_CFA_offset, column 0x1e */
204
+ .uleb128 0x2
205
+ .byte 0x9d /* DW_CFA_offset, column 0x1d */
206
+ .uleb128 0x3
207
+ .byte 0x9c /* DW_CFA_offset, column 0x1c */
208
+ .uleb128 0x4
209
+ .byte 0x4 /* DW_CFA_advance_loc4 */
210
+ .4byte .LCFI6-.LCFI5
211
+ .byte 0xd /* DW_CFA_def_cfa_register */
212
+ .uleb128 0x1c
213
+ .align 2
214
+ .LEFDE1:
215
+ #endif
216
+
217
+ #if defined __ELF__ && defined __linux__
218
+ .section .note.GNU-stack,"",@progbits
219
+ #endif