ffi 1.9.18-x86-mingw32 → 1.9.21-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (384) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -2
  3. data/Rakefile +14 -4
  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/Makefile.in +923 -938
  17. data/ext/ffi_c/libffi/README +164 -52
  18. data/ext/ffi_c/libffi/acinclude.m4 +381 -0
  19. data/ext/ffi_c/libffi/aclocal.m4 +645 -384
  20. data/ext/ffi_c/libffi/autogen.sh +2 -0
  21. data/ext/ffi_c/libffi/autom4te.cache/output.0 +21972 -0
  22. data/ext/ffi_c/libffi/autom4te.cache/output.1 +21972 -0
  23. data/ext/ffi_c/libffi/autom4te.cache/output.2 +21972 -0
  24. data/ext/ffi_c/libffi/autom4te.cache/output.3 +21972 -0
  25. data/ext/ffi_c/libffi/autom4te.cache/requests +331 -0
  26. data/ext/ffi_c/libffi/autom4te.cache/traces.0 +4010 -0
  27. data/ext/ffi_c/libffi/autom4te.cache/traces.1 +1005 -0
  28. data/ext/ffi_c/libffi/autom4te.cache/traces.2 +4010 -0
  29. data/ext/ffi_c/libffi/autom4te.cache/traces.3 +4010 -0
  30. data/ext/ffi_c/libffi/compile +218 -14
  31. data/ext/ffi_c/libffi/config.guess +329 -368
  32. data/ext/ffi_c/libffi/config.sub +232 -112
  33. data/ext/ffi_c/libffi/configure +6970 -2189
  34. data/ext/ffi_c/libffi/configure.ac +148 -256
  35. data/ext/ffi_c/libffi/configure.host +265 -4
  36. data/ext/ffi_c/libffi/depcomp +346 -185
  37. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  38. data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
  39. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  40. data/ext/ffi_c/libffi/{mdate-sh → doc/mdate-sh} +40 -13
  41. data/ext/ffi_c/libffi/{texinfo.tex → doc/texinfo.tex} +3990 -1121
  42. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  43. data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
  44. data/ext/ffi_c/libffi/fficonfig.h.in~ +210 -0
  45. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +207 -0
  46. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  47. data/ext/ffi_c/libffi/include/Makefile.in +188 -71
  48. data/ext/ffi_c/libffi/include/ffi.h.in +107 -50
  49. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  50. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  51. data/ext/ffi_c/libffi/install-sh +190 -202
  52. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  53. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  54. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +637 -0
  55. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  56. data/ext/ffi_c/libffi/libtool-version +1 -1
  57. data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
  58. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  59. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  60. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  61. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  62. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  63. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  64. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  65. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  66. data/ext/ffi_c/libffi/m4/libtool.m4 +1691 -1135
  67. data/ext/ffi_c/libffi/m4/ltoptions.m4 +104 -36
  68. data/ext/ffi_c/libffi/m4/ltsugar.m4 +4 -3
  69. data/ext/ffi_c/libffi/m4/ltversion.m4 +6 -6
  70. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +4 -3
  71. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  72. data/ext/ffi_c/libffi/man/Makefile.in +141 -49
  73. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  74. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  75. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  76. data/ext/ffi_c/libffi/missing +150 -311
  77. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  78. data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
  79. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  80. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  81. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  82. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  83. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  84. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  85. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  86. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  87. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  88. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  89. data/ext/ffi_c/libffi/src/arm/ffi.c +597 -517
  90. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  91. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  92. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  93. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  94. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  95. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  96. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  97. data/ext/ffi_c/libffi/src/closures.c +319 -44
  98. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  99. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  100. data/ext/ffi_c/libffi/src/debug.c +6 -1
  101. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  102. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  103. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  104. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  105. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  106. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  107. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  108. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  109. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  110. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  111. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  112. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  113. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  114. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  115. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  116. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  117. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  118. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  119. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  120. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  121. data/ext/ffi_c/libffi/src/mips/ffi.c +95 -28
  122. data/ext/ffi_c/libffi/src/mips/ffitarget.h +9 -2
  123. data/ext/ffi_c/libffi/src/mips/n32.S +126 -56
  124. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  125. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  126. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  127. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  128. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  129. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  130. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  131. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  132. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  133. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  134. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  135. data/ext/ffi_c/libffi/src/powerpc/aix.S +6 -6
  136. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +3 -1
  137. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  138. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  139. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  140. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  141. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +25 -25
  142. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  143. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  144. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  145. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +100 -44
  146. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  147. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  148. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  149. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  150. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  151. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  152. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  153. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  154. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  155. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  156. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  157. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  158. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  159. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  160. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  161. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  162. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  163. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  164. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  165. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  166. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  167. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  168. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  169. data/ext/ffi_c/libffi/src/types.c +43 -14
  170. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  171. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  172. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  173. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  174. data/ext/ffi_c/libffi/src/x86/ffi.c +589 -500
  175. data/ext/ffi_c/libffi/src/x86/ffi64.c +338 -116
  176. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  177. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  178. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  179. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  180. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  181. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  182. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  183. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  184. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  185. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  186. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  187. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  188. data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -73
  189. data/ext/ffi_c/libffi/testsuite/Makefile.in +218 -111
  190. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +120 -25
  191. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  294. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  295. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  316. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  347. data/ffi.gemspec +2 -2
  348. data/lib/2.0/ffi_c.so +0 -0
  349. data/lib/2.1/ffi_c.so +0 -0
  350. data/lib/2.2/ffi_c.so +0 -0
  351. data/lib/2.3/ffi_c.so +0 -0
  352. data/lib/2.4/ffi_c.so +0 -0
  353. data/lib/2.5/ffi_c.so +0 -0
  354. data/lib/ffi/enum.rb +124 -0
  355. data/lib/ffi/library.rb +65 -13
  356. data/lib/ffi/platform.rb +7 -2
  357. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  358. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  359. data/lib/ffi/pointer.rb +1 -0
  360. data/lib/ffi/struct.rb +0 -2
  361. data/lib/ffi/version.rb +1 -1
  362. data/spec/ffi/bitmask_spec.rb +575 -0
  363. data/spec/ffi/embed-test/ext/Makefile +242 -0
  364. data/spec/ffi/fixtures/BitmaskTest.c +51 -0
  365. data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
  366. data/spec/ffi/struct_spec.rb +0 -4
  367. metadata +158 -32
  368. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  369. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  370. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  371. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  372. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  373. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  374. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  375. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  376. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  377. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  378. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  379. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  380. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  381. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  382. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  383. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  384. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
