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,5 +1,6 @@
1
1
  /* -----------------------------------------------------------------*-C-*-
2
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
2
+ ffitarget.h - Copyright (c) 2012 Anthony Green
3
+ Copyright (c) 1996-2003 Red Hat, Inc.
3
4
  Target configuration macros for Motorola 68K.
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
27
28
  #ifndef LIBFFI_TARGET_H
28
29
  #define LIBFFI_TARGET_H
29
30
 
31
+ #ifndef LIBFFI_H
32
+ #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
33
+ #endif
34
+
30
35
  #ifndef LIBFFI_ASM
31
36
  typedef unsigned long ffi_arg;
32
37
  typedef signed long ffi_sarg;
@@ -1,9 +1,11 @@
1
1
  /* -----------------------------------------------------------------------
2
2
 
3
- sysv.S - Copyright (c) 1998 Andreas Schwab
4
- Copyright (c) 2008 Red Hat, Inc.
5
-
6
- m68k Foreign Function Interface
3
+ sysv.S - Copyright (c) 2012 Alan Hourihane
4
+ Copyright (c) 1998, 2012 Andreas Schwab
5
+ Copyright (c) 2008 Red Hat, Inc.
6
+ Copyright (c) 2012, 2016 Thorsten Glaser
7
+
8
+ m68k Foreign Function Interface
7
9
 
8
10
  Permission is hereby granted, free of charge, to any person obtaining
9
11
  a copy of this software and associated documentation files (the
@@ -40,15 +42,21 @@
40
42
  #define CFI_OFFSET(reg,off)
41
43
  #define CFI_DEF_CFA(reg,off)
42
44
  #define CFI_ENDPROC()
45
+ #endif
46
+
47
+ #ifdef __MINT__
48
+ #define CALLFUNC(funcname) _ ## funcname
49
+ #else
50
+ #define CALLFUNC(funcname) funcname
43
51
  #endif
44
52
 
45
53
  .text
46
54
 
47
- .globl ffi_call_SYSV
48
- .type ffi_call_SYSV,@function
55
+ .globl CALLFUNC(ffi_call_SYSV)
56
+ .type CALLFUNC(ffi_call_SYSV),@function
49
57
  .align 4
50
58
 
51
- ffi_call_SYSV:
59
+ CALLFUNC(ffi_call_SYSV):
52
60
  CFI_STARTPROC()
53
61
  link %fp,#0
54
62
  CFI_OFFSET(14,-8)
@@ -63,14 +71,27 @@ ffi_call_SYSV:
63
71
  move.l 8(%fp),-(%sp)
64
72
  pea 4(%sp)
65
73
  #if !defined __PIC__
66
- jsr ffi_prep_args
74
+ jsr CALLFUNC(ffi_prep_args)
75
+ #elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
76
+ move.l _current_shared_library_a5_offset_(%a5),%a0
77
+ move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0
78
+ jsr (%a0)
79
+ #elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
80
+ move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
81
+ lea (-6,%pc,%a0),%a0
82
+ move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0
83
+ jsr (%a0)
67
84
  #else
68
- bsr.l ffi_prep_args@PLTPC
85
+ bsr.l CALLFUNC(ffi_prep_args@PLTPC)
69
86
  #endif
70
87
  addq.l #8,%sp
71
88
 
72
89
  | Pass pointer to struct value, if any
90
+ #ifdef __MINT__
91
+ move.l %d0,%a1
92
+ #else
73
93
  move.l %a0,%a1
94
+ #endif
74
95
 
75
96
  | Call the function
76
97
  move.l 24(%fp),%a0
@@ -87,7 +108,7 @@ ffi_call_SYSV:
87
108
 
88
109
  | If the return value pointer is NULL, assume no return value.
89
110
  | NOTE: On the mc68000, tst on an address register is not supported.
90
- #if defined(__mc68000__) && !defined(__mcoldfire__)
111
+ #if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
91
112
  cmp.w #0, %a1
92
113
  #else
93
114
  tst.l %a1
@@ -109,7 +130,7 @@ retlongint:
109
130
  retfloat:
110
131
  btst #2,%d2
111
132
  jbeq retdouble
112
- #if defined(__MC68881__)
133
+ #if defined(__MC68881__) || defined(__HAVE_68881__)
113
134
  fmove.s %fp0,(%a1)
114
135
  #else
115
136
  move.l %d0,(%a1)
@@ -119,7 +140,7 @@ retfloat:
119
140
  retdouble:
120
141
  btst #3,%d2
121
142
  jbeq retlongdouble
122
- #if defined(__MC68881__)
143
+ #if defined(__MC68881__) || defined(__HAVE_68881__)
123
144
  fmove.d %fp0,(%a1)
124
145
  #else
125
146
  move.l %d0,(%a1)+
@@ -130,7 +151,7 @@ retdouble:
130
151
  retlongdouble:
131
152
  btst #4,%d2
132
153
  jbeq retpointer
133
- #if defined(__MC68881__)
154
+ #if defined(__MC68881__) || defined(__HAVE_68881__)
134
155
  fmove.x %fp0,(%a1)
135
156
  #else
136
157
  move.l %d0,(%a1)+
@@ -142,7 +163,11 @@ retlongdouble:
142
163
  retpointer:
143
164
  btst #5,%d2
144
165
  jbeq retstruct1
166
+ #ifdef __MINT__
167
+ move.l %d0,(%a1)
168
+ #else
145
169
  move.l %a0,(%a1)
170
+ #endif
146
171
  jbra epilogue
147
172
 
148
173
  retstruct1:
@@ -153,8 +178,28 @@ retstruct1:
153
178
 
154
179
  retstruct2:
155
180
  btst #7,%d2
156
- jbeq noretval
181
+ jbeq retsint8
157
182
  move.w %d0,(%a1)
183
+ jbra epilogue
184
+
185
+ retsint8:
186
+ btst #8,%d2
187
+ jbeq retsint16
188
+ | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
189
+ #if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
190
+ ext.w %d0
191
+ ext.l %d0
192
+ #else
193
+ extb.l %d0
194
+ #endif
195
+ move.l %d0,(%a1)
196
+ jbra epilogue
197
+
198
+ retsint16:
199
+ btst #9,%d2
200
+ jbeq noretval
201
+ ext.l %d0
202
+ move.l %d0,(%a1)
158
203
 
159
204
  noretval:
160
205
  epilogue:
@@ -162,13 +207,13 @@ epilogue:
162
207
  unlk %fp
163
208
  rts
164
209
  CFI_ENDPROC()
165
- .size ffi_call_SYSV,.-ffi_call_SYSV
210
+ .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
166
211
 
167
- .globl ffi_closure_SYSV
168
- .type ffi_closure_SYSV, @function
212
+ .globl CALLFUNC(ffi_closure_SYSV)
213
+ .type CALLFUNC(ffi_closure_SYSV), @function
169
214
  .align 4
170
215
 
171
- ffi_closure_SYSV:
216
+ CALLFUNC(ffi_closure_SYSV):
172
217
  CFI_STARTPROC()
173
218
  link %fp,#-12
174
219
  CFI_OFFSET(14,-8)
@@ -178,16 +223,27 @@ ffi_closure_SYSV:
178
223
  pea -12(%fp)
179
224
  move.l %a0,-(%sp)
180
225
  #if !defined __PIC__
181
- jsr ffi_closure_SYSV_inner
226
+ jsr CALLFUNC(ffi_closure_SYSV_inner)
227
+ #elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
228
+ move.l _current_shared_library_a5_offset_(%a5),%a0
229
+ move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
230
+ jsr (%a0)
231
+ #elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
232
+ move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
233
+ lea (-6,%pc,%a0),%a0
234
+ move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
235
+ jsr (%a0)
182
236
  #else
183
- bsr.l ffi_closure_SYSV_inner@PLTPC
237
+ bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
184
238
  #endif
185
239
 
186
240
  lsr.l #1,%d0
187
241
  jne 1f
188
242
  jcc .Lcls_epilogue
243
+ | CIF_FLAGS_INT
189
244
  move.l -12(%fp),%d0
190
245
  .Lcls_epilogue:
246
+ | no CIF_FLAGS_*
191
247
  unlk %fp
192
248
  rts
193
249
  1:
@@ -195,11 +251,12 @@ ffi_closure_SYSV:
195
251
  lsr.l #2,%d0
196
252
  jne 1f
197
253
  jcs .Lcls_ret_float
254
+ | CIF_FLAGS_DINT
198
255
  move.l (%a0)+,%d0
199
256
  move.l (%a0),%d1
200
257
  jra .Lcls_epilogue
201
258
  .Lcls_ret_float:
202
- #if defined(__MC68881__)
259
+ #if defined(__MC68881__) || defined(__HAVE_68881__)
203
260
  fmove.s (%a0),%fp0
204
261
  #else
205
262
  move.l (%a0),%d0
@@ -209,7 +266,8 @@ ffi_closure_SYSV:
209
266
  lsr.l #2,%d0
210
267
  jne 1f
211
268
  jcs .Lcls_ret_ldouble
212
- #if defined(__MC68881__)
269
+ | CIF_FLAGS_DOUBLE
270
+ #if defined(__MC68881__) || defined(__HAVE_68881__)
213
271
  fmove.d (%a0),%fp0
214
272
  #else
215
273
  move.l (%a0)+,%d0
@@ -217,7 +275,7 @@ ffi_closure_SYSV:
217
275
  #endif
218
276
  jra .Lcls_epilogue
219
277
  .Lcls_ret_ldouble:
220
- #if defined(__MC68881__)
278
+ #if defined(__MC68881__) || defined(__HAVE_68881__)
221
279
  fmove.x (%a0),%fp0
222
280
  #else
223
281
  move.l (%a0)+,%d0
@@ -227,26 +285,46 @@ ffi_closure_SYSV:
227
285
  jra .Lcls_epilogue
228
286
  1:
229
287
  lsr.l #2,%d0
230
- jne .Lcls_ret_struct2
288
+ jne 1f
231
289
  jcs .Lcls_ret_struct1
290
+ | CIF_FLAGS_POINTER
232
291
  move.l (%a0),%a0
233
292
  move.l %a0,%d0
234
293
  jra .Lcls_epilogue
235
294
  .Lcls_ret_struct1:
236
295
  move.b (%a0),%d0
237
296
  jra .Lcls_epilogue
238
- .Lcls_ret_struct2:
297
+ 1:
298
+ lsr.l #2,%d0
299
+ jne 1f
300
+ jcs .Lcls_ret_sint8
301
+ | CIF_FLAGS_STRUCT2
239
302
  move.w (%a0),%d0
240
303
  jra .Lcls_epilogue
304
+ .Lcls_ret_sint8:
305
+ move.l (%a0),%d0
306
+ | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
307
+ #if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
308
+ ext.w %d0
309
+ ext.l %d0
310
+ #else
311
+ extb.l %d0
312
+ #endif
313
+ jra .Lcls_epilogue
314
+ 1:
315
+ | CIF_FLAGS_SINT16
316
+ move.l (%a0),%d0
317
+ ext.l %d0
318
+ jra .Lcls_epilogue
241
319
  CFI_ENDPROC()
242
320
 
243
- .size ffi_closure_SYSV,.-ffi_closure_SYSV
321
+ .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
244
322
 
245
- .globl ffi_closure_struct_SYSV
246
- .type ffi_closure_struct_SYSV, @function
323
+ .globl CALLFUNC(ffi_closure_struct_SYSV)
324
+ .type CALLFUNC(ffi_closure_struct_SYSV), @function
247
325
  .align 4
248
326
 
249
- ffi_closure_struct_SYSV:
327
+ CALLFUNC(ffi_closure_struct_SYSV):
250
328
  CFI_STARTPROC()
251
329
  link %fp,#0
252
330
  CFI_OFFSET(14,-8)
@@ -256,14 +334,23 @@ ffi_closure_struct_SYSV:
256
334
  move.l %a1,-(%sp)
257
335
  move.l %a0,-(%sp)
258
336
  #if !defined __PIC__
259
- jsr ffi_closure_SYSV_inner
337
+ jsr CALLFUNC(ffi_closure_SYSV_inner)
338
+ #elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__)
339
+ move.l _current_shared_library_a5_offset_(%a5),%a0
340
+ move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
341
+ jsr (%a0)
342
+ #elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__)
343
+ move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0
344
+ lea (-6,%pc,%a0),%a0
345
+ move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0
346
+ jsr (%a0)
260
347
  #else
261
- bsr.l ffi_closure_SYSV_inner@PLTPC
348
+ bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
262
349
  #endif
263
350
  unlk %fp
264
351
  rts
265
352
  CFI_ENDPROC()
266
- .size ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV
353
+ .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
267
354
 
268
355
  #if defined __ELF__ && defined __linux__
269
356
  .section .note.GNU-stack,"",@progbits
@@ -0,0 +1,400 @@
1
+ /*
2
+ * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org>
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining
5
+ * a copy of this software and associated documentation files (the
6
+ * ``Software''), to deal in the Software without restriction, including
7
+ * without limitation the rights to use, copy, modify, merge, publish,
8
+ * distribute, sublicense, and/or sell copies of the Software, and to
9
+ * permit persons to whom the Software is furnished to do so, subject to
10
+ * the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included
13
+ * in all copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
16
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ */
23
+
24
+ /*
25
+ * m88k Foreign Function Interface
26
+ *
27
+ * This file attempts to provide all the FFI entry points which can reliably
28
+ * be implemented in C.
29
+ *
30
+ * Only OpenBSD/m88k is currently supported; other platforms (such as
31
+ * Motorola's SysV/m88k) could be supported with the following tweaks:
32
+ *
33
+ * - non-OpenBSD systems use an `outgoing parameter area' as part of the
34
+ * 88BCS calling convention, which is not supported under OpenBSD from
35
+ * release 3.6 onwards. Supporting it should be as easy as taking it
36
+ * into account when adjusting the stack, in the assembly code.
37
+ *
38
+ * - the logic deciding whether a function argument gets passed through
39
+ * registers, or on the stack, has changed several times in OpenBSD in
40
+ * edge cases (especially for structs larger than 32 bytes being passed
41
+ * by value). The code below attemps to match the logic used by the
42
+ * system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend
43
+ * fixes.
44
+ */
45
+
46
+ #include <ffi.h>
47
+ #include <ffi_common.h>
48
+
49
+ #include <stdlib.h>
50
+ #include <unistd.h>
51
+
52
+ void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *,
53
+ void (*fn) ());
54
+ void *ffi_prep_args (void *, extended_cif *);
55
+ void ffi_closure_OBSD (ffi_closure *);
56
+ void ffi_closure_struct_OBSD (ffi_closure *);
57
+ unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *,
58
+ char *);
59
+ void ffi_cacheflush_OBSD (unsigned int, unsigned int);
60
+
61
+ #define CIF_FLAGS_INT (1 << 0)
62
+ #define CIF_FLAGS_DINT (1 << 1)
63
+
64
+ /*
65
+ * Foreign Function Interface API
66
+ */
67
+
68
+ /* ffi_prep_args is called by the assembly routine once stack space has
69
+ been allocated for the function's arguments. */
70
+
71
+ void *
72
+ ffi_prep_args (void *stack, extended_cif *ecif)
73
+ {
74
+ unsigned int i;
75
+ void **p_argv;
76
+ char *argp, *stackp;
77
+ unsigned int *regp;
78
+ unsigned int regused;
79
+ ffi_type **p_arg;
80
+ void *struct_value_ptr;
81
+
82
+ regp = (unsigned int *)stack;
83
+ stackp = (char *)(regp + 8);
84
+ regused = 0;
85
+
86
+ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
87
+ && !ecif->cif->flags)
88
+ struct_value_ptr = ecif->rvalue;
89
+ else
90
+ struct_value_ptr = NULL;
91
+
92
+ p_argv = ecif->avalue;
93
+
94
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++)
95
+ {
96
+ size_t z;
97
+ unsigned short t, a;
98
+
99
+ z = (*p_arg)->size;
100
+ t = (*p_arg)->type;
101
+ a = (*p_arg)->alignment;
102
+
103
+ /*
104
+ * Figure out whether the argument can be passed through registers
105
+ * or on the stack.
106
+ * The rule is that registers can only receive simple types not larger
107
+ * than 64 bits, or structs the exact size of a register and aligned to
108
+ * the size of a register.
109
+ */
110
+ if (t == FFI_TYPE_STRUCT)
111
+ {
112
+ if (z == sizeof (int) && a == sizeof (int) && regused < 8)
113
+ argp = (char *)regp;
114
+ else
115
+ argp = stackp;
116
+ }
117
+ else
118
+ {
119
+ if (z > sizeof (int) && regused < 8 - 1)
120
+ {
121
+ /* align to an even register pair */
122
+ if (regused & 1)
123
+ {
124
+ regp++;
125
+ regused++;
126
+ }
127
+ }
128
+ if (regused < 8)
129
+ argp = (char *)regp;
130
+ else
131
+ argp = stackp;
132
+ }
133
+
134
+ /* Enforce proper stack alignment of 64-bit types */
135
+ if (argp == stackp && a > sizeof (int))
136
+ {
137
+ stackp = (char *) FFI_ALIGN(stackp, a);
138
+ argp = stackp;
139
+ }
140
+
141
+ switch (t)
142
+ {
143
+ case FFI_TYPE_SINT8:
144
+ *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
145
+ break;
146
+
147
+ case FFI_TYPE_UINT8:
148
+ *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
149
+ break;
150
+
151
+ case FFI_TYPE_SINT16:
152
+ *(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
153
+ break;
154
+
155
+ case FFI_TYPE_UINT16:
156
+ *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
157
+ break;
158
+
159
+ case FFI_TYPE_INT:
160
+ case FFI_TYPE_FLOAT:
161
+ case FFI_TYPE_UINT32:
162
+ case FFI_TYPE_SINT32:
163
+ case FFI_TYPE_POINTER:
164
+ *(unsigned int *) argp = *(unsigned int *) *p_argv;
165
+ break;
166
+
167
+ case FFI_TYPE_DOUBLE:
168
+ case FFI_TYPE_UINT64:
169
+ case FFI_TYPE_SINT64:
170
+ case FFI_TYPE_STRUCT:
171
+ memcpy (argp, *p_argv, z);
172
+ break;
173
+
174
+ default:
175
+ FFI_ASSERT (0);
176
+ }
177
+
178
+ /* Align if necessary. */
179
+ if ((sizeof (int) - 1) & z)
180
+ z = FFI_ALIGN(z, sizeof (int));
181
+
182
+ p_argv++;
183
+
184
+ /* Be careful, once all registers are filled, and about to continue
185
+ on stack, regp == stackp. Therefore the check for regused as well. */
186
+ if (argp == (char *)regp && regused < 8)
187
+ {
188
+ regp += z / sizeof (int);
189
+ regused += z / sizeof (int);
190
+ }
191
+ else
192
+ stackp += z;
193
+ }
194
+
195
+ return struct_value_ptr;
196
+ }
197
+
198
+ /* Perform machine dependent cif processing */
199
+ ffi_status
200
+ ffi_prep_cif_machdep (ffi_cif *cif)
201
+ {
202
+ /* Set the return type flag */
203
+ switch (cif->rtype->type)
204
+ {
205
+ case FFI_TYPE_VOID:
206
+ cif->flags = 0;
207
+ break;
208
+
209
+ case FFI_TYPE_STRUCT:
210
+ if (cif->rtype->size == sizeof (int) &&
211
+ cif->rtype->alignment == sizeof (int))
212
+ cif->flags = CIF_FLAGS_INT;
213
+ else
214
+ cif->flags = 0;
215
+ break;
216
+
217
+ case FFI_TYPE_DOUBLE:
218
+ case FFI_TYPE_SINT64:
219
+ case FFI_TYPE_UINT64:
220
+ cif->flags = CIF_FLAGS_DINT;
221
+ break;
222
+
223
+ default:
224
+ cif->flags = CIF_FLAGS_INT;
225
+ break;
226
+ }
227
+
228
+ return FFI_OK;
229
+ }
230
+
231
+ void
232
+ ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
233
+ {
234
+ extended_cif ecif;
235
+
236
+ ecif.cif = cif;
237
+ ecif.avalue = avalue;
238
+
239
+ /* If the return value is a struct and we don't have a return value
240
+ address then we need to make one. */
241
+
242
+ if (rvalue == NULL
243
+ && cif->rtype->type == FFI_TYPE_STRUCT
244
+ && (cif->rtype->size != sizeof (int)
245
+ || cif->rtype->alignment != sizeof (int)))
246
+ ecif.rvalue = alloca (cif->rtype->size);
247
+ else
248
+ ecif.rvalue = rvalue;
249
+
250
+ switch (cif->abi)
251
+ {
252
+ case FFI_OBSD:
253
+ ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn);
254
+ break;
255
+
256
+ default:
257
+ FFI_ASSERT (0);
258
+ break;
259
+ }
260
+ }
261
+
262
+ /*
263
+ * Closure API
264
+ */
265
+
266
+ static void
267
+ ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp,
268
+ char *stackp)
269
+ {
270
+ unsigned int i;
271
+ void **p_argv;
272
+ char *argp;
273
+ unsigned int regused;
274
+ ffi_type **p_arg;
275
+
276
+ regused = 0;
277
+
278
+ p_argv = avalue;
279
+
280
+ for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
281
+ {
282
+ size_t z;
283
+ unsigned short t, a;
284
+
285
+ z = (*p_arg)->size;
286
+ t = (*p_arg)->type;
287
+ a = (*p_arg)->alignment;
288
+
289
+ /*
290
+ * Figure out whether the argument has been passed through registers
291
+ * or on the stack.
292
+ * The rule is that registers can only receive simple types not larger
293
+ * than 64 bits, or structs the exact size of a register and aligned to
294
+ * the size of a register.
295
+ */
296
+ if (t == FFI_TYPE_STRUCT)
297
+ {
298
+ if (z == sizeof (int) && a == sizeof (int) && regused < 8)
299
+ argp = (char *)regp;
300
+ else
301
+ argp = stackp;
302
+ }
303
+ else
304
+ {
305
+ if (z > sizeof (int) && regused < 8 - 1)
306
+ {
307
+ /* align to an even register pair */
308
+ if (regused & 1)
309
+ {
310
+ regp++;
311
+ regused++;
312
+ }
313
+ }
314
+ if (regused < 8)
315
+ argp = (char *)regp;
316
+ else
317
+ argp = stackp;
318
+ }
319
+
320
+ /* Enforce proper stack alignment of 64-bit types */
321
+ if (argp == stackp && a > sizeof (int))
322
+ {
323
+ stackp = (char *) FFI_ALIGN(stackp, a);
324
+ argp = stackp;
325
+ }
326
+
327
+ if (z < sizeof (int) && t != FFI_TYPE_STRUCT)
328
+ *p_argv = (void *) (argp + sizeof (int) - z);
329
+ else
330
+ *p_argv = (void *) argp;
331
+
332
+ /* Align if necessary */
333
+ if ((sizeof (int) - 1) & z)
334
+ z = FFI_ALIGN(z, sizeof (int));
335
+
336
+ p_argv++;
337
+
338
+ /* Be careful, once all registers are exhausted, and about to fetch from
339
+ stack, regp == stackp. Therefore the check for regused as well. */
340
+ if (argp == (char *)regp && regused < 8)
341
+ {
342
+ regp += z / sizeof (int);
343
+ regused += z / sizeof (int);
344
+ }
345
+ else
346
+ stackp += z;
347
+ }
348
+ }
349
+
350
+ unsigned int
351
+ ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp,
352
+ char *stackp)
353
+ {
354
+ ffi_cif *cif;
355
+ void **arg_area;
356
+
357
+ cif = closure->cif;
358
+ arg_area = (void**) alloca (cif->nargs * sizeof (void *));
359
+
360
+ ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp);
361
+
362
+ (closure->fun) (cif, resp, arg_area, closure->user_data);
363
+
364
+ return cif->flags;
365
+ }
366
+
367
+ ffi_status
368
+ ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif,
369
+ void (*fun)(ffi_cif*,void*,void**,void*),
370
+ void *user_data, void *codeloc)
371
+ {
372
+ unsigned int *tramp = (unsigned int *) codeloc;
373
+ void *fn;
374
+
375
+ FFI_ASSERT (cif->abi == FFI_OBSD);
376
+
377
+ if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags)
378
+ fn = &ffi_closure_struct_OBSD;
379
+ else
380
+ fn = &ffi_closure_OBSD;
381
+
382
+ /* or.u %r10, %r0, %hi16(fn) */
383
+ tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16);
384
+ /* or.u %r13, %r0, %hi16(closure) */
385
+ tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16);
386
+ /* or %r10, %r10, %lo16(fn) */
387
+ tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff);
388
+ /* jmp.n %r10 */
389
+ tramp[3] = 0xf400c40a;
390
+ /* or %r13, %r13, %lo16(closure) */
391
+ tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff);
392
+
393
+ ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE);
394
+
395
+ closure->cif = cif;
396
+ closure->user_data = user_data;
397
+ closure->fun = fun;
398
+
399
+ return FFI_OK;
400
+ }