ffi 1.9.18 → 1.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +52 -0
  5. data/.yardopts +5 -0
  6. data/Gemfile +15 -0
  7. data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
  8. data/README.md +3 -4
  9. data/Rakefile +41 -5
  10. data/appveyor.yml +22 -0
  11. data/ext/ffi_c/AbstractMemory.c +6 -1
  12. data/ext/ffi_c/Call.c +1 -22
  13. data/ext/ffi_c/Call.h +0 -9
  14. data/ext/ffi_c/Closure.c +54 -0
  15. data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
  16. data/ext/ffi_c/Function.c +16 -25
  17. data/ext/ffi_c/Function.h +1 -2
  18. data/ext/ffi_c/FunctionInfo.c +0 -4
  19. data/ext/ffi_c/MethodHandle.c +33 -268
  20. data/ext/ffi_c/Platform.c +10 -2
  21. data/ext/ffi_c/extconf.rb +10 -5
  22. data/ext/ffi_c/ffi.c +2 -2
  23. data/ext/ffi_c/libffi/.appveyor.yml +48 -0
  24. data/ext/ffi_c/libffi/.gitignore +36 -0
  25. data/ext/ffi_c/libffi/.travis/install.sh +14 -0
  26. data/ext/ffi_c/libffi/.travis.yml +30 -0
  27. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  28. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  29. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  30. data/ext/ffi_c/libffi/LICENSE +1 -1
  31. data/ext/ffi_c/libffi/Makefile.am +169 -158
  32. data/ext/ffi_c/libffi/Makefile.in +927 -938
  33. data/ext/ffi_c/libffi/README +164 -52
  34. data/ext/ffi_c/libffi/acinclude.m4 +387 -0
  35. data/ext/ffi_c/libffi/autogen.sh +2 -0
  36. data/ext/ffi_c/libffi/config.guess +336 -371
  37. data/ext/ffi_c/libffi/config.sub +246 -115
  38. data/ext/ffi_c/libffi/configure +6976 -2189
  39. data/ext/ffi_c/libffi/configure.ac +148 -256
  40. data/ext/ffi_c/libffi/configure.host +277 -4
  41. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  42. data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
  43. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  44. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  45. data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
  46. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  47. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  48. data/ext/ffi_c/libffi/include/Makefile.in +188 -71
  49. data/ext/ffi_c/libffi/include/ffi.h.in +112 -50
  50. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  51. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  52. data/ext/ffi_c/libffi/install-sh +190 -202
  53. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  54. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  55. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  56. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  57. data/ext/ffi_c/libffi/libtool-version +1 -1
  58. data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
  59. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  60. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  61. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  62. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  63. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  64. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  67. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  68. data/ext/ffi_c/libffi/man/Makefile.in +141 -49
  69. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  70. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  71. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  72. data/ext/ffi_c/libffi/missing +150 -311
  73. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  74. data/ext/ffi_c/libffi/src/aarch64/ffi.c +964 -0
  75. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  76. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  77. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  78. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  79. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  80. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  81. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  82. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  83. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  84. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  85. data/ext/ffi_c/libffi/src/arm/ffi.c +608 -517
  86. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  87. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  88. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  89. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  90. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  91. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  92. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  93. data/ext/ffi_c/libffi/src/closures.c +366 -45
  94. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  95. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  96. data/ext/ffi_c/libffi/src/debug.c +6 -1
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  98. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  99. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  100. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  101. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  102. data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
  103. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  104. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  105. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  106. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  107. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  108. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  109. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  110. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  111. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  112. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  113. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  114. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  115. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  116. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  117. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  118. data/ext/ffi_c/libffi/src/mips/ffi.c +103 -28
  119. data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
  120. data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
  121. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  122. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  123. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  124. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  125. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  126. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  127. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  128. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  129. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  130. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  131. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  132. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  133. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  134. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  135. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  136. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  137. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  138. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +111 -30
  139. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  140. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  141. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  142. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +103 -44
  143. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  144. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  145. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  146. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  147. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  148. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  149. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  150. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  151. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  152. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  153. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  154. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  155. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  156. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  157. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  158. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  159. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  160. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  161. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  162. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  163. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  164. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  165. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  166. data/ext/ffi_c/libffi/src/types.c +43 -14
  167. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  168. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  169. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  170. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  171. data/ext/ffi_c/libffi/src/x86/ffi.c +591 -500
  172. data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -116
  173. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  174. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  175. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  176. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  177. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  178. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  179. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  180. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  181. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  182. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  183. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  184. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  185. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -73
  186. data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
  187. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -25
  188. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  293. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  345. data/ext/ffi_c/libffi.bsd.mk +11 -5
  346. data/ext/ffi_c/libffi.darwin.mk +14 -4
  347. data/ext/ffi_c/libffi.gnu.mk +3 -2
  348. data/ext/ffi_c/libffi.mk +10 -5
  349. data/ext/ffi_c/libffi.vc.mk +1 -1
  350. data/ext/ffi_c/libffi.vc64.mk +1 -1
  351. data/ffi.gemspec +16 -3
  352. data/lib/ffi/enum.rb +124 -0
  353. data/lib/ffi/library.rb +66 -14
  354. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  355. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  356. data/lib/ffi/platform.rb +7 -2
  357. data/lib/ffi/pointer.rb +1 -0
  358. data/lib/ffi/struct.rb +0 -2
  359. data/lib/ffi/version.rb +1 -2
  360. data/samples/getlogin.rb +8 -0
  361. data/samples/getpid.rb +8 -0
  362. data/samples/gettimeofday.rb +18 -0
  363. data/samples/hello.rb +7 -0
  364. data/samples/inotify.rb +60 -0
  365. data/samples/pty.rb +76 -0
  366. data/samples/qsort.rb +21 -0
  367. data/samples/sample_helper.rb +6 -0
  368. metadata +164 -115
  369. data/ext/ffi_c/ClosurePool.c +0 -283
  370. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  371. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  372. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  373. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  374. data/ext/ffi_c/libffi/compile +0 -143
  375. data/ext/ffi_c/libffi/depcomp +0 -630
  376. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  377. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  378. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  379. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  380. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  381. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  382. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  383. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  384. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  385. data/ext/ffi_c/libffi/mdate-sh +0 -201
  386. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  387. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  388. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  389. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  390. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  391. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  392. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  395. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  396. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  397. data/gen/Rakefile +0 -30
  398. data/libtest/Benchmark.c +0 -52
  399. data/libtest/BoolTest.c +0 -34
  400. data/libtest/BufferTest.c +0 -31
  401. data/libtest/ClosureTest.c +0 -205
  402. data/libtest/EnumTest.c +0 -51
  403. data/libtest/FunctionTest.c +0 -70
  404. data/libtest/GNUmakefile +0 -149
  405. data/libtest/GlobalVariable.c +0 -62
  406. data/libtest/LastErrorTest.c +0 -21
  407. data/libtest/NumberTest.c +0 -132
  408. data/libtest/PointerTest.c +0 -63
  409. data/libtest/ReferenceTest.c +0 -23
  410. data/libtest/StringTest.c +0 -34
  411. data/libtest/StructTest.c +0 -243
  412. data/libtest/UnionTest.c +0 -43
  413. data/libtest/VariadicTest.c +0 -99
  414. data/spec/ffi/async_callback_spec.rb +0 -35
  415. data/spec/ffi/bool_spec.rb +0 -32
  416. data/spec/ffi/buffer_spec.rb +0 -279
  417. data/spec/ffi/callback_spec.rb +0 -773
  418. data/spec/ffi/custom_param_type.rb +0 -37
  419. data/spec/ffi/custom_type_spec.rb +0 -74
  420. data/spec/ffi/dup_spec.rb +0 -52
  421. data/spec/ffi/enum_spec.rb +0 -423
  422. data/spec/ffi/errno_spec.rb +0 -20
  423. data/spec/ffi/ffi_spec.rb +0 -28
  424. data/spec/ffi/fixtures/Benchmark.c +0 -52
  425. data/spec/ffi/fixtures/BoolTest.c +0 -34
  426. data/spec/ffi/fixtures/BufferTest.c +0 -31
  427. data/spec/ffi/fixtures/ClosureTest.c +0 -205
  428. data/spec/ffi/fixtures/EnumTest.c +0 -51
  429. data/spec/ffi/fixtures/FunctionTest.c +0 -142
  430. data/spec/ffi/fixtures/GNUmakefile +0 -149
  431. data/spec/ffi/fixtures/GlobalVariable.c +0 -62
  432. data/spec/ffi/fixtures/LastErrorTest.c +0 -21
  433. data/spec/ffi/fixtures/NumberTest.c +0 -132
  434. data/spec/ffi/fixtures/PipeHelper.h +0 -21
  435. data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
  436. data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
  437. data/spec/ffi/fixtures/PointerTest.c +0 -63
  438. data/spec/ffi/fixtures/ReferenceTest.c +0 -23
  439. data/spec/ffi/fixtures/StringTest.c +0 -34
  440. data/spec/ffi/fixtures/StructTest.c +0 -243
  441. data/spec/ffi/fixtures/UnionTest.c +0 -43
  442. data/spec/ffi/fixtures/VariadicTest.c +0 -99
  443. data/spec/ffi/fixtures/classes.rb +0 -438
  444. data/spec/ffi/function_spec.rb +0 -97
  445. data/spec/ffi/io_spec.rb +0 -16
  446. data/spec/ffi/library_spec.rb +0 -286
  447. data/spec/ffi/long_double.rb +0 -30
  448. data/spec/ffi/managed_struct_spec.rb +0 -68
  449. data/spec/ffi/memorypointer_spec.rb +0 -78
  450. data/spec/ffi/number_spec.rb +0 -247
  451. data/spec/ffi/platform_spec.rb +0 -114
  452. data/spec/ffi/pointer_spec.rb +0 -285
  453. data/spec/ffi/rbx/attach_function_spec.rb +0 -34
  454. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
  455. data/spec/ffi/rbx/spec_helper.rb +0 -6
  456. data/spec/ffi/rbx/struct_spec.rb +0 -18
  457. data/spec/ffi/spec_helper.rb +0 -93
  458. data/spec/ffi/string_spec.rb +0 -118
  459. data/spec/ffi/strptr_spec.rb +0 -50
  460. data/spec/ffi/struct_by_ref_spec.rb +0 -43
  461. data/spec/ffi/struct_callback_spec.rb +0 -69
  462. data/spec/ffi/struct_initialize_spec.rb +0 -35
  463. data/spec/ffi/struct_packed_spec.rb +0 -50
  464. data/spec/ffi/struct_spec.rb +0 -886
  465. data/spec/ffi/typedef_spec.rb +0 -91
  466. data/spec/ffi/union_spec.rb +0 -67
  467. data/spec/ffi/variadic_spec.rb +0 -132
  468. data/spec/spec.opts +0 -4