@@ -1,5 +1,6 @@
1
1
  /* -----------------------------------------------------------------*-C-*-
2
- ffitarget.h - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
2
+ ffitarget.h - Copyright (c) 2012 Anthony Green
3
+ Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
3
4
  Target configuration macros for AVR32.
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;
@@ -0,0 +1,196 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
3
+ Paulo Pizarro <paulo.pizarro@gmail.com>
4
+
5
+ Blackfin Foreign Function Interface
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ ``Software''), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included
16
+ in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
26
+ ----------------------------------------------------------------------- */
27
+ #include <ffi.h>
28
+ #include <ffi_common.h>
29
+
30
+ #include <stdlib.h>
31
+ #include <stdio.h>
32
+
33
+ /* Maximum number of GPRs available for argument passing. */
34
+ #define MAX_GPRARGS 3
35
+
36
+ /*
37
+ * Return types
38
+ */
39
+ #define FFIBFIN_RET_VOID 0
40
+ #define FFIBFIN_RET_BYTE 1
41
+ #define FFIBFIN_RET_HALFWORD 2
42
+ #define FFIBFIN_RET_INT64 3
43
+ #define FFIBFIN_RET_INT32 4
44
+
45
+ /*====================================================================*/
46
+ /* PROTOTYPE *
47
+ /*====================================================================*/
48
+ void ffi_prep_args(unsigned char *, extended_cif *);
49
+
50
+ /*====================================================================*/
51
+ /* Externals */
52
+ /* (Assembly) */
53
+ /*====================================================================*/
54
+
55
+ extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void));
56
+
57
+ /*====================================================================*/
58
+ /* Implementation */
59
+ /* */
60
+ /*====================================================================*/
61
+
62
+
63
+ /*
64
+ * This function calculates the return type (size) based on type.
65
+ */
66
+
67
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
68
+ {
69
+ /* --------------------------------------*
70
+ * Return handling *
71
+ * --------------------------------------*/
72
+ switch (cif->rtype->type) {
73
+ case FFI_TYPE_VOID:
74
+ cif->flags = FFIBFIN_RET_VOID;
75
+ break;
76
+ case FFI_TYPE_UINT16:
77
+ case FFI_TYPE_SINT16:
78
+ cif->flags = FFIBFIN_RET_HALFWORD;
79
+ break;
80
+ case FFI_TYPE_UINT8:
81
+ cif->flags = FFIBFIN_RET_BYTE;
82
+ break;
83
+ case FFI_TYPE_INT:
84
+ case FFI_TYPE_UINT32:
85
+ case FFI_TYPE_SINT32:
86
+ case FFI_TYPE_FLOAT:
87
+ case FFI_TYPE_POINTER:
88
+ case FFI_TYPE_SINT8:
89
+ cif->flags = FFIBFIN_RET_INT32;
90
+ break;
91
+ case FFI_TYPE_SINT64:
92
+ case FFI_TYPE_UINT64:
93
+ case FFI_TYPE_DOUBLE:
94
+ cif->flags = FFIBFIN_RET_INT64;
95
+ break;
96
+ case FFI_TYPE_STRUCT:
97
+ if (cif->rtype->size <= 4){
98
+ cif->flags = FFIBFIN_RET_INT32;
99
+ }else if (cif->rtype->size == 8){
100
+ cif->flags = FFIBFIN_RET_INT64;
101
+ }else{
102
+ //it will return via a hidden pointer in P0
103
+ cif->flags = FFIBFIN_RET_VOID;
104
+ }
105
+ break;
106
+ default:
107
+ FFI_ASSERT(0);
108
+ break;
109
+ }
110
+ return FFI_OK;
111
+ }
112
+
113
+ /*
114
+ * This will prepare the arguments and will call the assembly routine
115
+ * cif = the call interface
116
+ * fn = the function to be called
117
+ * rvalue = the return value
118
+ * avalue = the arguments
119
+ */
120
+ void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
121
+ {
122
+ int ret_type = cif->flags;
123
+ extended_cif ecif;
124
+ ecif.cif = cif;
125
+ ecif.avalue = avalue;
126
+ ecif.rvalue = rvalue;
127
+
128
+ switch (cif->abi) {
129
+ case FFI_SYSV:
130
+ ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn);
131
+ break;
132
+ default:
133
+ FFI_ASSERT(0);
134
+ break;
135
+ }
136
+ }
137
+
138
+
139
+ /*
140
+ * This function prepares the parameters (copies them from the ecif to the stack)
141
+ * to call the function (ffi_prep_args is called by the assembly routine in file
142
+ * sysv.S, which also calls the actual function)
143
+ */
144
+ void ffi_prep_args(unsigned char *stack, extended_cif *ecif)
145
+ {
146
+ register unsigned int i = 0;
147
+ void **p_argv;
148
+ unsigned char *argp;
149
+ ffi_type **p_arg;
150
+ argp = stack;
151
+ p_argv = ecif->avalue;
152
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
153
+ (i != 0);
154
+ i--, p_arg++) {
155
+ size_t z;
156
+ z = (*p_arg)->size;
157
+ if (z < sizeof(int)) {
158
+ z = sizeof(int);
159
+ switch ((*p_arg)->type) {
160
+ case FFI_TYPE_SINT8: {
161
+ signed char v = *(SINT8 *)(* p_argv);
162
+ signed int t = v;
163
+ *(signed int *) argp = t;
164
+ }
165
+ break;
166
+ case FFI_TYPE_UINT8: {
167
+ unsigned char v = *(UINT8 *)(* p_argv);
168
+ unsigned int t = v;
169
+ *(unsigned int *) argp = t;
170
+ }
171
+ break;
172
+ case FFI_TYPE_SINT16:
173
+ *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv);
174
+ break;
175
+ case FFI_TYPE_UINT16:
176
+ *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv);
177
+ break;
178
+ case FFI_TYPE_STRUCT:
179
+ memcpy(argp, *p_argv, (*p_arg)->size);
180
+ break;
181
+ default:
182
+ FFI_ASSERT(0);
183
+ break;
184
+ }
185
+ } else if (z == sizeof(int)) {
186
+ *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv);
187
+ } else {
188
+ memcpy(argp, *p_argv, z);
189
+ }
190
+ p_argv++;
191
+ argp += z;
192
+ }
193
+ }
194
+
195
+
196
+
@@ -0,0 +1,43 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
3
+
4
+ Blackfin 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
+ #ifndef LIBFFI_TARGET_H
28
+ #define LIBFFI_TARGET_H
29
+
30
+ #ifndef LIBFFI_ASM
31
+ typedef unsigned long ffi_arg;
32
+ typedef signed long ffi_sarg;
33
+
34
+ typedef enum ffi_abi {
35
+ FFI_FIRST_ABI = 0,
36
+ FFI_SYSV,
37
+ FFI_LAST_ABI,
38
+ FFI_DEFAULT_ABI = FFI_SYSV
39
+ } ffi_abi;
40
+ #endif
41
+
42
+ #endif
43
+
@@ -0,0 +1,179 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
3
+ Paulo Pizarro <paulo.pizarro@gmail.com>
4
+
5
+ Blackfin Foreign Function Interface
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ ``Software''), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included
16
+ in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25
+ DEALINGS IN THE SOFTWARE.
26
+ ----------------------------------------------------------------------- */
27
+
28
+ #define LIBFFI_ASM
29
+ #include <fficonfig.h>
30
+ #include <ffi.h>
31
+
32
+ .text
33
+ .align 4
34
+
35
+ /*
36
+ There is a "feature" in the bfin toolchain that it puts a _ before function names
37
+ that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV
38
+ */
39
+ .global _ffi_call_SYSV;
40
+ .type _ffi_call_SYSV, STT_FUNC;
41
+ .func ffi_call_SYSV
42
+
43
+ /*
44
+ cif->bytes = R0 (fp+8)
45
+ &ecif = R1 (fp+12)
46
+ ffi_prep_args = R2 (fp+16)
47
+ ret_type = stack (fp+20)
48
+ ecif.rvalue = stack (fp+24)
49
+ fn = stack (fp+28)
50
+ got (fp+32)
51
+
52
+ There is room for improvement here (we can use temporary registers
53
+ instead of saving the values in the memory)
54
+ REGS:
55
+ P5 => Stack pointer (function arguments)
56
+ R5 => cif->bytes
57
+ R4 => ret->type
58
+
59
+ FP-20 = P3
60
+ FP-16 = SP (parameters area)
61
+ FP-12 = SP (temp)
62
+ FP-08 = function return part 1 [R0]
63
+ FP-04 = function return part 2 [R1]
64
+ */
65
+
66
+ _ffi_call_SYSV:
67
+ .prologue:
68
+ LINK 20;
69
+ [FP-20] = P3;
70
+ [FP+8] = R0;
71
+ [FP+12] = R1;
72
+ [FP+16] = R2;
73
+
74
+ .allocate_stack:
75
+ //alocate cif->bytes into the stack
76
+ R1 = [FP+8];
77
+ R0 = SP;
78
+ R0 = R0 - R1;
79
+ R1 = 4;
80
+ R0 = R0 - R1;
81
+ [FP-12] = SP;
82
+ SP = R0;
83
+ [FP-16] = SP;
84
+
85
+ .call_prep_args:
86
+ //get the addr of prep_args
87
+ P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4];
88
+ P1 = [P0];
89
+ P3 = [P0+4];
90
+ R0 = [FP-16];//SP (parameter area)
91
+ R1 = [FP+12];//ecif
92
+ call (P1);
93
+
94
+ .call_user_function:
95
+ //ajust SP so as to allow the user function access the parameters on the stack
96
+ SP = [FP-16]; //point to function parameters
97
+ R0 = [SP];
98
+ R1 = [SP+4];
99
+ R2 = [SP+8];
100
+ //load user function address
101
+ P0 = FP;
102
+ P0 +=28;
103
+ P1 = [P0];
104
+ P1 = [P1];
105
+ P3 = [P0+4];
106
+ /*
107
+ For functions returning aggregate values (struct) occupying more than 8 bytes,
108
+ the caller allocates the return value object on the stack and the address
109
+ of this object is passed to the callee as a hidden argument in register P0.
110
+ */
111
+ P0 = [FP+24];
112
+
113
+ call (P1);
114
+ SP = [FP-12];
115
+ .compute_return:
116
+ P2 = [FP-20];
117
+ [FP-8] = R0;
118
+ [FP-4] = R1;
119
+
120
+ R0 = [FP+20];
121
+ R1 = R0 << 2;
122
+
123
+ R0 = [P2+.rettable@GOT17M4];
124
+ R0 = R1 + R0;
125
+ P2 = R0;
126
+ R1 = [P2];
127
+
128
+ P2 = [FP+-20];
129
+ R0 = [P2+.rettable@GOT17M4];
130
+ R0 = R1 + R0;
131
+ P2 = R0;
132
+ R0 = [FP-8];
133
+ R1 = [FP-4];
134
+ jump (P2);
135
+
136
+ /*
137
+ #define FFIBFIN_RET_VOID 0
138
+ #define FFIBFIN_RET_BYTE 1
139
+ #define FFIBFIN_RET_HALFWORD 2
140
+ #define FFIBFIN_RET_INT64 3
141
+ #define FFIBFIN_RET_INT32 4
142
+ */
143
+ .align 4
144
+ .align 4
145
+ .rettable:
146
+ .dd .epilogue - .rettable
147
+ .dd .rbyte - .rettable;
148
+ .dd .rhalfword - .rettable;
149
+ .dd .rint64 - .rettable;
150
+ .dd .rint32 - .rettable;
151
+
152
+ .rbyte:
153
+ P0 = [FP+24];
154
+ R0 = R0.B (Z);
155
+ [P0] = R0;
156
+ JUMP .epilogue
157
+ .rhalfword:
158
+ P0 = [FP+24];
159
+ R0 = R0.L;
160
+ [P0] = R0;
161
+ JUMP .epilogue
162
+ .rint64:
163
+ P0 = [FP+24];// &rvalue
164
+ [P0] = R0;
165
+ [P0+4] = R1;
166
+ JUMP .epilogue
167
+ .rint32:
168
+ P0 = [FP+24];
169
+ [P0] = R0;
170
+ .epilogue:
171
+ R0 = [FP+8];
172
+ R1 = [FP+12];
173
+ R2 = [FP+16];
174
+ P3 = [FP-20];
175
+ UNLINK;
176
+ RTS;
177
+
178
+ .size _ffi_call_SYSV,.-_ffi_call_SYSV;
179
+ .endfunc
@@ -30,11 +30,12 @@
30
30
  #define _GNU_SOURCE 1
