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
@@ -1,7 +1,8 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi.c - Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc.
3
-
4
- Alpha Foreign Function Interface
2
+ ffi.c - Copyright (c) 2012 Anthony Green
3
+ Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc.
4
+
5
+ Alpha Foreign Function Interface
5
6
 
6
7
  Permission is hereby granted, free of charge, to any person obtaining
7
8
  a copy of this software and associated documentation files (the
@@ -27,6 +28,7 @@
27
28
  #include <ffi.h>
28
29
  #include <ffi_common.h>
29
30
  #include <stdlib.h>
31
+ #include "internal.h"
30
32
 
31
33
  /* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
32
34
  all further uses in this file will refer to the 128-bit type. */
@@ -39,135 +41,286 @@
39
41
  # define FFI_TYPE_LONGDOUBLE 4
40
42
  #endif
41
43
 
42
- extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void))
43
- FFI_HIDDEN;
44
+ extern void ffi_call_osf(void *stack, void *frame, unsigned flags,
45
+ void *raddr, void (*fn)(void), void *closure)
46
+ FFI_HIDDEN;
44
47
  extern void ffi_closure_osf(void) FFI_HIDDEN;
48
+ extern void ffi_go_closure_osf(void) FFI_HIDDEN;
45
49
 
50
+ /* Promote a float value to its in-register double representation.
51
+ Unlike actually casting to double, this does not trap on NaN. */
52
+ static inline UINT64 lds(void *ptr)
53
+ {
54
+ UINT64 ret;
55
+ asm("lds %0,%1" : "=f"(ret) : "m"(*(UINT32 *)ptr));
56
+ return ret;
57
+ }
46
58
 
47
- ffi_status
59
+ /* And the reverse. */
60
+ static inline void sts(void *ptr, UINT64 val)
61
+ {
62
+ asm("sts %1,%0" : "=m"(*(UINT32 *)ptr) : "f"(val));
63
+ }
64
+
65
+ ffi_status FFI_HIDDEN
48
66
  ffi_prep_cif_machdep(ffi_cif *cif)
49
67
  {
50
- /* Adjust cif->bytes to represent a minimum 6 words for the temporary
51
- register argument loading area. */
52
- if (cif->bytes < 6*FFI_SIZEOF_ARG)
53
- cif->bytes = 6*FFI_SIZEOF_ARG;
68
+ size_t bytes = 0;
69
+ int flags, i, avn;
70
+ ffi_type *rtype, *itype;
71
+
72
+ if (cif->abi != FFI_OSF)
73
+ return FFI_BAD_ABI;
74
+
75
+ /* Compute the size of the argument area. */
76
+ for (i = 0, avn = cif->nargs; i < avn; i++)
77
+ {
78
+ itype = cif->arg_types[i];
79
+ switch (itype->type)
80
+ {
81
+ case FFI_TYPE_INT:
82
+ case FFI_TYPE_SINT8:
83
+ case FFI_TYPE_UINT8:
84
+ case FFI_TYPE_SINT16:
85
+ case FFI_TYPE_UINT16:
86
+ case FFI_TYPE_SINT32:
87
+ case FFI_TYPE_UINT32:
88
+ case FFI_TYPE_SINT64:
89
+ case FFI_TYPE_UINT64:
90
+ case FFI_TYPE_POINTER:
91
+ case FFI_TYPE_FLOAT:
92
+ case FFI_TYPE_DOUBLE:
93
+ case FFI_TYPE_LONGDOUBLE:
94
+ /* All take one 8 byte slot. */
95
+ bytes += 8;
96
+ break;
97
+
98
+ case FFI_TYPE_VOID:
99
+ case FFI_TYPE_STRUCT:
100
+ /* Passed by value in N slots. */
101
+ bytes += FFI_ALIGN(itype->size, FFI_SIZEOF_ARG);
102
+ break;
103
+
104
+ case FFI_TYPE_COMPLEX:
105
+ /* _Complex long double passed by reference; others in 2 slots. */
106
+ if (itype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
107
+ bytes += 8;
108
+ else
109
+ bytes += 16;
110
+ break;
111
+
112
+ default:
113
+ abort();
114
+ }
115
+ }
54
116
 
55
117
  /* Set the return type flag */
56
- switch (cif->rtype->type)
118
+ rtype = cif->rtype;
119
+ switch (rtype->type)
57
120
  {
58
- case FFI_TYPE_STRUCT:
121
+ case FFI_TYPE_VOID:
122
+ flags = ALPHA_FLAGS(ALPHA_ST_VOID, ALPHA_LD_VOID);
123
+ break;
124
+ case FFI_TYPE_INT:
125
+ case FFI_TYPE_UINT32:
126
+ case FFI_TYPE_SINT32:
127
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT32);
128
+ break;
59
129
  case FFI_TYPE_FLOAT:
130
+ flags = ALPHA_FLAGS(ALPHA_ST_FLOAT, ALPHA_LD_FLOAT);
131
+ break;
60
132
  case FFI_TYPE_DOUBLE:
61
- cif->flags = cif->rtype->type;
133
+ flags = ALPHA_FLAGS(ALPHA_ST_DOUBLE, ALPHA_LD_DOUBLE);
134
+ break;
135
+ case FFI_TYPE_UINT8:
136
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT8);
137
+ break;
138
+ case FFI_TYPE_SINT8:
139
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT8);
140
+ break;
141
+ case FFI_TYPE_UINT16:
142
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT16);
143
+ break;
144
+ case FFI_TYPE_SINT16:
145
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT16);
146
+ break;
147
+ case FFI_TYPE_UINT64:
148
+ case FFI_TYPE_SINT64:
149
+ case FFI_TYPE_POINTER:
150
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64);
62
151
  break;