@@ -0,0 +1,360 @@
1
+ /* -----------------------------------------------------------------------
2
+ tile.S - Copyright (c) 2011 Tilera Corp.
3
+
4
+ Tilera TILEPro and TILE-Gx 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
+ #define LIBFFI_ASM
28
+ #include <fficonfig.h>
29
+ #include <ffi.h>
30
+
31
+ /* Number of bytes in a register. */
32
+ #define REG_SIZE FFI_SIZEOF_ARG
33
+
34
+ /* Number of bytes in stack linkage area for backtracing.
35
+
36
+ A note about the ABI: on entry to a procedure, sp points to a stack
37
+ slot where it must spill the return address if it's not a leaf.
38
+ REG_SIZE bytes beyond that is a slot owned by the caller which
39
+ contains the sp value that the caller had when it was originally
40
+ entered (i.e. the caller's frame pointer). */
41
+ #define LINKAGE_SIZE (2 * REG_SIZE)
42
+
43
+ /* The first 10 registers are used to pass arguments and return values. */
44
+ #define NUM_ARG_REGS 10
45
+
46
+ #ifdef __tilegx__
47
+ #define SW st
48
+ #define LW ld
49
+ #define BGZT bgtzt
50
+ #else
51
+ #define SW sw
52
+ #define LW lw
53
+ #define BGZT bgzt
54
+ #endif
55
+
56
+
57
+ /* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS],
58
+ const int_reg_t *stack_args,
59
+ unsigned long stack_args_bytes,
60
+ void (*fnaddr)(void));
61
+
62
+ On entry, REG_ARGS contain the outgoing register values,
63
+ and STACK_ARGS contains STACK_ARG_BYTES of additional values
64
+ to be passed on the stack. If STACK_ARG_BYTES is zero, then
65
+ STACK_ARGS is ignored.
66
+
67
+ When the invoked function returns, the values of r0-r9 are
68
+ blindly stored back into REG_ARGS for the caller to examine. */
69
+
70
+ .section .text.ffi_call_tile, "ax", @progbits
71
+ .align 8
72
+ .globl ffi_call_tile
73
+ FFI_HIDDEN(ffi_call_tile)
74
+ ffi_call_tile:
75
+
76
+ /* Incoming arguments. */
77
+ #define REG_ARGS r0
78
+ #define INCOMING_STACK_ARGS r1
79
+ #define STACK_ARG_BYTES r2
80
+ #define ORIG_FNADDR r3
81
+
82
+ /* Temporary values. */
83
+ #define FRAME_SIZE r10
84
+ #define TMP r11
85
+ #define TMP2 r12
86
+ #define OUTGOING_STACK_ARGS r13
87
+ #define REG_ADDR_PTR r14
88
+ #define RETURN_REG_ADDR r15
89
+ #define FNADDR r16
90
+
91
+ .cfi_startproc
92
+ {
93
+ /* Save return address. */
94
+ SW sp, lr
95
+ .cfi_offset lr, 0
96
+ /* Prepare to spill incoming r52. */
97
+ addi TMP, sp, -REG_SIZE
98
+ /* Increase frame size to have room to spill r52 and REG_ARGS.
99
+ The +7 is to round up mod 8. */
100
+ addi FRAME_SIZE, STACK_ARG_BYTES, \
101
+ REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7
102
+ }
103
+ {
104
+ /* Round stack frame size to a multiple of 8 to satisfy ABI. */
105
+ andi FRAME_SIZE, FRAME_SIZE, -8
106
+ /* Compute where to spill REG_ARGS value. */
107
+ addi TMP2, sp, -(REG_SIZE * 2)
108
+ }
109
+ {
110
+ /* Spill incoming r52. */
111
+ SW TMP, r52
112
+ .cfi_offset r52, -REG_SIZE
113
+ /* Set up our frame pointer. */
114
+ move r52, sp
115
+ .cfi_def_cfa_register r52
116
+ /* Push stack frame. */
117
+ sub sp, sp, FRAME_SIZE
118
+ }
119
+ {
120
+ /* Prepare to set up stack linkage. */
121
+ addi TMP, sp, REG_SIZE
122
+ /* Prepare to memcpy stack args. */
123
+ addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE
124
+ /* Save REG_ARGS which we will need after we call the subroutine. */
125
+ SW TMP2, REG_ARGS
126
+ }
127
+ {
128
+ /* Set up linkage info to hold incoming stack pointer. */
129
+ SW TMP, r52
130
+ }
131
+ {
132
+ /* Skip stack args memcpy if we don't have any stack args (common). */
133
+ blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy
134
+ }
135
+
136
+ .Lmemcpy_stack_args:
137
+ {
138
+ /* Load incoming argument from stack_args. */
139
+ LW TMP, INCOMING_STACK_ARGS
140
+ addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE
141
+ }
142
+ {
143
+ /* Store stack argument into outgoing stack argument area. */
144
+ SW OUTGOING_STACK_ARGS, TMP
145
+ addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE
146
+ addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE
147
+ }
148
+ {
149
+ BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args
150
+ }
151
+ .Ldone_stack_args_memcpy:
152
+
153
+ {
154
+ /* Copy aside ORIG_FNADDR so we can overwrite its register. */
155
+ move FNADDR, ORIG_FNADDR
156
+ /* Prepare to load argument registers. */
157
+ addi REG_ADDR_PTR, r0, REG_SIZE
158
+ /* Load outgoing r0. */
159
+ LW r0, r0
160
+ }
161
+
162
+ /* Load up argument registers from the REG_ARGS array. */
163
+ #define LOAD_REG(REG, PTR) \
164
+ { \
165
+ LW REG, PTR ; \
166
+ addi PTR, PTR, REG_SIZE \
167
+ }
168
+
169
+ LOAD_REG(r1, REG_ADDR_PTR)
170
+ LOAD_REG(r2, REG_ADDR_PTR)
171
+ LOAD_REG(r3, REG_ADDR_PTR)
172
+ LOAD_REG(r4, REG_ADDR_PTR)
173
+ LOAD_REG(r5, REG_ADDR_PTR)
174
+ LOAD_REG(r6, REG_ADDR_PTR)
175
+ LOAD_REG(r7, REG_ADDR_PTR)
176
+ LOAD_REG(r8, REG_ADDR_PTR)
177
+ LOAD_REG(r9, REG_ADDR_PTR)
178
+
179
+ {
180
+ /* Call the subroutine. */
181
+ jalr FNADDR
182
+ }
183
+
184
+ {
185
+ /* Restore original lr. */
186
+ LW lr, r52
187
+ /* Prepare to recover ARGS, which we spilled earlier. */
188
+ addi TMP, r52, -(2 * REG_SIZE)
189
+ }
190
+ {
191
+ /* Restore ARGS, so we can fill it in with the return regs r0-r9. */
192
+ LW RETURN_REG_ADDR, TMP
193
+ /* Prepare to restore original r52. */
194
+ addi TMP, r52, -REG_SIZE
195
+ }
196
+
197
+ {
198
+ /* Pop stack frame. */
199
+ move sp, r52
200
+ /* Restore original r52. */
201
+ LW r52, TMP
202
+ }
203
+
204
+ #define STORE_REG(REG, PTR) \
205
+ { \
206
+ SW PTR, REG ; \
207
+ addi PTR, PTR, REG_SIZE \
208
+ }
209
+
210
+ /* Return all register values by reference. */
211
+ STORE_REG(r0, RETURN_REG_ADDR)
212
+ STORE_REG(r1, RETURN_REG_ADDR)
213
+ STORE_REG(r2, RETURN_REG_ADDR)
214
+ STORE_REG(r3, RETURN_REG_ADDR)
215
+ STORE_REG(r4, RETURN_REG_ADDR)
216
+ STORE_REG(r5, RETURN_REG_ADDR)
217
+ STORE_REG(r6, RETURN_REG_ADDR)
218
+ STORE_REG(r7, RETURN_REG_ADDR)
219
+ STORE_REG(r8, RETURN_REG_ADDR)
220
+ STORE_REG(r9, RETURN_REG_ADDR)
221
+
222
+ {
223
+ jrp lr
224
+ }
225
+
226
+ .cfi_endproc
227
+ .size ffi_call_tile, .-ffi_call_tile
228
+
229
+ /* ffi_closure_tile(...)
230
+
231
+ On entry, lr points to the closure plus 8 bytes, and r10
232
+ contains the actual return address.
233
+
234
+ This function simply dumps all register parameters into a stack array
235
+ and passes the closure, the registers array, and the stack arguments
236
+ to C code that does all of the actual closure processing. */
237
+
238
+ .section .text.ffi_closure_tile, "ax", @progbits
239
+ .align 8
240
+ .globl ffi_closure_tile
241
+ FFI_HIDDEN(ffi_closure_tile)
242
+
243
+ .cfi_startproc
244
+ /* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */
245
+ #define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8)
246
+ ffi_closure_tile:
247
+ {
248
+ #ifdef __tilegx__
249
+ st sp, lr
250
+ .cfi_offset lr, 0
251
+ #else
252
+ /* Save return address (in r10 due to closure stub wrapper). */
253
+ SW sp, r10
254
+ .cfi_return_column r10
255
+ .cfi_offset r10, 0
256
+ #endif
257
+ /* Compute address for stack frame linkage. */
258
+ addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE)
259
+ }
260
+ {
261
+ /* Save incoming stack pointer in linkage area. */
262
+ SW r10, sp
263
+ .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE)
264
+ /* Push a new stack frame. */
265
+ addli sp, sp, -CLOSURE_FRAME_SIZE
266
+ .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE
267
+ }
268
+
269
+ {
270
+ /* Create pointer to where to start spilling registers. */
271
+ addi r10, sp, LINKAGE_SIZE
272
+ }
273
+
274
+ /* Spill all the incoming registers. */
275
+ STORE_REG(r0, r10)
276
+ STORE_REG(r1, r10)
277
+ STORE_REG(r2, r10)
278
+ STORE_REG(r3, r10)
279
+ STORE_REG(r4, r10)
280
+ STORE_REG(r5, r10)
281
+ STORE_REG(r6, r10)
282
+ STORE_REG(r7, r10)
283
+ STORE_REG(r8, r10)
284
+ {
285
+ /* Save r9. */
286
+ SW r10, r9
287
+ #ifdef __tilegx__
288
+ /* Pointer to closure is passed in r11. */
289
+ move r0, r11
290
+ #else
291
+ /* Compute pointer to the closure object. Because the closure
292
+ starts with a "jal ffi_closure_tile", we can just take the
293
+ value of lr (a phony return address pointing into the closure)
294
+ and subtract 8. */
295
+ addi r0, lr, -8
296
+ #endif
297
+ /* Compute a pointer to the register arguments we just spilled. */
298
+ addi r1, sp, LINKAGE_SIZE
299
+ }
300
+ {
301
+ /* Compute a pointer to the extra stack arguments (if any). */
302
+ addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE
303
+ /* Call C code to deal with all of the grotty details. */
304
+ jal ffi_closure_tile_inner
305
+ }
306
+ {
307
+ addli r10, sp, CLOSURE_FRAME_SIZE
308
+ }
309
+ {
310
+ /* Restore the return address. */
311
+ LW lr, r10
312
+ /* Compute pointer to registers array. */
313
+ addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE)
314
+ }
315
+ /* Return all the register values, which C code may have set. */
316
+ LOAD_REG(r0, r10)
317
+ LOAD_REG(r1, r10)
318
+ LOAD_REG(r2, r10)
319
+ LOAD_REG(r3, r10)
320
+ LOAD_REG(r4, r10)
321
+ LOAD_REG(r5, r10)
322
+ LOAD_REG(r6, r10)
323
+ LOAD_REG(r7, r10)
324
+ LOAD_REG(r8, r10)
325
+ LOAD_REG(r9, r10)
326
+ {
327
+ /* Pop the frame. */
328
+ addli sp, sp, CLOSURE_FRAME_SIZE
329
+ jrp lr
330
+ }
331
+
332
+ .cfi_endproc
333
+ .size ffi_closure_tile, . - ffi_closure_tile
334
+
335
+
336
+ /* What follows are code template instructions that get copied to the
337
+ closure trampoline by ffi_prep_closure_loc. The zeroed operands
338
+ get replaced by their proper values at runtime. */
339
+
340
+ .section .text.ffi_template_tramp_tile, "ax", @progbits
341
+ .align 8
342
+ .globl ffi_template_tramp_tile
343
+ FFI_HIDDEN(ffi_template_tramp_tile)
344
+ ffi_template_tramp_tile:
345
+ #ifdef __tilegx__
346
+ {
347
+ moveli r11, 0 /* backpatched to address of containing closure. */
348
+ moveli r10, 0 /* backpatched to ffi_closure_tile. */
349
+ }
350
+ /* Note: the following bundle gets generated multiple times
351
+ depending on the pointer value (esp. useful for -m32 mode). */
352
+ { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 }
353
+ { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 }
354
+ #else
355
+ /* 'jal .' yields a PC-relative offset of zero so we can OR in the
356
+ right offset at runtime. */
357
+ { move r10, lr ; jal . /* ffi_closure_tile */ }
358
+ #endif
359
+
360
+ .size ffi_template_tramp_tile, . - ffi_template_tramp_tile
@@ -33,35 +33,56 @@
33
33
 