31
31
  #endif
32
32
 
33
+ #include <fficonfig.h>
33
34
  #include <ffi.h>
34
35
  #include <ffi_common.h>
35
36
 
36
37
  #if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
37
- # if __gnu_linux__
38
+ # if __linux__ && !defined(__ANDROID__)
38
39
  /* This macro indicates it may be forbidden to map anonymous memory
39
40
  with both write and execute permission. Code compiled when this
40
41
  option is defined will attempt to map such pages once, but if it
@@ -64,11 +65,248 @@
64
65
 
65
66
  #if FFI_CLOSURES
66
67
 
67
- # if FFI_EXEC_TRAMPOLINE_TABLE
68
+ #if FFI_EXEC_TRAMPOLINE_TABLE
69
+
70
+ #ifdef __MACH__
71
+
72
+ #include <mach/mach.h>
73
+ #include <pthread.h>
74
+ #include <stdio.h>
75
+ #include <stdlib.h>
76
+
77
+ extern void *ffi_closure_trampoline_table_page;
78
+
79
+ typedef struct ffi_trampoline_table ffi_trampoline_table;
80
+ typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
81
+
82
+ struct ffi_trampoline_table
83
+ {
84
+ /* contiguous writable and executable pages */
85
+ vm_address_t config_page;
86
+ vm_address_t trampoline_page;
87
+
88
+ /* free list tracking */
89
+ uint16_t free_count;
90
+ ffi_trampoline_table_entry *free_list;
91
+ ffi_trampoline_table_entry *free_list_pool;
92
+
93
+ ffi_trampoline_table *prev;
94
+ ffi_trampoline_table *next;
95
+ };
96
+
97
+ struct ffi_trampoline_table_entry
98
+ {
99
+ void *(*trampoline) ();
100
+ ffi_trampoline_table_entry *next;
101
+ };
102
+
103
+ /* Total number of trampolines that fit in one trampoline table */
104
+ #define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE)
105
+
106
+ static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
107
+ static ffi_trampoline_table *ffi_trampoline_tables = NULL;
108
+
109
+ static ffi_trampoline_table *
110
+ ffi_trampoline_table_alloc ()
111
+ {
112
+ ffi_trampoline_table *table = NULL;
113
+
114
+ /* Loop until we can allocate two contiguous pages */
115
+ while (table == NULL)
116
+ {
117
+ vm_address_t config_page = 0x0;
118
+ kern_return_t kt;
119
+
120
+ /* Try to allocate two pages */
121
+ kt =
122
+ vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2,
123
+ VM_FLAGS_ANYWHERE);
124
+ if (kt != KERN_SUCCESS)
125
+ {
126
+ fprintf (stderr, "vm_allocate() failure: %d at %s:%d\n", kt,
127
+ __FILE__, __LINE__);
128
+ break;
129
+ }
130
+
131
+ /* Now drop the second half of the allocation to make room for the trampoline table */
132
+ vm_address_t trampoline_page = config_page + PAGE_MAX_SIZE;
133
+ kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_MAX_SIZE);
134
+ if (kt != KERN_SUCCESS)
135
+ {
136
+ fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
137
+ __FILE__, __LINE__);
138
+ break;
139
+ }
140
+
141
+ /* Remap the trampoline table to directly follow the config page */
142
+ vm_prot_t cur_prot;
143
+ vm_prot_t max_prot;
144
+
145
+ vm_address_t trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
146
+ #ifdef __arm__
147
+ /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */
148
+ trampoline_page_template &= ~1UL;
149
+ #endif
150
+
151
+ kt =
152
+ vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, FALSE,
153
+ mach_task_self (), trampoline_page_template, FALSE,
154
+ &cur_prot, &max_prot, VM_INHERIT_SHARE);
155
+
156
+ /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */
157
+ if (kt != KERN_SUCCESS)
158
+ {
159
+ /* Log unexpected failures */
160
+ if (kt != KERN_NO_SPACE)
161
+ {
162
+ fprintf (stderr, "vm_remap() failure: %d at %s:%d\n", kt,
163
+ __FILE__, __LINE__);
164
+ }
165
+
166
+ vm_deallocate (mach_task_self (), config_page, PAGE_SIZE);
167
+ continue;
168
+ }
169
+
170
+ /* We have valid trampoline and config pages */
171
+ table = calloc (1, sizeof (ffi_trampoline_table));
172
+ table->free_count = FFI_TRAMPOLINE_COUNT;
173
+ table->config_page = config_page;
174
+ table->trampoline_page = trampoline_page;
175
+
176
+ /* Create and initialize the free list */
177
+ table->free_list_pool =
178
+ calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry));
179
+
180
+ uint16_t i;
181
+ for (i = 0; i < table->free_count; i++)
182
+ {
183
+ ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
184
+ entry->trampoline =
185
+ (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
186
+
187
+ if (i < table->free_count - 1)
188
+ entry->next = &table->free_list_pool[i + 1];
189
+ }
190
+
191
+ table->free_list = table->free_list_pool;
192
+ }
193
+
194
+ return table;
195
+ }
196
+
197
+ void *
198
+ ffi_closure_alloc (size_t size, void **code)
199
+ {
200
+ /* Create the closure */
201
+ ffi_closure *closure = malloc (size);
202
+ if (closure == NULL)
203
+ return NULL;
204
+
205
+ pthread_mutex_lock (&ffi_trampoline_lock);
206
+
207
+ /* Check for an active trampoline table with available entries. */
208
+ ffi_trampoline_table *table = ffi_trampoline_tables;
209
+ if (table == NULL || table->free_list == NULL)
210
+ {
211
+ table = ffi_trampoline_table_alloc ();
212
+ if (table == NULL)
213
+ {
214
+ pthread_mutex_unlock (&ffi_trampoline_lock);
215
+ free (closure);
216
+ return NULL;
217
+ }
218
+
219
+ /* Insert the new table at the top of the list */
220
+ table->next = ffi_trampoline_tables;
221
+ if (table->next != NULL)
222
+ table->next->prev = table;
223
+
224
+ ffi_trampoline_tables = table;
225
+ }
226
+
227
+ /* Claim the free entry */
228
+ ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
229
+ ffi_trampoline_tables->free_list = entry->next;
230
+ ffi_trampoline_tables->free_count--;
231
+ entry->next = NULL;
232
+
233
+ pthread_mutex_unlock (&ffi_trampoline_lock);
234
+
235
+ /* Initialize the return values */
236
+ *code = entry->trampoline;
237
+ closure->trampoline_table = table;
238
+ closure->trampoline_table_entry = entry;
239
+
240
+ return closure;
241
+ }
242
+
243
+ void
244
+ ffi_closure_free (void *ptr)
245
+ {
246
+ ffi_closure *closure = ptr;
247
+
248
+ pthread_mutex_lock (&ffi_trampoline_lock);
249
+
250
+ /* Fetch the table and entry references */
251
+ ffi_trampoline_table *table = closure->trampoline_table;
252
+ ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
253
+
254
+ /* Return the entry to the free list */
255
+ entry->next = table->free_list;
256
+ table->free_list = entry;
257
+ table->free_count++;
258
+
259
+ /* If all trampolines within this table are free, and at least one other table exists, deallocate
260
+ * the table */
261
+ if (table->free_count == FFI_TRAMPOLINE_COUNT
262
+ && ffi_trampoline_tables != table)
263
+ {
264
+ /* Remove from the list */
265
+ if (table->prev != NULL)
266
+ table->prev->next = table->next;
267
+
268
+ if (table->next != NULL)
269
+ table->next->prev = table->prev;
270
+
271
+ /* Deallocate pages */
272
+ kern_return_t kt;
273
+ kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE);
274
+ if (kt != KERN_SUCCESS)
275
+ fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
276
+ __FILE__, __LINE__);
277
+
278
+ kt =
279
+ vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE);
280
+ if (kt != KERN_SUCCESS)
281
+ fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
282
+ __FILE__, __LINE__);
283
+
284
+ /* Deallocate free list */
285
+ free (table->free_list_pool);
286
+ free (table);
287
+ }
288
+ else if (ffi_trampoline_tables != table)
289
+ {
290
+ /* Otherwise, bump this table to the top of the list */
291
+ table->prev = NULL;
292
+ table->next = ffi_trampoline_tables;
293
+ if (ffi_trampoline_tables != NULL)
294
+ ffi_trampoline_tables->prev = table;
295
+
296
+ ffi_trampoline_tables = table;
297
+ }
298
+
299
+ pthread_mutex_unlock (&ffi_trampoline_lock);
300
+
301
+ /* Free the closure */
302
+ free (closure);
303
+ }
304
+
305
+ #endif
68
306
 