63
-
64
152
  case FFI_TYPE_LONGDOUBLE:
65
- /* 128-bit long double is returned in memory, like a struct. */
66
- cif->flags = FFI_TYPE_STRUCT;
153
+ case FFI_TYPE_STRUCT:
154
+ /* Passed in memory, with a hidden pointer. */
155
+ flags = ALPHA_RET_IN_MEM;
67
156
  break;
68
-
69
- default:
70
- cif->flags = FFI_TYPE_INT;
157
+ case FFI_TYPE_COMPLEX:
158
+ itype = rtype->elements[0];
159
+ switch (itype->type)
160
+ {
161
+ case FFI_TYPE_FLOAT:
162
+ flags = ALPHA_FLAGS(ALPHA_ST_CPLXF, ALPHA_LD_CPLXF);
163
+ break;
164
+ case FFI_TYPE_DOUBLE:
165
+ flags = ALPHA_FLAGS(ALPHA_ST_CPLXD, ALPHA_LD_CPLXD);
166
+ break;
167
+ default:
168
+ if (rtype->size <= 8)
169
+ flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64);
170
+ else
171
+ flags = ALPHA_RET_IN_MEM;
172
+ break;
173
+ }
71
174
  break;
175
+ default:
176
+ abort();
72
177
  }
73
-
178
+ cif->flags = flags;
179
+
180
+ /* Include the hidden structure pointer in args requirement. */
181
+ if (flags == ALPHA_RET_IN_MEM)
182
+ bytes += 8;
183
+ /* Minimum size is 6 slots, so that ffi_call_osf can pop them. */
184
+ if (bytes < 6*8)
185
+ bytes = 6*8;
186
+ cif->bytes = bytes;
187
+
74
188
  return FFI_OK;
75
189
  }
76
190
 
191
+ static unsigned long
192
+ extend_basic_type(void *valp, int type, int argn)
193
+ {
194
+ switch (type)
195
+ {
196
+ case FFI_TYPE_SINT8:
197
+ return *(SINT8 *)valp;
198
+ case FFI_TYPE_UINT8:
199
+ return *(UINT8 *)valp;
200
+ case FFI_TYPE_SINT16:
201
+ return *(SINT16 *)valp;
202
+ case FFI_TYPE_UINT16:
203
+ return *(UINT16 *)valp;
77
204
 
78
- void
79
- ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
205
+ case FFI_TYPE_FLOAT:
206
+ if (argn < 6)
207
+ return lds(valp);
208
+ /* FALLTHRU */
209
+
210
+ case FFI_TYPE_INT:
211
+ case FFI_TYPE_SINT32:
212
+ case FFI_TYPE_UINT32:
213
+ /* Note that unsigned 32-bit quantities are sign extended. */
214
+ return *(SINT32 *)valp;
215
+
216
+ case FFI_TYPE_SINT64:
217
+ case FFI_TYPE_UINT64:
218
+ case FFI_TYPE_POINTER:
219
+ case FFI_TYPE_DOUBLE:
220
+ return *(UINT64 *)valp;
221
+
222
+ default:
223
+ abort();
224
+ }
225
+ }
226
+
227
+ static void
228
+ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
229
+ void **avalue, void *closure)
80
230
  {
81
- unsigned long *stack, *argp;
82
- long i, avn;
231
+ unsigned long *argp;
232
+ long i, avn, argn, flags = cif->flags;
83
233
  ffi_type **arg_types;
84
-
234
+ void *frame;
235
+
85
236
  /* If the return value is a struct and we don't have a return
86
237
  value address then we need to make one. */
87
- if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT)
238
+ if (rvalue == NULL && flags == ALPHA_RET_IN_MEM)
88
239
  rvalue = alloca(cif->rtype->size);