34
34
  /* Type definitions */
35
35
 
36
- #define FFI_TYPEDEF(name, type, id) \
36
+ #define FFI_TYPEDEF(name, type, id, maybe_const)\
37
37
  struct struct_align_##name { \
38
38
  char c; \
39
39
  type x; \
40
40
  }; \
41
- const ffi_type ffi_type_##name = { \
41
+ maybe_const ffi_type ffi_type_##name = { \
42
42
  sizeof(type), \
43
43
  offsetof(struct struct_align_##name, x), \
44
44
  id, NULL \
45
45
  }
46
46
 
47
+ #define FFI_COMPLEX_TYPEDEF(name, type, maybe_const) \
48
+ static ffi_type *ffi_elements_complex_##name [2] = { \
49
+ (ffi_type *)(&ffi_type_##name), NULL \
50
+ }; \
51
+ struct struct_align_complex_##name { \
52
+ char c; \
53
+ _Complex type x; \
54
+ }; \
55
+ maybe_const ffi_type ffi_type_complex_##name = { \
56
+ sizeof(_Complex type), \
57
+ offsetof(struct struct_align_complex_##name, x), \
58
+ FFI_TYPE_COMPLEX, \
59
+ (ffi_type **)ffi_elements_complex_##name \
60
+ }
61
+
47
62
  /* Size and alignment are fake here. They must not be 0. */