69
307
  // Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
70
308
 
71
- # elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
309
+ #elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
72
310
 
73
311
  #define USE_LOCKS 1
74
312
  #define USE_DL_PREFIX 1
@@ -94,14 +332,6 @@
94
332
  /* Don't allocate more than a page unless needed. */
95
333
  #define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
96
334
 
97
- #if FFI_CLOSURE_TEST
98
- /* Don't release single pages, to avoid a worst-case scenario of
99
- continuously allocating and releasing single pages, but release
100
- pairs of pages, which should do just as well given that allocations
101
- are likely to be small. */
102
- #define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize)
103
- #endif
104
-
105
335
  #include <sys/types.h>
106
336
  #include <sys/stat.h>
107
337
  #include <fcntl.h>
@@ -172,6 +402,41 @@ selinux_enabled_check (void)
172
402
 
173
403
  #endif /* !FFI_MMAP_EXEC_SELINUX */
174
404
 
405
+ /* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
406
+ #ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
407
+ #include <stdlib.h>
408
+
409
+ static int emutramp_enabled = -1;
410
+
411
+ static int
412
+ emutramp_enabled_check (void)
413
+ {
414
+ char *buf = NULL;
415
+ size_t len = 0;
416
+ FILE *f;
417
+ int ret;
418
+ f = fopen ("/proc/self/status", "r");
419
+ if (f == NULL)
420
+ return 0;
421
+ ret = 0;
422
+
423
+ while (getline (&buf, &len, f) != -1)
424
+ if (!strncmp (buf, "PaX:", 4))
425
+ {
426
+ char emutramp;
427
+ if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
428
+ ret = (emutramp == 'E');
429
+ break;
430
+ }
431
+ free (buf);
432
+ fclose (f);
433
+ return ret;
434
+ }
435
+
436
+ #define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
437
+ : (emutramp_enabled = emutramp_enabled_check ()))
438
+ #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
439
+
175
440
  #elif defined (__CYGWIN__) || defined(__INTERIX)
176
441
 
177
442
  #include <sys/mman.h>
@@ -181,6 +446,10 @@ selinux_enabled_check (void)
181
446
 
182
447
  #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
183
448
 
449
+ #ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
450
+ #define is_emutramp_enabled() 0
451
+ #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
452
+
184
453
  /* Declare all functions defined in dlmalloc.c as static. */
