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,65 @@
1
+ /* -----------------------------------------------------------------*-C-*-
2
+ ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
3
+ Copyright (c) 2010 CodeSourcery
4
+
5
+ Target configuration macros for ARM.
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
+
29
+ #ifndef LIBFFI_TARGET_H
30
+ #define LIBFFI_TARGET_H
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
+ FFI_SYSV,
39
+ FFI_VFP,
40
+ FFI_LAST_ABI,
41
+ #ifdef __ARM_PCS_VFP
42
+ FFI_DEFAULT_ABI = FFI_VFP,
43
+ #else
44
+ FFI_DEFAULT_ABI = FFI_SYSV,
45
+ #endif
46
+ } ffi_abi;
47
+ #endif
48
+
49
+ #define FFI_EXTRA_CIF_FIELDS \
50
+ int vfp_used; \
51
+ short vfp_reg_free, vfp_nargs; \
52
+ signed char vfp_args[16] \
53
+
54
+ /* Internally used. */
55
+ #define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1)
56
+ #define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2)
57
+
58
+ /* ---- Definitions for closures ----------------------------------------- */
59
+
60
+ #define FFI_CLOSURES 1
61
+ #define FFI_TRAMPOLINE_SIZE 20
62
+ #define FFI_NATIVE_RAW_API 0
63
+
64
+ #endif
65
+
@@ -0,0 +1,118 @@
1
+ #!/bin/sh
2
+
3
+ # -----------------------------------------------------------------------
4
+ # gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc.
5
+ #
6
+ # ARM Trampoline Page Generator
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,
20
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
+ # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26
+ # DEALINGS IN THE SOFTWARE.
27
+ # -----------------------------------------------------------------------
28
+
29
+ PROGNAME=$0
30
+
31
+ # Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change,
32
+ # the entire arm trampoline implementation must be updated to match, too.
33
+
34
+ # Size of an individual trampoline, in bytes
35
+ TRAMPOLINE_SIZE=12
36
+
37
+ # Page size, in bytes
38
+ PAGE_SIZE=4096
39
+
40
+ # Compute the size of the reachable config page; The first 16 bytes of the config page
41
+ # are unreachable due to our maximum pc-relative ldr offset.
42
+ PAGE_AVAIL=`expr $PAGE_SIZE - 16`
43
+
44
+ # Compute the number of of available trampolines.
45
+ TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE`
46
+
47
+ header () {
48
+ echo "# GENERATED CODE - DO NOT EDIT"
49
+ echo "# This file was generated by $PROGNAME"
50
+ echo ""
51
+
52
+ # Write out the license header
53
+ cat << EOF
54
+ # Copyright (c) 2010, Plausible Labs Cooperative, Inc.
55
+ #
56
+ # Permission is hereby granted, free of charge, to any person obtaining
57
+ # a copy of this software and associated documentation files (the
58
+ # ``Software''), to deal in the Software without restriction, including
59
+ # without limitation the rights to use, copy, modify, merge, publish,
60
+ # distribute, sublicense, and/or sell copies of the Software, and to
61
+ # permit persons to whom the Software is furnished to do so, subject to
62
+ # the following conditions:
63
+ #
64
+ # The above copyright notice and this permission notice shall be included
65
+ # in all copies or substantial portions of the Software.
66
+ #
67
+ # THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
68
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
69
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
70
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
71
+ # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
72
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
73
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
74
+ # DEALINGS IN THE SOFTWARE.
75
+ # -----------------------------------------------------------------------
76
+
77
+ EOF
78
+
79
+ # Write out the trampoline table, aligned to the page boundary
80
+ echo ".text"
81
+ echo ".align 12"
82
+ echo ".globl _ffi_closure_trampoline_table_page"
83
+ echo "_ffi_closure_trampoline_table_page:"
84
+ }
85
+
86
+
87
+ # WARNING - Don't modify the trampoline code size without also updating the relevent libffi code
88
+ trampoline () {
89
+ cat << END
90
+
91
+ // trampoline
92
+ // Save to stack
93
+ stmfd sp!, {r0-r3}
94
+
95
+ // Load the context argument from the config page.
96
+ // This places the first usable config value at _ffi_closure_trampoline_table-4080
97
+ // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
98
+ ldr r0, [pc, #-4092]
99
+
100
+ // Load the jump address from the config page.
101
+ ldr pc, [pc, #-4092]
102
+
103
+ END
104
+ }
105
+
106
+ main () {
107
+ # Write out the header
108
+ header
109
+
110
+ # Write out the trampolines
111
+ local i=0
112
+ while [ $i -lt ${TRAMPOLINE_COUNT} ]; do
113
+ trampoline
114
+ local i=`expr $i + 1`
115
+ done
116
+ }
117
+
118
+ main
@@ -0,0 +1,497 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
3
+ Copyright (c) 2011 Plausible Labs Cooperative, Inc.
4
+
5
+ ARM 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
+ #define LIBFFI_ASM
29
+ #include <fficonfig.h>
30
+ #include <ffi.h>
31
+ #ifdef HAVE_MACHINE_ASM_H
32
+ #include <machine/asm.h>
33
+ #else
34
+ #ifdef __USER_LABEL_PREFIX__
35
+ #define CONCAT1(a, b) CONCAT2(a, b)
36
+ #define CONCAT2(a, b) a ## b
37
+
38
+ /* Use the right prefix for global labels. */
39
+ #define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
40
+ #else
41
+ #define CNAME(x) x
42
+ #endif
43
+ #ifdef __APPLE__
44
+ #define ENTRY(x) .globl CNAME(x); CNAME(x):
45
+ #else
46
+ #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
47
+ #endif /* __APPLE__ */
48
+ #endif
49
+
50
+ #ifdef __ELF__
51
+ #define LSYM(x) .x
52
+ #else
53
+ #define LSYM(x) x
54
+ #endif
55
+
56
+ /* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI
57
+ Function Call Guide */
58
+ #ifdef __APPLE__
59
+ #define __SOFTFP__
60
+ #endif
61
+
62
+ /* We need a better way of testing for this, but for now, this is all
63
+ we can do. */
64
+ @ This selects the minimum architecture level required.
65
+ #define __ARM_ARCH__ 3
66
+
67
+ #if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
68
+ # undef __ARM_ARCH__
69
+ # define __ARM_ARCH__ 4
70
+ #endif
71
+
72
+ #if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
73
+ || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
74
+ || defined(__ARM_ARCH_5TEJ__)
75
+ # undef __ARM_ARCH__
76
+ # define __ARM_ARCH__ 5
77
+ #endif
78
+
79
+ #if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
80
+ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
81
+ || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
82
+ || defined(__ARM_ARCH_6M__)
83
+ # undef __ARM_ARCH__
84
+ # define __ARM_ARCH__ 6
85
+ #endif
86
+
87
+ #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
88
+ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
89
+ || defined(__ARM_ARCH_7EM__)
90
+ # undef __ARM_ARCH__
91
+ # define __ARM_ARCH__ 7
92
+ #endif
93
+
94
+ #if __ARM_ARCH__ >= 5
95
+ # define call_reg(x) blx x
96
+ #elif defined (__ARM_ARCH_4T__)
97
+ # define call_reg(x) mov lr, pc ; bx x
98
+ # if defined(__thumb__) || defined(__THUMB_INTERWORK__)
99
+ # define __INTERWORKING__
100
+ # endif
101
+ #else
102
+ # define call_reg(x) mov lr, pc ; mov pc, x
103
+ #endif
104
+
105
+ /* Conditionally compile unwinder directives. */
106
+ #ifdef __ARM_EABI__
107
+ #define UNWIND
108
+ #else
109
+ #define UNWIND @
110
+ #endif
111
+
112
+
113
+ #if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
114
+ .macro ARM_FUNC_START name
115
+ .text
116
+ .align 0
117
+ .thumb
118
+ .thumb_func
119
+ #ifdef __APPLE__
120
+ ENTRY($0)
121
+ #else
122
+ ENTRY(\name)
123
+ #endif
124
+ bx pc
125
+ nop
126
+ .arm
127
+ UNWIND .fnstart
128
+ /* A hook to tell gdb that we've switched to ARM mode. Also used to call
129
+ directly from other local arm routines. */
130
+ #ifdef __APPLE__
131
+ _L__$0:
132
+ #else
133
+ _L__\name:
134
+ #endif
135
+ .endm
136
+ #else
137
+ .macro ARM_FUNC_START name
138
+ .text
139
+ .align 0
140
+ .arm
141
+ #ifdef __APPLE__
142
+ ENTRY($0)
143
+ #else
144
+ ENTRY(\name)
145
+ #endif
146
+ UNWIND .fnstart
147
+ .endm
148
+ #endif
149
+
150
+ .macro RETLDM regs=, cond=, dirn=ia
151
+ #if defined (__INTERWORKING__)
152
+ .ifc "\regs",""
153
+ ldr\cond lr, [sp], #4
154
+ .else
155
+ ldm\cond\dirn sp!, {\regs, lr}
156
+ .endif
157
+ bx\cond lr
158
+ #else
159
+ .ifc "\regs",""
160
+ ldr\cond pc, [sp], #4
161
+ .else
162
+ ldm\cond\dirn sp!, {\regs, pc}
163
+ .endif
164
+ #endif
165
+ .endm
166
+
167
+ @ r0: ffi_prep_args
168
+ @ r1: &ecif
169
+ @ r2: cif->bytes
170
+ @ r3: fig->flags
171
+ @ sp+0: ecif.rvalue
172
+
173
+ @ This assumes we are using gas.
174
+ ARM_FUNC_START ffi_call_SYSV
175
+ @ Save registers
176
+ stmfd sp!, {r0-r3, fp, lr}
177
+ UNWIND .save {r0-r3, fp, lr}
178
+ mov fp, sp
179
+
180
+ UNWIND .setfp fp, sp
181
+
182
+ @ Make room for all of the new args.
183
+ sub sp, fp, r2
184
+
185
+ @ Place all of the ffi_prep_args in position
186
+ mov r0, sp
187
+ @ r1 already set
188
+
189
+ @ Call ffi_prep_args(stack, &ecif)
190
+ bl ffi_prep_args
191
+
192
+ @ move first 4 parameters in registers
193
+ ldmia sp, {r0-r3}
194
+
195
+ @ and adjust stack
196
+ sub lr, fp, sp @ cif->bytes == fp - sp
197
+ ldr ip, [fp] @ load fn() in advance
198
+ cmp lr, #16
199
+ movhs lr, #16
200
+ add sp, sp, lr
201
+
202
+ @ call (fn) (...)
203
+ call_reg(ip)
204
+
205
+ @ Remove the space we pushed for the args
206
+ mov sp, fp
207
+
208
+ @ Load r2 with the pointer to storage for the return value
209
+ ldr r2, [sp, #24]
210
+
211
+ @ Load r3 with the return type code
212
+ ldr r3, [sp, #12]
213
+
214
+ @ If the return value pointer is NULL, assume no return value.
215
+ cmp r2, #0
216
+ beq LSYM(Lepilogue)
217
+
218
+ @ return INT
219
+ cmp r3, #FFI_TYPE_INT
220
+ #if defined(__SOFTFP__) || defined(__ARM_EABI__)
221
+ cmpne r3, #FFI_TYPE_FLOAT
222
+ #endif
223
+ streq r0, [r2]
224
+ beq LSYM(Lepilogue)
225
+
226
+ @ return INT64
227
+ cmp r3, #FFI_TYPE_SINT64
228
+ #if defined(__SOFTFP__) || defined(__ARM_EABI__)
229
+ cmpne r3, #FFI_TYPE_DOUBLE
230
+ #endif
231
+ stmeqia r2, {r0, r1}
232
+
233
+ #if !defined(__SOFTFP__) && !defined(__ARM_EABI__)
234
+ beq LSYM(Lepilogue)
235
+
236
+ @ return FLOAT
237
+ cmp r3, #FFI_TYPE_FLOAT
238
+ stfeqs f0, [r2]
239
+ beq LSYM(Lepilogue)
240
+
241
+ @ return DOUBLE or LONGDOUBLE
242
+ cmp r3, #FFI_TYPE_DOUBLE
243
+ stfeqd f0, [r2]
244
+ #endif
245
+
246
+ LSYM(Lepilogue):
247
+ #if defined (__INTERWORKING__)
248
+ ldmia sp!, {r0-r3,fp, lr}
249
+ bx lr
250
+ #else
251
+ ldmia sp!, {r0-r3,fp, pc}
252
+ #endif
253
+
254
+ .ffi_call_SYSV_end:
255
+ UNWIND .fnend
256
+ #ifdef __ELF__
257
+ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
258
+ #endif
259
+
260
+
261
+ /*
262
+ unsigned int FFI_HIDDEN
263
+ ffi_closure_SYSV_inner (closure, respp, args)
264
+ ffi_closure *closure;
265
+ void **respp;
266
+ void *args;
267
+ */
268
+
269
+ ARM_FUNC_START ffi_closure_SYSV
270
+ UNWIND .pad #16
271
+ add ip, sp, #16
272
+ stmfd sp!, {ip, lr}
273
+ UNWIND .save {r0, lr}
274
+ add r2, sp, #8
275
+ UNWIND .pad #16
276
+ sub sp, sp, #16
277
+ str sp, [sp, #8]
278
+ add r1, sp, #8
279
+ bl CNAME(ffi_closure_SYSV_inner)
280
+ cmp r0, #FFI_TYPE_INT
281
+ beq .Lretint
282
+
283
+ cmp r0, #FFI_TYPE_FLOAT
284
+ #if defined(__SOFTFP__) || defined(__ARM_EABI__)
285
+ beq .Lretint
286
+ #else
287
+ beq .Lretfloat
288
+ #endif
289
+
290
+ cmp r0, #FFI_TYPE_DOUBLE
291
+ #if defined(__SOFTFP__) || defined(__ARM_EABI__)
292
+ beq .Lretlonglong
293
+ #else
294
+ beq .Lretdouble
295
+ #endif
296
+
297
+ cmp r0, #FFI_TYPE_LONGDOUBLE
298
+ #if defined(__SOFTFP__) || defined(__ARM_EABI__)
299
+ beq .Lretlonglong
300
+ #else
301
+ beq .Lretlongdouble
302
+ #endif
303
+
304
+ cmp r0, #FFI_TYPE_SINT64
305
+ beq .Lretlonglong
306
+ .Lclosure_epilogue:
307
+ add sp, sp, #16
308
+ ldmfd sp, {sp, pc}
309
+ .Lretint:
310
+ ldr r0, [sp]
311
+ b .Lclosure_epilogue
312
+ .Lretlonglong:
313
+ ldr r0, [sp]
314
+ ldr r1, [sp, #4]
315
+ b .Lclosure_epilogue
316
+
317
+ #if !defined(__SOFTFP__) && !defined(__ARM_EABI__)
318
+ .Lretfloat:
319
+ ldfs f0, [sp]
320
+ b .Lclosure_epilogue
321
+ .Lretdouble:
322
+ ldfd f0, [sp]
323
+ b .Lclosure_epilogue
324
+ .Lretlongdouble:
325
+ ldfd f0, [sp]
326
+ b .Lclosure_epilogue
327
+ #endif
328
+
329
+ .ffi_closure_SYSV_end:
330
+ UNWIND .fnend
331
+ #ifdef __ELF__
332
+ .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
333
+ #endif
334
+
335
+
336
+ /* Below are VFP hard-float ABI call and closure implementations.
337
+ Add VFP FPU directive here. */
338
+ .fpu vfp
339
+
340
+ @ r0: fn
341
+ @ r1: &ecif
342
+ @ r2: cif->bytes
343
+ @ r3: fig->flags
344
+ @ sp+0: ecif.rvalue
345
+
346
+ ARM_FUNC_START ffi_call_VFP
347
+ @ Save registers
348
+ stmfd sp!, {r0-r3, fp, lr}
349
+ UNWIND .save {r0-r3, fp, lr}
350
+ mov fp, sp
351
+ UNWIND .setfp fp, sp
352
+
353
+ @ Make room for all of the new args.
354
+ sub sp, sp, r2
355
+
356
+ @ Make room for loading VFP args
357
+ sub sp, sp, #64
358
+
359
+ @ Place all of the ffi_prep_args in position
360
+ mov r0, sp
361
+ @ r1 already set
362
+ sub r2, fp, #64 @ VFP scratch space
363
+
364
+ @ Call ffi_prep_args(stack, &ecif, vfp_space)
365
+ bl ffi_prep_args
366
+
367
+ @ Load VFP register args if needed
368
+ cmp r0, #0
369
+ beq LSYM(Lbase_args)
370
+
371
+ @ Load only d0 if possible
372
+ cmp r0, #3
373
+ sub ip, fp, #64
374
+ flddle d0, [ip]
375
+ fldmiadgt ip, {d0-d7}
376
+
377
+ LSYM(Lbase_args):
378
+ @ move first 4 parameters in registers
379
+ ldmia sp, {r0-r3}
380
+
381
+ @ and adjust stack
382
+ sub lr, ip, sp @ cif->bytes == (fp - 64) - sp
383
+ ldr ip, [fp] @ load fn() in advance
384
+ cmp lr, #16
385
+ movhs lr, #16
386
+ add sp, sp, lr
387
+
388
+ @ call (fn) (...)
389
+ call_reg(ip)
390
+
391
+ @ Remove the space we pushed for the args
392
+ mov sp, fp
393
+
394
+ @ Load r2 with the pointer to storage for
395
+ @ the return value
396
+ ldr r2, [sp, #24]
397
+
398
+ @ Load r3 with the return type code
399
+ ldr r3, [sp, #12]
400
+
401
+ @ If the return value pointer is NULL,
402
+ @ assume no return value.
403
+ cmp r2, #0
404
+ beq LSYM(Lepilogue_vfp)
405
+
406
+ cmp r3, #FFI_TYPE_INT
407
+ streq r0, [r2]
408
+ beq LSYM(Lepilogue_vfp)
409
+
410
+ cmp r3, #FFI_TYPE_SINT64
411
+ stmeqia r2, {r0, r1}
412
+ beq LSYM(Lepilogue_vfp)
413
+
414
+ cmp r3, #FFI_TYPE_FLOAT
415
+ fstseq s0, [r2]
416
+ beq LSYM(Lepilogue_vfp)
417
+
418
+ cmp r3, #FFI_TYPE_DOUBLE
419
+ fstdeq d0, [r2]
420
+ beq LSYM(Lepilogue_vfp)
421
+
422
+ cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT
423
+ cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE
424
+ fstmiadeq r2, {d0-d3}
425
+
426
+ LSYM(Lepilogue_vfp):
427
+ RETLDM "r0-r3,fp"
428
+
429
+ .ffi_call_VFP_end:
430
+ UNWIND .fnend
431
+ .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP)
432
+
433
+
434
+ ARM_FUNC_START ffi_closure_VFP
435
+ fstmfdd sp!, {d0-d7}
436
+ @ r0-r3, then d0-d7
437
+ UNWIND .pad #80
438
+ add ip, sp, #80
439
+ stmfd sp!, {ip, lr}
440
+ UNWIND .save {r0, lr}
441
+ add r2, sp, #72
442
+ add r3, sp, #8
443
+ UNWIND .pad #72
444
+ sub sp, sp, #72
445
+ str sp, [sp, #64]
446
+ add r1, sp, #64
447
+ bl ffi_closure_SYSV_inner
448
+
449
+ cmp r0, #FFI_TYPE_INT
450
+ beq .Lretint_vfp
451
+
452
+ cmp r0, #FFI_TYPE_FLOAT
453
+ beq .Lretfloat_vfp
454
+
455
+ cmp r0, #FFI_TYPE_DOUBLE
456
+ cmpne r0, #FFI_TYPE_LONGDOUBLE
457
+ beq .Lretdouble_vfp
458
+
459
+ cmp r0, #FFI_TYPE_SINT64
460
+ beq .Lretlonglong_vfp
461
+
462
+ cmp r0, #FFI_TYPE_STRUCT_VFP_FLOAT
463
+ beq .Lretfloat_struct_vfp
464
+
465
+ cmp r0, #FFI_TYPE_STRUCT_VFP_DOUBLE
466
+ beq .Lretdouble_struct_vfp
467
+
468
+ .Lclosure_epilogue_vfp:
469
+ add sp, sp, #72
470
+ ldmfd sp, {sp, pc}
471
+
472
+ .Lretfloat_vfp:
473
+ flds s0, [sp]
474
+ b .Lclosure_epilogue_vfp
475
+ .Lretdouble_vfp:
476
+ fldd d0, [sp]
477
+ b .Lclosure_epilogue_vfp
478
+ .Lretint_vfp:
479
+ ldr r0, [sp]
480
+ b .Lclosure_epilogue_vfp
481
+ .Lretlonglong_vfp:
482
+ ldmia sp, {r0, r1}
483
+ b .Lclosure_epilogue_vfp
484
+ .Lretfloat_struct_vfp:
485
+ fldmiad sp, {d0-d1}
486
+ b .Lclosure_epilogue_vfp
487
+ .Lretdouble_struct_vfp:
488
+ fldmiad sp, {d0-d3}
489
+ b .Lclosure_epilogue_vfp
490
+
491
+ .ffi_closure_VFP_end:
492
+ UNWIND .fnend
493
+ .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP)
494
+
495
+ #if defined __ELF__ && defined __linux__
496
+ .section .note.GNU-stack,"",%progbits
497
+ #endif