ffi 1.9.18 → 1.9.21

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 (366) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/Rakefile +14 -3
  4. data/ext/ffi_c/AbstractMemory.c +6 -1
  5. data/ext/ffi_c/Platform.c +10 -2
  6. data/ext/ffi_c/extconf.rb +7 -2
  7. data/ext/ffi_c/libffi.bsd.mk +9 -3
  8. data/ext/ffi_c/libffi.darwin.mk +14 -4
  9. data/ext/ffi_c/libffi.gnu.mk +2 -1
  10. data/ext/ffi_c/libffi.mk +9 -4
  11. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  12. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  13. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  14. data/ext/ffi_c/libffi/LICENSE +1 -1
  15. data/ext/ffi_c/libffi/Makefile.am +166 -157
  16. data/ext/ffi_c/libffi/README +164 -52
  17. data/ext/ffi_c/libffi/acinclude.m4 +381 -0
  18. data/ext/ffi_c/libffi/autogen.sh +2 -0
  19. data/ext/ffi_c/libffi/configure.ac +148 -256
  20. data/ext/ffi_c/libffi/configure.host +265 -4
  21. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  22. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  23. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  24. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +207 -0
  25. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  26. data/ext/ffi_c/libffi/include/ffi.h.in +107 -50
  27. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  28. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  29. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  30. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  31. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +637 -0
  32. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  33. data/ext/ffi_c/libffi/libtool-version +1 -1
  34. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  35. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  36. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  37. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  38. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  39. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  40. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  41. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  42. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  43. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  44. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  45. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  46. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  47. data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
  48. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  49. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  50. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  51. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  52. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  53. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  54. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  55. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  56. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  57. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  58. data/ext/ffi_c/libffi/src/arm/ffi.c +597 -517
  59. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  60. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  61. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  62. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  63. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  64. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  65. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  66. data/ext/ffi_c/libffi/src/closures.c +319 -44
  67. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  68. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  69. data/ext/ffi_c/libffi/src/debug.c +6 -1
  70. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  71. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  72. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  73. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  74. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  75. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  76. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  77. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  78. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  79. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  80. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  81. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  82. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  83. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  84. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  85. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  86. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  87. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  88. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  89. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  90. data/ext/ffi_c/libffi/src/mips/ffi.c +95 -28
  91. data/ext/ffi_c/libffi/src/mips/ffitarget.h +9 -2
  92. data/ext/ffi_c/libffi/src/mips/n32.S +126 -56
  93. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  94. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  95. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  96. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  97. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  98. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  99. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  100. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  101. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  102. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  103. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  104. data/ext/ffi_c/libffi/src/powerpc/aix.S +6 -6
  105. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +3 -1
  106. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  107. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  108. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  109. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  110. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +25 -25
  111. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  112. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  113. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  114. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +100 -44
  115. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  116. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  117. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  118. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  119. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  120. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  121. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  122. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  123. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  124. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  125. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  126. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  127. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  128. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  129. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  130. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  131. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  132. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  133. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  134. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  135. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  136. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  137. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  138. data/ext/ffi_c/libffi/src/types.c +43 -14
  139. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  140. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  141. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  142. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  143. data/ext/ffi_c/libffi/src/x86/ffi.c +589 -500
  144. data/ext/ffi_c/libffi/src/x86/ffi64.c +338 -116
  145. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  146. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  147. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  148. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  149. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  150. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  151. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  152. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  153. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  154. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  155. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  156. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  157. data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -73
  158. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +120 -25
  159. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  262. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  263. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  284. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  315. data/ffi.gemspec +2 -2
  316. data/lib/ffi/enum.rb +124 -0
  317. data/lib/ffi/library.rb +65 -13
  318. data/lib/ffi/platform.rb +7 -2
  319. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  320. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  321. data/lib/ffi/pointer.rb +1 -0
  322. data/lib/ffi/struct.rb +0 -2
  323. data/lib/ffi/version.rb +1 -1
  324. data/spec/ffi/bitmask_spec.rb +575 -0
  325. data/spec/ffi/fixtures/BitmaskTest.c +51 -0
  326. data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
  327. data/spec/ffi/struct_spec.rb +0 -4
  328. metadata +143 -51
  329. data/ext/ffi_c/libffi/Makefile.in +0 -1820
  330. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  331. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  332. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  333. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  334. data/ext/ffi_c/libffi/compile +0 -143
  335. data/ext/ffi_c/libffi/config.guess +0 -1501
  336. data/ext/ffi_c/libffi/config.sub +0 -1705
  337. data/ext/ffi_c/libffi/configure +0 -17191
  338. data/ext/ffi_c/libffi/depcomp +0 -630
  339. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  340. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  341. data/ext/ffi_c/libffi/fficonfig.h.in +0 -199
  342. data/ext/ffi_c/libffi/include/Makefile.in +0 -487
  343. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  344. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  345. data/ext/ffi_c/libffi/install-sh +0 -520
  346. data/ext/ffi_c/libffi/ltmain.sh +0 -9636
  347. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  348. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  349. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  350. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  351. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  352. data/ext/ffi_c/libffi/man/Makefile.in +0 -466
  353. data/ext/ffi_c/libffi/mdate-sh +0 -201
  354. data/ext/ffi_c/libffi/missing +0 -376
  355. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  356. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  357. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  358. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  359. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  360. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  361. data/ext/ffi_c/libffi/testsuite/Makefile.in +0 -500
  362. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  365. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  366. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