89
240
 
90
241
  /* Allocate the space for the arguments, plus 4 words of temp
91
242
  space for ffi_call_osf. */
92
- argp = stack = alloca(cif->bytes + 4*FFI_SIZEOF_ARG);
243
+ argp = frame = alloca(cif->bytes + 4*FFI_SIZEOF_ARG);
244
+ frame += cif->bytes;
93
245
 
94
- if (cif->flags == FFI_TYPE_STRUCT)
95
- *(void **) argp++ = rvalue;
246
+ argn = 0;
247
+ if (flags == ALPHA_RET_IN_MEM)
248
+ argp[argn++] = (unsigned long)rvalue;
96
249
 
97
- i = 0;
98
250
  avn = cif->nargs;
99
251
  arg_types = cif->arg_types;
100
252
 
101
- while (i < avn)
253
+ for (i = 0, avn = cif->nargs; i < avn; i++)
102
254
  {
103
- size_t size = (*arg_types)->size;
255
+ ffi_type *ty = arg_types[i];
256
+ void *valp = avalue[i];
257
+ int type = ty->type;
258
+ size_t size;
104
259
 
105
- switch ((*arg_types)->type)
260
+ switch (type)
106
261
  {
262
+ case FFI_TYPE_INT:
107
263
  case FFI_TYPE_SINT8:
108
- *(SINT64 *) argp = *(SINT8 *)(* avalue);
109
- break;
110
-
111
264
  case FFI_TYPE_UINT8:
112
- *(SINT64 *) argp = *(UINT8 *)(* avalue);
113
- break;
114
-
115
265
  case FFI_TYPE_SINT16:
116
- *(SINT64 *) argp = *(SINT16 *)(* avalue);
117
- break;
118
-
119
266
  case FFI_TYPE_UINT16:
120
- *(SINT64 *) argp = *(UINT16 *)(* avalue);
121
- break;
122
-
123
267
  case FFI_TYPE_SINT32:
124
268
  case FFI_TYPE_UINT32:
125
- /* Note that unsigned 32-bit quantities are sign extended. */
126
- *(SINT64 *) argp = *(SINT32 *)(* avalue);
127
- break;
128
-
129
269
  case FFI_TYPE_SINT64:
130
270
  case FFI_TYPE_UINT64:
131
271
  case FFI_TYPE_POINTER:
132
- *(UINT64 *) argp = *(UINT64 *)(* avalue);
133
- break;
134
-
135
272
  case FFI_TYPE_FLOAT:
136
- if (argp - stack < 6)
137
- {
138
- /* Note the conversion -- all the fp regs are loaded as
139
- doubles. The in-register format is the same. */
140
- *(double *) argp = *(float *)(* avalue);
141
- }
142
- else
143
- *(float *) argp = *(float *)(* avalue);
144
- break;
145
-
146
273
  case FFI_TYPE_DOUBLE:
147
- *(double *) argp = *(double *)(* avalue);
274
+ argp[argn] = extend_basic_type(valp, type, argn);
275
+ argn++;
148
276
  break;
149
277
 
150
278
  case FFI_TYPE_LONGDOUBLE:
151
- /* 128-bit long double is passed by reference. */
152
- *(long double **) argp = (long double *)(* avalue);
153
- size = sizeof (long double *);
279
+ by_reference:
280
+ /* Note that 128-bit long double is passed by reference. */
281
+ argp[argn++] = (unsigned long)valp;
154
282
  break;
155
283
 
284
+ case FFI_TYPE_VOID:
156
285
  case FFI_TYPE_STRUCT:
157
- memcpy(argp, *avalue, (*arg_types)->size);
286
+ size = ty->size;
287
+ memcpy(argp + argn, valp, size);
288
+ argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
289
+ break;
290
+
291
+ case FFI_TYPE_COMPLEX:
292
+ type = ty->elements[0]->type;
293
+ if (type == FFI_TYPE_LONGDOUBLE)
294
+ goto by_reference;
295
+
296
+ /* Most complex types passed as two separate arguments. */
297
+ size = ty->elements[0]->size;
298
+ argp[argn] = extend_basic_type(valp, type, argn);
299
+ argp[argn + 1] = extend_basic_type(valp + size, type, argn + 1);
300
+ argn += 2;
158
301
  break;
159
302
 
160
303
  default:
161
- FFI_ASSERT(0);
304
+ abort();
162
305
  }
163
-
164
- argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
165
- i++, arg_types++, avalue++;
166
306
  }