48
63
  const ffi_type ffi_type_void = {
49
64
  1, 1, FFI_TYPE_VOID, NULL
50
65
  };
51
66
 
52
- FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8);
53
- FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8);
54
- FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16);
55
- FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16);
56
- FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32);
57
- FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32);
58
- FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64);
59
- FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64);
67
+ FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8, const);
68
+ FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8, const);
69
+ FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16, const);
70
+ FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16, const);
71
+ FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32, const);
72
+ FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32, const);
73
+ FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64, const);
74
+ FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64, const);
60
75
 
61
- FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER);
76
+ FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER, const);
62
77
 
63
- FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT);
64
- FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE);
78
+ FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT, const);
79
+ FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE, const);
80
+
81
+ #if !defined HAVE_LONG_DOUBLE_VARIANT || defined __alpha__
82
+ #define FFI_LDBL_CONST const
83
+ #else
84
+ #define FFI_LDBL_CONST
85
+ #endif
65
86
 
66
87
  #ifdef __alpha__
67
88
  /* Even if we're not configured to default to 128-bit long double,
@@ -73,5 +94,13 @@ FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE);
73
94
  # endif
74
95
  const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL };
75
96
  #elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
76
- FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE);
97
+ FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST);
98
+ #endif
99
+
100
+ #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
101
+ FFI_COMPLEX_TYPEDEF(float, float, const);
102
+ FFI_COMPLEX_TYPEDEF(double, double, const);
103
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
104
+ FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST);
105
+ #endif
77
106
  #endif
@@ -0,0 +1,195 @@
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
+ * vax Foreign Function Interface
26
+ */
27
+
28
+ #define LIBFFI_ASM
29
+ #include <fficonfig.h>
30
+ #include <ffi.h>
31
+
32
+ .text
33
+
34
+ /*
35
+ * void * %r0
36
+ * ffi_call_elfbsd(extended_cif *ecif, 4(%ap)
37
+ * unsigned bytes, 8(%ap)
38
+ * unsigned flags, 12(%ap)
39
+ * void *rvalue, 16(%ap)
40
+ * void (*fn)()); 20(%ap)
41
+ */
42
+ .globl ffi_call_elfbsd
43
+ .type ffi_call_elfbsd,@function
44
+ .align 2
45
+ ffi_call_elfbsd:
46
+ .word 0x00c # save R2 and R3
47
+
48
+ # Allocate stack space for the args
49
+ subl2 8(%ap), %sp
50
+
51
+ # Call ffi_prep_args
52
+ pushl %sp
53
+ pushl 4(%ap)
54
+ calls $2, ffi_prep_args
55
+
56
+ # Get function pointer
57
+ movl 20(%ap), %r1
58
+
59
+ # Build a CALLS frame
60
+ ashl $-2, 8(%ap), %r0
61
+ pushl %r0 # argument stack usage
62
+ movl %sp, %r0 # future %ap
63
+ # saved registers
64
+ bbc $11, 0(%r1), 1f
65
+ pushl %r11
66
+ 1: bbc $10, 0(%r1), 1f
67
+ pushl %r10
68
+ 1: bbc $9, 0(%r1), 1f
69
+ pushl %r9
70
+ 1: bbc $8, 0(%r1), 1f
71
+ pushl %r8
72
+ 1: bbc $7, 0(%r1), 1f
73
+ pushl %r7
74
+ 1: bbc $6, 0(%r1), 1f
75
+ pushl %r6
76
+ 1: bbc $5, 0(%r1), 1f
77
+ pushl %r5
78
+ 1: bbc $4, 0(%r1), 1f
79
+ pushl %r4
80
+ 1: bbc $3, 0(%r1), 1f
81
+ pushl %r3
82
+ 1: bbc $2, 0(%r1), 1f
83
+ pushl %r2
84
+ 1:
85
+ pushal 9f
86
+ pushl %fp
87
+ pushl %ap
88
+ movl 16(%ap), %r3 # struct return address, if needed
89
+ movl %r0, %ap
90
+ movzwl 4(%fp), %r0 # previous PSW, without the saved registers mask
91
+ bisl2 $0x20000000, %r0 # calls frame
92
+ movzwl 0(%r1), %r2
93
+ bicw2 $0xf003, %r2 # only keep R11-R2
94
+ ashl $16, %r2, %r2
95
+ bisl2 %r2, %r0 # saved register mask of the called function
96
+ pushl %r0
97
+ pushl $0
98
+ movl %sp, %fp
99
+
100
+ # Invoke the function
101
+ pushal 2(%r1) # skip procedure entry mask
102
+ movl %r3, %r1
103
+ bicpsw $0x000f
104
+ rsb
105
+
106
+ 9:
107
+ # Copy return value if necessary
108
+ tstl 16(%ap)
109
+ jeql 9f
110
+ movl 16(%ap), %r2
111
+
112
+ bbc $0, 12(%ap), 1f # CIF_FLAGS_CHAR
113
+ movb %r0, 0(%r2)
114
+ brb 9f
115
+ 1:
116
+ bbc $1, 12(%ap), 1f # CIF_FLAGS_SHORT
117
+ movw %r0, 0(%r2)
118
+ brb 9f
119
+ 1:
120
+ bbc $2, 12(%ap), 1f # CIF_FLAGS_INT
121
+ movl %r0, 0(%r2)
122
+ brb 9f
123
+ 1:
124
+ bbc $3, 12(%ap), 1f # CIF_FLAGS_DINT
125
+ movq %r0, 0(%r2)
126
+ brb 9f
127
+ 1:
128
+ movl %r1, %r0 # might have been a struct
129
+ #brb 9f
130
+
131
+ 9:
132
+ ret
133
+
134
+ /*
135
+ * ffi_closure_elfbsd(void);
136
+ * invoked with %r0: ffi_closure *closure
137
+ */
138
+ .globl ffi_closure_elfbsd
139
+ .type ffi_closure_elfbsd, @function
140
+ .align 2
141
+ ffi_closure_elfbsd:
142
+ .word 0
143
+
144
+ # Allocate room on stack for return value
145
+ subl2 $8, %sp
146
+
147
+ # Invoke the closure function
148
+ pushal 4(%ap) # calling stack
149
+ pushal 4(%sp) # return value
150
+ pushl %r0 # closure
151
+ calls $3, ffi_closure_elfbsd_inner
152
+
153
+ # Copy return value if necessary
154
+ bitb $1, %r0 # CIF_FLAGS_CHAR
155
+ beql 1f
156
+ movb 0(%sp), %r0
157
+ brb 9f
158
+ 1:
159
+ bitb $2, %r0 # CIF_FLAGS_SHORT
160
+ beql 1f
161
+ movw 0(%sp), %r0
162
+ brb 9f
163
+ 1:
164
+ bitb $4, %r0 # CIF_FLAGS_INT
165
+ beql 1f
166
+ movl 0(%sp), %r0
167
+ brb 9f
168
+ 1:
169
+ bitb $8, %r0 # CIF_FLAGS_DINT
170
+ beql 1f
171
+ movq 0(%sp), %r0
172
+ #brb 9f
173
+ 1:
174
+
175
+ 9:
176
+ ret
177
+
178
+ /*
179
+ * ffi_closure_struct_elfbsd(void);
180
+ * invoked with %r0: ffi_closure *closure
181
+ * %r1: struct return address
182
+ */
183
+ .globl ffi_closure_struct_elfbsd
184
+ .type ffi_closure_struct_elfbsd, @function
185
+ .align 2
186
+ ffi_closure_struct_elfbsd:
187
+ .word 0
188
+
189
+ # Invoke the closure function
190
+ pushal 4(%ap) # calling stack
191
+ pushl %r1 # return value
192
+ pushl %r0 # closure
193
+ calls $3, ffi_closure_elfbsd_inner
194
+
195
+ ret