185
454
  static void *dlmalloc(size_t);
186
455
  static void dlfree(void*);
@@ -226,9 +495,15 @@ static size_t execsize = 0;
226
495
 
227
496
  /* Open a temporary file name, and immediately unlink it. */
228
497
  static int
229
- open_temp_exec_file_name (char *name)
498
+ open_temp_exec_file_name (char *name, int flags)
230
499
  {
231
- int fd = mkstemp (name);
500
+ int fd;
501
+
502
+ #ifdef HAVE_MKOSTEMP
503
+ fd = mkostemp (name, flags);
504
+ #else
505
+ fd = mkstemp (name);
506
+ #endif
232
507
 
233
508
  if (fd != -1)
234
509
  unlink (name);
@@ -241,8 +516,30 @@ static int
241
516
  open_temp_exec_file_dir (const char *dir)
242
517
  {
243
518
  static const char suffix[] = "/ffiXXXXXX";
244
- int lendir = strlen (dir);
245
- char *tempname = __builtin_alloca (lendir + sizeof (suffix));
519
+ int lendir, flags;
520
+ char *tempname;
521
+ #ifdef O_TMPFILE
522
+ int fd;
523
+ #endif
524
+
525
+ #ifdef O_CLOEXEC
526
+ flags = O_CLOEXEC;
527
+ #else
528
+ flags = 0;
529
+ #endif
530
+
531
+ #ifdef O_TMPFILE
532
+ fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700);
533
+ /* If the running system does not support the O_TMPFILE flag then retry without it. */
534
+ if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) {
535
+ return fd;
536
+ } else {
537
+ errno = 0;
538
+ }
539
+ #endif
540
+
541
+ lendir = strlen (dir);
542
+ tempname = __builtin_alloca (lendir + sizeof (suffix));
246
543
 