167
307
 
168
- ffi_call_osf(stack, cif->bytes, cif->flags, rvalue, fn);
308
+ flags = (flags >> ALPHA_ST_SHIFT) & 0xff;
309
+ ffi_call_osf(argp, frame, flags, rvalue, fn, closure);
169
310
  }
170
311
 
312
+ void
313
+ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
314
+ {
315
+ ffi_call_int(cif, fn, rvalue, avalue, NULL);
316
+ }
317
+
318
+ void
319
+ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
320
+ void **avalue, void *closure)
321
+ {
322
+ ffi_call_int(cif, fn, rvalue, avalue, closure);
323
+ }
171
324
 
172
325
  ffi_status
173
326
  ffi_prep_closure_loc (ffi_closure* closure,
@@ -178,6 +331,9 @@ ffi_prep_closure_loc (ffi_closure* closure,
178
331
  {
179
332
  unsigned int *tramp;
180
333
 
334
+ if (cif->abi != FFI_OSF)
335
+ return FFI_BAD_ABI;
336
+
181
337
  tramp = (unsigned int *) &closure->tramp[0];
182
338
  tramp[0] = 0x47fb0401; /* mov $27,$1 */
183
339
  tramp[1] = 0xa77b0010; /* ldq $27,16($27) */
@@ -200,39 +356,56 @@ ffi_prep_closure_loc (ffi_closure* closure,
200
356
  return FFI_OK;
201
357
  }
202
358
 
359
+ ffi_status
360
+ ffi_prep_go_closure (ffi_go_closure* closure,
361
+ ffi_cif* cif,
362
+ void (*fun)(ffi_cif*, void*, void**, void*))
363
+ {
364
+ if (cif->abi != FFI_OSF)
365
+ return FFI_BAD_ABI;
366
+
367
+ closure->tramp = (void *)ffi_go_closure_osf;
368
+ closure->cif = cif;
369
+ closure->fun = fun;
370
+
371
+ return FFI_OK;
372
+ }
203
373
 
204
374
  long FFI_HIDDEN
205
- ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp)
375
+ ffi_closure_osf_inner (ffi_cif *cif,
376
+ void (*fun)(ffi_cif*, void*, void**, void*),
377
+ void *user_data,
378
+ void *rvalue, unsigned long *argp)
206
379
  {
207
- ffi_cif *cif;
208
380
  void **avalue;
209
381
  ffi_type **arg_types;
210
- long i, avn, argn;
382
+ long i, avn, argn, flags;
211
383
 
212
- cif = closure->cif;
213
384
  avalue = alloca(cif->nargs * sizeof(void *));
214
-
385
+ flags = cif->flags;
215
386
  argn = 0;
216
387
 
217
388
  /* Copy the caller's structure return address to that the closure
218
389
  returns the data directly to the caller. */
219
- if (cif->flags == FFI_TYPE_STRUCT)
390
+ if (flags == ALPHA_RET_IN_MEM)
220
391
  {
221
392
  rvalue = (void *) argp[0];
222
393
  argn = 1;
223
394
  }
224
395
 
225
- i = 0;
226
- avn = cif->nargs;
227
396
  arg_types = cif->arg_types;
228
-
397
+
229
398
  /* Grab the addresses of the arguments from the stack frame. */
230
- while (i < avn)
399
+ for (i = 0, avn = cif->nargs; i < avn; i++)
231
400
  {
232
- size_t size = arg_types[i]->size;
401
+ ffi_type *ty = arg_types[i];
402
+ int type = ty->type;
403
+ void *valp = &argp[argn];
404
+ size_t size;
233
405
 
234
- switch (arg_types[i]->type)
406
+ switch (type)
235
407
  {
408
+ case FFI_TYPE_INT:
236
409
  case FFI_TYPE_SINT8:
237
410
  case FFI_TYPE_UINT8:
238
411
  case FFI_TYPE_SINT16:
@@ -242,43 +415,107 @@ ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp)
242
415
  case FFI_TYPE_SINT64:
243
416
  case FFI_TYPE_UINT64:
244
417
  case FFI_TYPE_POINTER:
418
+ argn += 1;
419
+ break;
420
+
421
+ case FFI_TYPE_VOID:
245
422
  case FFI_TYPE_STRUCT:
246
- avalue[i] = &argp[argn];
423
+ size = ty->size;
424
+ argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
247
425
  break;
248
426
 
249
427
  case FFI_TYPE_FLOAT:
428
+ /* Floats coming from registers need conversion from double
429
+ back to float format. */
250
430
  if (argn < 6)
251
431
  {
252
- /* Floats coming from registers need conversion from double
253
- back to float format. */
254
- *(float *)&argp[argn - 6] = *(double *)&argp[argn - 6];
255
- avalue[i] = &argp[argn - 6];
432
+ valp = &argp[argn - 6];
433
+ sts(valp, argp[argn - 6]);
256
434
  }
257
- else
258
- avalue[i] = &argp[argn];
435
+ argn += 1;
259
436
  break;
260
437
 
261
438
  case FFI_TYPE_DOUBLE:
262
- avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)];
439
+ if (argn < 6)
440
+ valp = &argp[argn - 6];
441
+ argn += 1;
263
442
  break;
264
443
 
265
444
  case FFI_TYPE_LONGDOUBLE:
445
+ by_reference:
266
446
  /* 128-bit long double is passed by reference. */
267
- avalue[i] = (long double *) argp[argn];
268
- size = sizeof (long double *);
447
+ valp = (void *)argp[argn];
448
+ argn += 1;
449
+ break;
450
+
451
+ case FFI_TYPE_COMPLEX:
452
+ type = ty->elements[0]->type;
453
+ switch (type)
454
+ {
455
+ case FFI_TYPE_SINT64:
456
+ case FFI_TYPE_UINT64:
457
+ /* Passed as separate arguments, but they wind up sequential. */
458
+ break;
459
+
460
+ case FFI_TYPE_INT:
461
+ case FFI_TYPE_SINT8:
462
+ case FFI_TYPE_UINT8:
463
+ case FFI_TYPE_SINT16:
464
+ case FFI_TYPE_UINT16:
465
+ case FFI_TYPE_SINT32:
466
+ case FFI_TYPE_UINT32:
467
+ /* Passed as separate arguments. Disjoint, but there's room
468
+ enough in one slot to hold the pair. */
469
+ size = ty->elements[0]->size;
470
+ memcpy(valp + size, valp + 8, size);
471
+ break;
472
+
473
+ case FFI_TYPE_FLOAT:
474
+ /* Passed as separate arguments. Disjoint, and each piece
475
+ may need conversion back to float. */
476
+ if (argn < 6)
477
+ {
478
+ valp = &argp[argn - 6];
479
+ sts(valp, argp[argn - 6]);
480
+ }
481
+ if (argn + 1 < 6)
482
+ sts(valp + 4, argp[argn + 1 - 6]);
483
+ else
484
+ *(UINT32 *)(valp + 4) = argp[argn + 1];
485
+ break;
486
+
487
+ case FFI_TYPE_DOUBLE:
488
+ /* Passed as separate arguments. Only disjoint if one part
489
+ is in fp regs and the other is on the stack. */
490
+ if (argn < 5)
491
+ valp = &argp[argn - 6];
492
+ else if (argn == 5)
493
+ {
494
+ valp = alloca(16);
495
+ ((UINT64 *)valp)[0] = argp[5 - 6];
496
+ ((UINT64 *)valp)[1] = argp[6];
497
+ }
498
+ break;
499
+
500
+ case FFI_TYPE_LONGDOUBLE:
501
+ goto by_reference;
502
+
503
+ default:
504
+ abort();
505
+ }
506
+ argn += 2;
269
507
  break;
270
508
 
271
509
  default:
272
510
  abort ();
273
511
  }
274
512
 
275
- argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
276
- i++;
513
+ avalue[i] = valp;
277
514
  }
278
515
 
279
516
  /* Invoke the closure. */
280
- closure->fun (cif, rvalue, avalue, closure->user_data);
517
+ fun (cif, rvalue, avalue, user_data);
281
518
 
282
519
  /* Tell ffi_closure_osf how to perform return type promotions. */
283
- return cif->rtype->type;
520
+ return (flags >> ALPHA_LD_SHIFT) & 0xff;
284
521
  }