@@ -0,0 +1,237 @@
1
+ #define LIBFFI_ASM
2
+ #include <fficonfig.h>
3
+ #include <ffi.h>
4
+ #include <ffi_cfi.h>
5
+ #include "asmnames.h"
6
+
7
+ #if defined(HAVE_AS_CFI_PSEUDO_OP)
8
+ .cfi_sections .debug_frame
9
+ #endif
10
+
11
+ #ifdef X86_WIN64
12
+ #define SEH(...) __VA_ARGS__
13
+ #define arg0 rcx
14
+ #define arg1 rdx
15
+ #define arg2 r8
16
+ #define arg3 r9
17
+ #else
18
+ #define SEH(...)
19
+ #define arg0 rdi
20
+ #define arg1 rsi
21
+ #define arg2 rdx
22
+ #define arg3 rcx
23
+ #endif
24
+
25
+ /* This macro allows the safe creation of jump tables without an
26
+ actual table. The entry points into the table are all 8 bytes.
27
+ The use of ORG asserts that we're at the correct location. */
28
+ /* ??? The clang assembler doesn't handle .org with symbolic expressions. */
29
+ #if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
30
+ # define E(BASE, X) ALIGN 8
31
+ #else
32
+ # define E(BASE, X) ALIGN 8; ORG BASE + X * 8
33
+ #endif
34
+
35
+ .CODE
36
+ extern PLT(C(abort)):near
37
+ extern C(ffi_closure_win64_inner):near
38
+
39
+ /* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10)
40
+
41
+ Bit o trickiness here -- FRAME is the base of the stack frame
42
+ for this function. This has been allocated by ffi_call. We also
43
+ deallocate some of the stack that has been alloca'd. */
44
+
45
+ ALIGN 8
46
+ PUBLIC C(ffi_call_win64)
47
+
48
+ ; SEH(.safesh ffi_call_win64)
49
+ C(ffi_call_win64) proc SEH(frame)
50
+ cfi_startproc
51
+ /* Set up the local stack frame and install it in rbp/rsp. */
52
+ mov RAX, [RSP] ; movq (%rsp), %rax
53
+ mov [arg1], RBP ; movq %rbp, (arg1)
54
+ mov [arg1 + 8], RAX; movq %rax, 8(arg1)
55
+ mov RBP, arg1; movq arg1, %rbp
56
+ cfi_def_cfa(rbp, 16)
57
+ cfi_rel_offset(rbp, 0)
58
+ SEH(.pushreg rbp)
59
+ SEH(.setframe rbp, 0)
60
+ SEH(.endprolog)
61
+ mov RSP, arg0 ; movq arg0, %rsp
62
+
63
+ mov R10, arg2 ; movq arg2, %r10
64
+
65
+ /* Load all slots into both general and xmm registers. */
66
+ mov RCX, [RSP] ; movq (%rsp), %rcx
67
+ movsd XMM0, qword ptr [RSP] ; movsd (%rsp), %xmm0
68
+ mov RDX, [RSP + 8] ;movq 8(%rsp), %rdx
69
+ movsd XMM1, qword ptr [RSP + 8]; movsd 8(%rsp), %xmm1
70
+ mov R8, [RSP + 16] ; movq 16(%rsp), %r8
71
+ movsd XMM2, qword ptr [RSP + 16] ; movsd 16(%rsp), %xmm2
72
+ mov R9, [RSP + 24] ; movq 24(%rsp), %r9
73
+ movsd XMM3, qword ptr [RSP + 24] ;movsd 24(%rsp), %xmm3
74
+
75
+ CALL qword ptr [RBP + 16] ; call *16(%rbp)
76
+
77
+ mov ECX, [RBP + 24] ; movl 24(%rbp), %ecx
78
+ mov R8, [RBP + 32] ; movq 32(%rbp), %r8
79
+ LEA R10, ffi_call_win64_tab ; leaq 0f(%rip), %r10
80
+ CMP ECX, FFI_TYPE_SMALL_STRUCT_4B ; cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx
81
+ LEA R10, [R10 + RCX*8] ; leaq (%r10, %rcx, 8), %r10
82
+ JA L99 ; ja 99f
83
+ JMP R10 ; jmp *%r10
84
+
85
+ /* Below, we're space constrained most of the time. Thus we eschew the
86
+ modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */
87
+ epilogue macro
88
+ LEAVE
89
+ cfi_remember_state
90
+ cfi_def_cfa(rsp, 8)
91
+ cfi_restore(rbp)
92
+ RET
93
+ cfi_restore_state
94
+ endm
95
+
96
+ ALIGN 8
97
+ ffi_call_win64_tab LABEL NEAR
98
+ E(0b, FFI_TYPE_VOID)
99
+ epilogue
100
+ E(0b, FFI_TYPE_INT)
101
+ movsxd rax, eax ; movslq %eax, %rax
102
+ mov qword ptr [r8], rax; movq %rax, (%r8)
103
+ epilogue
104
+ E(0b, FFI_TYPE_FLOAT)
105
+ movss dword ptr [r8], xmm0 ; movss %xmm0, (%r8)
106
+ epilogue
107
+ E(0b, FFI_TYPE_DOUBLE)
108
+ movsd qword ptr[r8], xmm0; movsd %xmm0, (%r8)
109
+ epilogue
110
+ E(0b, FFI_TYPE_LONGDOUBLE)
111
+ call PLT(C(abort))
112
+ E(0b, FFI_TYPE_UINT8)
113
+ movzx eax, al ;movzbl %al, %eax
114
+ mov qword ptr[r8], rax; movq %rax, (%r8)
115
+ epilogue
116
+ E(0b, FFI_TYPE_SINT8)
117
+ movsx rax, al ; movsbq %al, %rax
118
+ jmp L98
119
+ E(0b, FFI_TYPE_UINT16)
120
+ movzx eax, ax ; movzwl %ax, %eax
121
+ mov qword ptr[r8], rax; movq %rax, (%r8)
122
+ epilogue
123
+ E(0b, FFI_TYPE_SINT16)
124
+ movsx rax, ax; movswq %ax, %rax
125
+ jmp L98
126
+ E(0b, FFI_TYPE_UINT32)
127
+ mov eax, eax; movl %eax, %eax
128
+ mov qword ptr[r8], rax ; movq %rax, (%r8)
129
+ epilogue
130
+ E(0b, FFI_TYPE_SINT32)
131
+ movsxd rax, eax; movslq %eax, %rax
132
+ mov qword ptr [r8], rax; movq %rax, (%r8)
133
+ epilogue
134
+ E(0b, FFI_TYPE_UINT64)
135
+ L98 LABEL near
136
+ mov qword ptr [r8], rax ; movq %rax, (%r8)
137
+ epilogue
138
+ E(0b, FFI_TYPE_SINT64)
139
+ mov qword ptr [r8], rax;movq %rax, (%r8)
140
+ epilogue
141
+ E(0b, FFI_TYPE_STRUCT)
142
+ epilogue
143
+ E(0b, FFI_TYPE_POINTER)
144
+ mov qword ptr [r8], rax ;movq %rax, (%r8)
145
+ epilogue
146
+ E(0b, FFI_TYPE_COMPLEX)
147
+ call PLT(C(abort))
148
+ E(0b, FFI_TYPE_SMALL_STRUCT_1B)
149
+ mov byte ptr [r8], al ; movb %al, (%r8)
150
+ epilogue
151
+ E(0b, FFI_TYPE_SMALL_STRUCT_2B)
152
+ mov word ptr [r8], ax ; movw %ax, (%r8)
153
+ epilogue
154
+ E(0b, FFI_TYPE_SMALL_STRUCT_4B)
155
+ mov dword ptr [r8], eax ; movl %eax, (%r8)
156
+ epilogue
157
+
158
+ align 8
159
+ L99 LABEL near
160
+ call PLT(C(abort))
161
+
162
+ epilogue
163
+
164
+ cfi_endproc
165
+ C(ffi_call_win64) endp
166
+
167
+
168
+ /* 32 bytes of outgoing register stack space, 8 bytes of alignment,
169
+ 16 bytes of result, 32 bytes of xmm registers. */
170
+ #define ffi_clo_FS (32+8+16+32)
171
+ #define ffi_clo_OFF_R (32+8)
172
+ #define ffi_clo_OFF_X (32+8+16)
173
+
174
+ align 8
175
+ PUBLIC C(ffi_go_closure_win64)
176
+
177
+ C(ffi_go_closure_win64) proc
178
+ cfi_startproc
179
+ /* Save all integer arguments into the incoming reg stack space. */
180
+ mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp)
181
+ mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp)
182
+ mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp)
183
+ mov qword ptr [rsp + 32], r9 ;movq %r9, 32(%rsp)
184
+
185
+ mov rcx, qword ptr [r10 + 8]; movq 8(%r10), %rcx /* load cif */
186
+ mov rdx, qword ptr [r10 + 16]; movq 16(%r10), %rdx /* load fun */
187
+ mov r8, r10 ; movq %r10, %r8 /* closure is user_data */
188
+ jmp ffi_closure_win64_2
189
+ cfi_endproc
190
+ C(ffi_go_closure_win64) endp
191
+
192
+ align 8
193
+
194
+ PUBLIC C(ffi_closure_win64)
195
+ C(ffi_closure_win64) PROC FRAME
196
+ cfi_startproc
197
+ /* Save all integer arguments into the incoming reg stack space. */
198
+ mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp)
199
+ mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp)
200
+ mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp)
201
+ mov qword ptr [rsp + 32], r9; movq %r9, 32(%rsp)
202
+
203
+ mov rcx, qword ptr [FFI_TRAMPOLINE_SIZE + r10] ;movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */
204
+ mov rdx, qword ptr [FFI_TRAMPOLINE_SIZE + 8 + r10] ; movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */
205
+ mov r8, qword ptr [FFI_TRAMPOLINE_SIZE+16+r10] ;movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */
206
+ ffi_closure_win64_2 LABEL near
207
+ sub rsp, ffi_clo_FS ;subq $ffi_clo_FS, %rsp
208
+ cfi_adjust_cfa_offset(ffi_clo_FS)
209
+ SEH(.allocstack ffi_clo_FS)
210
+ SEH(.endprolog)
211
+
212
+ /* Save all sse arguments into the stack frame. */
213
+ movsd qword ptr [ffi_clo_OFF_X + rsp], xmm0 ; movsd %xmm0, ffi_clo_OFF_X(%rsp)
214
+ movsd qword ptr [ffi_clo_OFF_X+8+rsp], xmm1 ; movsd %xmm1, ffi_clo_OFF_X+8(%rsp)
215
+ movsd qword ptr [ffi_clo_OFF_X+16+rsp], xmm2 ; movsd %xmm2, ffi_clo_OFF_X+16(%rsp)
216
+ movsd qword ptr [ffi_clo_OFF_X+24+rsp], xmm3 ; movsd %xmm3, ffi_clo_OFF_X+24(%rsp)
217
+
218
+ lea r9, [ffi_clo_OFF_R + rsp] ; leaq ffi_clo_OFF_R(%rsp), %r9
219
+ call C(ffi_closure_win64_inner)
220
+
221
+ /* Load the result into both possible result registers. */
222
+
223
+ mov rax, qword ptr [ffi_clo_OFF_R + rsp] ;movq ffi_clo_OFF_R(%rsp), %rax
224
+ movsd xmm0, qword ptr [rsp + ffi_clo_OFF_R] ;movsd ffi_clo_OFF_R(%rsp), %xmm0
225
+
226
+ add rsp, ffi_clo_FS ;addq $ffi_clo_FS, %rsp
227
+ cfi_adjust_cfa_offset(-ffi_clo_FS)
228
+ ret
229
+
230
+ cfi_endproc
231
+ C(ffi_closure_win64) endp
232
+
233
+ #if defined __ELF__ && defined __linux__
234
+ .section .note.GNU-stack,"",@progbits
235
+ #endif
236
+ _text ends
237
+ end
@@ -0,0 +1,298 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffi.c - Copyright (c) 2013 Tensilica, Inc.
3
+
4
+ XTENSA 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
+ #include <ffi.h>
28
+ #include <ffi_common.h>
29
+
30
+ /*
31
+ |----------------------------------------|
32
+ | |
33
+ on entry to ffi_call ----> |----------------------------------------|
34
+ | caller stack frame for registers a0-a3 |
35
+ |----------------------------------------|
36
+ | |
37
+ | additional arguments |
38
+ entry of the function ---> |----------------------------------------|
39
+ | copy of function arguments a2-a7 |
40
+ | - - - - - - - - - - - - - |
41
+ | |
42
+
43
+ The area below the entry line becomes the new stack frame for the function.
44
+
45
+ */
46
+
47
+
48
+ #define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST
49
+
50
+
51
+ extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags,
52
+ void(*fn)(void), unsigned nbytes, extended_cif*);
53
+ extern void ffi_closure_SYSV(void) FFI_HIDDEN;
54
+
55
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
56
+ {
57
+ switch(cif->rtype->type) {
58
+ case FFI_TYPE_SINT8:
59
+ case FFI_TYPE_UINT8:
60
+ case FFI_TYPE_SINT16:
61
+ case FFI_TYPE_UINT16:
62
+ cif->flags = cif->rtype->type;
63
+ break;
64
+ case FFI_TYPE_VOID:
65
+ case FFI_TYPE_FLOAT:
66
+ cif->flags = FFI_TYPE_UINT32;
67
+ break;
68
+ case FFI_TYPE_DOUBLE:
69
+ case FFI_TYPE_UINT64:
70
+ case FFI_TYPE_SINT64:
71
+ cif->flags = FFI_TYPE_UINT64; // cif->rtype->type;
72
+ break;
73
+ case FFI_TYPE_STRUCT:
74
+ cif->flags = FFI_TYPE_STRUCT; //_REGS;
75
+ /* Up to 16 bytes are returned in registers */
76
+ if (cif->rtype->size > 4 * 4) {
77
+ /* returned structure is referenced by a register; use 8 bytes
78
+ (including 4 bytes for potential additional alignment) */
79
+ cif->flags = FFI_TYPE_STRUCT;
80
+ cif->bytes += 8;
81
+ }
82
+ break;
83
+
84
+ default:
85
+ cif->flags = FFI_TYPE_UINT32;
86
+ break;
87
+ }
88
+
89
+ /* Round the stack up to a full 4 register frame, just in case
90
+ (we use this size in movsp). This way, it's also a multiple of
91
+ 8 bytes for 64-bit arguments. */
92
+ cif->bytes = FFI_ALIGN(cif->bytes, 16);
93
+
94
+ return FFI_OK;
95
+ }
96
+
97
+ void ffi_prep_args(extended_cif *ecif, unsigned char* stack)
98
+ {
99
+ unsigned int i;
100
+ unsigned long *addr;
101
+ ffi_type **ptr;
102
+
103
+ union {
104
+ void **v;
105
+ char **c;
106
+ signed char **sc;
107
+ unsigned char **uc;
108
+ signed short **ss;
109
+ unsigned short **us;
110
+ unsigned int **i;
111
+ long long **ll;
112
+ float **f;
113
+ double **d;
114
+ } p_argv;
115
+
116
+ /* Verify that everything is aligned up properly */
117
+ FFI_ASSERT (((unsigned long) stack & 0x7) == 0);
118
+
119
+ p_argv.v = ecif->avalue;
120
+ addr = (unsigned long*)stack;
121
+
122
+ /* structures with a size greater than 16 bytes are passed in memory */
123
+ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16)
124
+ {
125
+ *addr++ = (unsigned long)ecif->rvalue;
126
+ }
127
+
128
+ for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types;
129
+ i > 0;
130
+ i--, ptr++, p_argv.v++)
131
+ {
132
+ switch ((*ptr)->type)
133
+ {
134
+ case FFI_TYPE_SINT8:
135
+ *addr++ = **p_argv.sc;
136
+ break;
137
+ case FFI_TYPE_UINT8:
138
+ *addr++ = **p_argv.uc;
139
+ break;
140
+ case FFI_TYPE_SINT16:
141
+ *addr++ = **p_argv.ss;
142
+ break;
143
+ case FFI_TYPE_UINT16:
144
+ *addr++ = **p_argv.us;
145
+ break;
146
+ case FFI_TYPE_FLOAT:
147
+ case FFI_TYPE_INT:
148
+ case FFI_TYPE_UINT32:
149
+ case FFI_TYPE_SINT32:
150
+ case FFI_TYPE_POINTER:
151
+ *addr++ = **p_argv.i;
152
+ break;
153
+ case FFI_TYPE_DOUBLE:
154
+ case FFI_TYPE_UINT64:
155
+ case FFI_TYPE_SINT64:
156
+ if (((unsigned long)addr & 4) != 0)
157
+ addr++;
158
+ *(unsigned long long*)addr = **p_argv.ll;
159
+ addr += sizeof(unsigned long long) / sizeof (addr);
160
+ break;
161
+
162
+ case FFI_TYPE_STRUCT:
163
+ {
164
+ unsigned long offs;
165
+ unsigned long size;
166
+
167
+ if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4)
168
+ addr++;
169
+
170
+ offs = (unsigned long) addr - (unsigned long) stack;
171
+ size = (*ptr)->size;
172
+
173
+ /* Entire structure must fit the argument registers or referenced */
174
+ if (offs < FFI_REGISTER_NARGS * 4
175
+ && offs + size > FFI_REGISTER_NARGS * 4)
176
+ addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4);
177
+
178
+ memcpy((char*) addr, *p_argv.c, size);
179
+ addr += (size + 3) / 4;
180
+ break;
181
+ }
182
+
183
+ default:
184
+ FFI_ASSERT(0);
185
+ }
186
+ }
187
+ }
188
+
189
+
190
+ void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue)
191
+ {
192
+ extended_cif ecif;
193
+ unsigned long rsize = cif->rtype->size;
194
+ int flags = cif->flags;
195
+ void *alloc = NULL;
196
+
197
+ ecif.cif = cif;
198
+ ecif.avalue = avalue;
199
+
200
+ /* Note that for structures that are returned in registers (size <= 16 bytes)
201
+ we allocate a temporary buffer and use memcpy to copy it to the final
202
+ destination. The reason is that the target address might be misaligned or
203
+ the length not a multiple of 4 bytes. Handling all those cases would be
204
+ very complex. */
205
+
206
+ if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL))
207
+ {
208
+ alloc = alloca(FFI_ALIGN(rsize, 4));
209
+ ecif.rvalue = alloc;
210
+ }
211
+ else
212
+ {
213
+ ecif.rvalue = rvalue;
214
+ }
215
+
216
+ if (cif->abi != FFI_SYSV)
217
+ FFI_ASSERT(0);
218
+
219
+ ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif);
220
+
221
+ if (alloc != NULL && rvalue != NULL)
222
+ memcpy(rvalue, alloc, rsize);
223
+ }
224
+
225
+ extern void ffi_trampoline();
226
+ extern void ffi_cacheflush(void* start, void* end);
227
+
228
+ ffi_status
229
+ ffi_prep_closure_loc (ffi_closure* closure,
230
+ ffi_cif* cif,
231
+ void (*fun)(ffi_cif*, void*, void**, void*),
232
+ void *user_data,
233
+ void *codeloc)
234
+ {
235
+ /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */
236
+ memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE);
237
+ *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV;
238
+
239
+ // Do we have this function?
240
+ // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE)
241
+ ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE);
242
+
243
+ closure->cif = cif;
244
+ closure->fun = fun;
245
+ closure->user_data = user_data;
246
+ return FFI_OK;
247
+ }
248
+
249
+
250
+ long FFI_HIDDEN
251
+ ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue)
252
+ {
253
+ ffi_cif *cif;
254
+ ffi_type **arg_types;
255
+ void **avalue;
256
+ int i, areg;
257
+
258
+ cif = closure->cif;
259
+ if (cif->abi != FFI_SYSV)
260
+ return FFI_BAD_ABI;
261
+
262
+ areg = 0;
263
+
264
+ int rtype = cif->rtype->type;
265
+ if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4)
266
+ {
267
+ rvalue = *values;
268
+ areg++;
269
+ }
270
+
271
+ cif = closure->cif;
272
+ arg_types = cif->arg_types;
273
+ avalue = alloca(cif->nargs * sizeof(void *));
274
+
275
+ for (i = 0; i < cif->nargs; i++)
276
+ {
277
+ if (arg_types[i]->alignment == 8 && (areg & 1) != 0)
278
+ areg++;
279
+
280
+ // skip the entry 16,a1 framework, add 16 bytes (4 registers)
281
+ if (areg == FFI_REGISTER_NARGS)
282
+ areg += 4;
283
+
284
+ if (arg_types[i]->type == FFI_TYPE_STRUCT)
285
+ {
286
+ int numregs = ((arg_types[i]->size + 3) & ~3) / 4;
287
+ if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS)
288
+ areg = FFI_REGISTER_NARGS + 4;
289
+ }
290
+
291
+ avalue[i] = &values[areg];
292
+ areg += (arg_types[i]->size + 3) / 4;
293
+ }
294
+
295
+ (closure->fun)(cif, rvalue, avalue, closure->user_data);
296
+
297
+ return rtype;
298
+ }