247
544
  if (!tempname)
248
545
  return -1;
@@ -250,7 +547,7 @@ open_temp_exec_file_dir (const char *dir)
250
547
  memcpy (tempname, dir, lendir);
251
548
  memcpy (tempname + lendir, suffix, sizeof (suffix));
252
549
 
253
- return open_temp_exec_file_name (tempname);
550
+ return open_temp_exec_file_name (tempname, flags);
254
551
  }
255
552
 
256
553
  /* Open a temporary file in the directory in the named environment
@@ -359,7 +656,7 @@ open_temp_exec_file_opts_next (void)
359
656
  }
360
657
 
361
658
  /* Return a file descriptor of a temporary zero-sized file in a
362
- writable and exexutable filesystem. */
659
+ writable and executable filesystem. */
363
660
  static int
364
661
  open_temp_exec_file (void)
365
662
  {
@@ -454,9 +751,11 @@ dlmmap (void *start, size_t length, int prot,
454
751
  && flags == (MAP_PRIVATE | MAP_ANONYMOUS)
455
752
  && fd == -1 && offset == 0);
456
753
 
457
- #if FFI_CLOSURE_TEST
458
- printf ("mapping in %zi\n", length);
459
- #endif
754
+ if (execfd == -1 && is_emutramp_enabled ())
755
+ {
756
+ ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
757
+ return ptr;
758
+ }
460
759
 
461
760
  if (execfd == -1 && !is_selinux_enabled ())
462
761
  {
@@ -497,10 +796,6 @@ dlmunmap (void *start, size_t length)
497
796
  msegmentptr seg = segment_holding (gm, start);
498
797
  void *code;
499
798
 
500
- #if FFI_CLOSURE_TEST
501
- printf ("unmapping %zi\n", length);
502
- #endif
503
-
504
799
  if (seg && (code = add_segment_exec_offset (start, seg)) != start)
505
800
  {
506
801
  int ret = munmap (code, length);
@@ -569,26 +864,6 @@ ffi_closure_free (void *ptr)
569
864
  dlfree (ptr);
570
865
  }
571
866
 
572
-
573
- #if FFI_CLOSURE_TEST
574
- /* Do some internal sanity testing to make sure allocation and
575
- deallocation of pages are working as intended. */
576
- int main ()
577
- {
578
- void *p[3];
579
- #define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0)
580
- #define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0)
581
- GET (0, malloc_getpagesize / 2);
582
- GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*));
583
- PUT (1);
584
- GET (1, 2 * malloc_getpagesize);
585
- GET (2, malloc_getpagesize / 2);
586
- PUT (1);
587
- PUT (0);
588
- PUT (2);
589
- return 0;
590
- }
591
- #endif /* FFI_CLOSURE_TEST */
592
867
  # else /* ! FFI_MMAP_EXEC_WRIT */
593
868
 
594
869
  /* On many systems, memory returned by malloc is writable and