ffi 1.10.0

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 (530) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +43 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +98 -0
  7. data/COPYING +49 -0
  8. data/Gemfile +15 -0
  9. data/LICENSE +24 -0
  10. data/LICENSE.SPECS +22 -0
  11. data/README.md +112 -0
  12. data/Rakefile +268 -0
  13. data/appveyor.yml +22 -0
  14. data/ext/ffi_c/AbstractMemory.c +1109 -0
  15. data/ext/ffi_c/AbstractMemory.h +175 -0
  16. data/ext/ffi_c/ArrayType.c +162 -0
  17. data/ext/ffi_c/ArrayType.h +59 -0
  18. data/ext/ffi_c/Buffer.c +365 -0
  19. data/ext/ffi_c/Call.c +520 -0
  20. data/ext/ffi_c/Call.h +110 -0
  21. data/ext/ffi_c/ClosurePool.c +283 -0
  22. data/ext/ffi_c/ClosurePool.h +57 -0
  23. data/ext/ffi_c/DataConverter.c +91 -0
  24. data/ext/ffi_c/DynamicLibrary.c +339 -0
  25. data/ext/ffi_c/DynamicLibrary.h +98 -0
  26. data/ext/ffi_c/Function.c +1001 -0
  27. data/ext/ffi_c/Function.h +87 -0
  28. data/ext/ffi_c/FunctionInfo.c +271 -0
  29. data/ext/ffi_c/LastError.c +229 -0
  30. data/ext/ffi_c/LastError.h +47 -0
  31. data/ext/ffi_c/LongDouble.c +63 -0
  32. data/ext/ffi_c/LongDouble.h +51 -0
  33. data/ext/ffi_c/MappedType.c +168 -0
  34. data/ext/ffi_c/MappedType.h +59 -0
  35. data/ext/ffi_c/MemoryPointer.c +197 -0
  36. data/ext/ffi_c/MemoryPointer.h +53 -0
  37. data/ext/ffi_c/MethodHandle.c +358 -0
  38. data/ext/ffi_c/MethodHandle.h +55 -0
  39. data/ext/ffi_c/Platform.c +129 -0
  40. data/ext/ffi_c/Platform.h +45 -0
  41. data/ext/ffi_c/Pointer.c +508 -0
  42. data/ext/ffi_c/Pointer.h +63 -0
  43. data/ext/ffi_c/Struct.c +829 -0
  44. data/ext/ffi_c/Struct.h +106 -0
  45. data/ext/ffi_c/StructByReference.c +190 -0
  46. data/ext/ffi_c/StructByReference.h +50 -0
  47. data/ext/ffi_c/StructByValue.c +150 -0
  48. data/ext/ffi_c/StructByValue.h +55 -0
  49. data/ext/ffi_c/StructLayout.c +698 -0
  50. data/ext/ffi_c/Thread.c +353 -0
  51. data/ext/ffi_c/Thread.h +95 -0
  52. data/ext/ffi_c/Type.c +397 -0
  53. data/ext/ffi_c/Type.h +62 -0
  54. data/ext/ffi_c/Types.c +139 -0
  55. data/ext/ffi_c/Types.h +89 -0
  56. data/ext/ffi_c/Variadic.c +304 -0
  57. data/ext/ffi_c/compat.h +78 -0
  58. data/ext/ffi_c/extconf.rb +72 -0
  59. data/ext/ffi_c/ffi.c +98 -0
  60. data/ext/ffi_c/libffi.bsd.mk +40 -0
  61. data/ext/ffi_c/libffi.darwin.mk +105 -0
  62. data/ext/ffi_c/libffi.gnu.mk +32 -0
  63. data/ext/ffi_c/libffi.mk +18 -0
  64. data/ext/ffi_c/libffi.vc.mk +26 -0
  65. data/ext/ffi_c/libffi.vc64.mk +26 -0
  66. data/ext/ffi_c/libffi/.appveyor.yml +50 -0
  67. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  68. data/ext/ffi_c/libffi/.gitignore +38 -0
  69. data/ext/ffi_c/libffi/.travis.yml +34 -0
  70. data/ext/ffi_c/libffi/.travis/ar-lib +270 -0
  71. data/ext/ffi_c/libffi/.travis/build.sh +34 -0
  72. data/ext/ffi_c/libffi/.travis/compile +351 -0
  73. data/ext/ffi_c/libffi/.travis/install.sh +22 -0
  74. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +60 -0
  75. data/ext/ffi_c/libffi/.travis/site.exp +18 -0
  76. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  77. data/ext/ffi_c/libffi/ChangeLog.libffi-3.1 +6000 -0
  78. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  79. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  80. data/ext/ffi_c/libffi/LICENSE +21 -0
  81. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +352 -0
  82. data/ext/ffi_c/libffi/Makefile.am +166 -0
  83. data/ext/ffi_c/libffi/README.md +461 -0
  84. data/ext/ffi_c/libffi/acinclude.m4 +479 -0
  85. data/ext/ffi_c/libffi/autogen.sh +2 -0
  86. data/ext/ffi_c/libffi/config.guess +1466 -0
  87. data/ext/ffi_c/libffi/config.sub +1836 -0
  88. data/ext/ffi_c/libffi/configure.ac +390 -0
  89. data/ext/ffi_c/libffi/configure.host +289 -0
  90. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  91. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  92. data/ext/ffi_c/libffi/include/ffi.h.in +511 -0
  93. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  94. data/ext/ffi_c/libffi/include/ffi_common.h +149 -0
  95. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  96. data/ext/ffi_c/libffi/libffi.pc.in +11 -0
  97. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  98. data/ext/ffi_c/libffi/libtool-version +29 -0
  99. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  100. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +71 -0
  101. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +194 -0
  102. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +122 -0
  103. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +74 -0
  104. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +87 -0
  105. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  106. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  107. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +263 -0
  108. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  109. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  110. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  111. data/ext/ffi_c/libffi/man/ffi.3 +41 -0
  112. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  113. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +68 -0
  114. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  115. data/ext/ffi_c/libffi/msvcc.sh +328 -0
  116. data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
  117. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  118. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  119. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  120. data/ext/ffi_c/libffi/src/alpha/ffi.c +521 -0
  121. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +57 -0
  122. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  123. data/ext/ffi_c/libffi/src/alpha/osf.S +282 -0
  124. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  125. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  126. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  127. data/ext/ffi_c/libffi/src/arm/ffi.c +819 -0
  128. data/ext/ffi_c/libffi/src/arm/ffitarget.h +82 -0
  129. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  130. data/ext/ffi_c/libffi/src/arm/sysv.S +383 -0
  131. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  132. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +55 -0
  133. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  134. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  135. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  136. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  137. data/ext/ffi_c/libffi/src/closures.c +966 -0
  138. data/ext/ffi_c/libffi/src/cris/ffi.c +386 -0
  139. data/ext/ffi_c/libffi/src/cris/ffitarget.h +56 -0
  140. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  141. data/ext/ffi_c/libffi/src/debug.c +64 -0
  142. data/ext/ffi_c/libffi/src/dlmalloc.c +5166 -0
  143. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  144. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  145. data/ext/ffi_c/libffi/src/frv/ffitarget.h +62 -0
  146. data/ext/ffi_c/libffi/src/ia64/ffi.c +604 -0
  147. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +56 -0
  148. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  149. data/ext/ffi_c/libffi/src/ia64/unix.S +567 -0
  150. data/ext/ffi_c/libffi/src/java_raw_api.c +374 -0
  151. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  152. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +53 -0
  153. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  154. data/ext/ffi_c/libffi/src/m68k/ffi.c +362 -0
  155. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +54 -0
  156. data/ext/ffi_c/libffi/src/m68k/sysv.S +357 -0
  157. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  158. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  159. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  160. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  161. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  162. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  163. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  164. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  165. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  166. data/ext/ffi_c/libffi/src/mips/ffi.c +1130 -0
  167. data/ext/ffi_c/libffi/src/mips/ffitarget.h +244 -0
  168. data/ext/ffi_c/libffi/src/mips/n32.S +663 -0
  169. data/ext/ffi_c/libffi/src/mips/o32.S +502 -0
  170. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  171. data/ext/ffi_c/libffi/src/moxie/ffi.c +285 -0
  172. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  173. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  174. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  175. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  176. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  177. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  178. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  179. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  180. data/ext/ffi_c/libffi/src/pa/ffitarget.h +85 -0
  181. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  182. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  183. data/ext/ffi_c/libffi/src/powerpc/aix.S +566 -0
  184. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +694 -0
  185. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  186. data/ext/ffi_c/libffi/src/powerpc/darwin.S +378 -0
  187. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +571 -0
  188. data/ext/ffi_c/libffi/src/powerpc/ffi.c +173 -0
  189. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1440 -0
  190. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +974 -0
  191. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  192. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  193. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +198 -0
  194. data/ext/ffi_c/libffi/src/powerpc/linux64.S +228 -0
  195. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +488 -0
  196. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +397 -0
  197. data/ext/ffi_c/libffi/src/powerpc/sysv.S +175 -0
  198. data/ext/ffi_c/libffi/src/prep_cif.c +261 -0
  199. data/ext/ffi_c/libffi/src/raw_api.c +267 -0
  200. data/ext/ffi_c/libffi/src/riscv/ffi.c +445 -0
  201. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +68 -0
  202. data/ext/ffi_c/libffi/src/riscv/sysv.S +214 -0
  203. data/ext/ffi_c/libffi/src/s390/ffi.c +756 -0
  204. data/ext/ffi_c/libffi/src/s390/ffitarget.h +70 -0
  205. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  206. data/ext/ffi_c/libffi/src/s390/sysv.S +325 -0
  207. data/ext/ffi_c/libffi/src/sh/ffi.c +717 -0
  208. data/ext/ffi_c/libffi/src/sh/ffitarget.h +54 -0
  209. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  210. data/ext/ffi_c/libffi/src/sh64/ffi.c +469 -0
  211. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +58 -0
  212. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  213. data/ext/ffi_c/libffi/src/sparc/ffi.c +468 -0
  214. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  215. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +81 -0
  216. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  217. data/ext/ffi_c/libffi/src/sparc/v8.S +443 -0
  218. data/ext/ffi_c/libffi/src/sparc/v9.S +440 -0
  219. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  220. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  221. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  222. data/ext/ffi_c/libffi/src/types.c +108 -0
  223. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  224. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  225. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  226. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  227. data/ext/ffi_c/libffi/src/x86/ffi.c +753 -0
  228. data/ext/ffi_c/libffi/src/x86/ffi64.c +884 -0
  229. data/ext/ffi_c/libffi/src/x86/ffitarget.h +147 -0
  230. data/ext/ffi_c/libffi/src/x86/ffiw64.c +308 -0
  231. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  232. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  233. data/ext/ffi_c/libffi/src/x86/sysv.S +1043 -0
  234. data/ext/ffi_c/libffi/src/x86/unix64.S +525 -0
  235. data/ext/ffi_c/libffi/src/x86/win64.S +232 -0
  236. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  237. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  238. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  239. data/ext/ffi_c/libffi/src/xtensa/sysv.S +258 -0
  240. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  241. data/ext/ffi_c/libffi/testsuite/Makefile.am +117 -0
  242. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  243. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +636 -0
  244. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +283 -0
  245. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +58 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1745 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +743 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +43 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c +55 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +132 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +115 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +61 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +61 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +142 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +138 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +60 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +60 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +74 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +341 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +59 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +52 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +134 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  350. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  351. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  352. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  353. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  354. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  355. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  356. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  357. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  358. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  359. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  360. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  361. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  362. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +36 -0
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  365. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  366. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  367. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  368. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  369. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  370. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  371. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  372. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  373. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  374. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  375. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  376. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  377. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  378. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  379. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  380. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  381. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  382. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  383. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  384. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +67 -0
  385. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  386. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  387. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +60 -0
  388. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +64 -0
  389. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +66 -0
  390. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  391. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  392. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +81 -0
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +68 -0
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  395. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  396. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +117 -0
  397. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +54 -0
  398. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  399. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  400. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  401. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  403. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  404. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  405. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  406. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  407. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  408. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  409. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  410. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  411. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  412. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  415. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +36 -0
  419. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  421. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  422. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  423. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  424. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  425. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  430. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  431. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  432. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  433. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  434. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  435. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  436. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  441. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  442. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  443. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  444. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  445. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  446. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  448. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  449. data/ext/ffi_c/rbffi.h +57 -0
  450. data/ext/ffi_c/rbffi_endian.h +59 -0
  451. data/ext/ffi_c/win32/stdbool.h +8 -0
  452. data/ext/ffi_c/win32/stdint.h +201 -0
  453. data/ffi.gemspec +36 -0
  454. data/lib/ffi.rb +20 -0
  455. data/lib/ffi/autopointer.rb +203 -0
  456. data/lib/ffi/buffer.rb +4 -0
  457. data/lib/ffi/callback.rb +4 -0
  458. data/lib/ffi/enum.rb +296 -0
  459. data/lib/ffi/errno.rb +43 -0
  460. data/lib/ffi/ffi.rb +44 -0
  461. data/lib/ffi/io.rb +62 -0
  462. data/lib/ffi/library.rb +588 -0
  463. data/lib/ffi/managedstruct.rb +84 -0
  464. data/lib/ffi/memorypointer.rb +1 -0
  465. data/lib/ffi/platform.rb +170 -0
  466. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  467. data/lib/ffi/platform/aarch64-freebsd12/types.conf +128 -0
  468. data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
  469. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  470. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  471. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  472. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  473. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  474. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  475. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  476. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  477. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  478. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  479. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  480. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  481. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  482. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  483. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  484. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  485. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  486. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  487. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  488. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  489. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  490. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  491. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  492. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  493. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  494. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  495. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  496. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  497. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  498. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  499. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  500. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  501. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  502. data/lib/ffi/platform/x86_64-darwin/types.conf +126 -0
  503. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  504. data/lib/ffi/platform/x86_64-freebsd12/types.conf +128 -0
  505. data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
  506. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  507. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  508. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  509. data/lib/ffi/platform/x86_64-windows/types.conf +120 -0
  510. data/lib/ffi/pointer.rb +160 -0
  511. data/lib/ffi/struct.rb +371 -0
  512. data/lib/ffi/struct_layout_builder.rb +227 -0
  513. data/lib/ffi/tools/const_generator.rb +229 -0
  514. data/lib/ffi/tools/generator.rb +60 -0
  515. data/lib/ffi/tools/generator_task.rb +36 -0
  516. data/lib/ffi/tools/struct_generator.rb +194 -0
  517. data/lib/ffi/tools/types_generator.rb +134 -0
  518. data/lib/ffi/types.rb +194 -0
  519. data/lib/ffi/union.rb +43 -0
  520. data/lib/ffi/variadic.rb +78 -0
  521. data/lib/ffi/version.rb +3 -0
  522. data/samples/getlogin.rb +8 -0
  523. data/samples/getpid.rb +8 -0
  524. data/samples/gettimeofday.rb +18 -0
  525. data/samples/hello.rb +7 -0
  526. data/samples/inotify.rb +60 -0
  527. data/samples/pty.rb +76 -0
  528. data/samples/qsort.rb +21 -0
  529. data/samples/sample_helper.rb +6 -0
  530. metadata +658 -0
@@ -0,0 +1,82 @@
1
+ /* -----------------------------------------------------------------*-C-*-
2
+ ffitarget.h - Copyright (c) 2012 Anthony Green
3
+ Copyright (c) 2010 CodeSourcery
4
+ Copyright (c) 1996-2003 Red Hat, Inc.
5
+
6
+ Target configuration macros for ARM.
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining
9
+ a copy of this software and associated documentation files (the
10
+ ``Software''), to deal in the Software without restriction, including
11
+ without limitation the rights to use, copy, modify, merge, publish,
12
+ distribute, sublicense, and/or sell copies of the Software, and to
13
+ permit persons to whom the Software is furnished to do so, subject to
14
+ the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included
17
+ in all copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
20
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26
+ DEALINGS IN THE SOFTWARE.
27
+
28
+ ----------------------------------------------------------------------- */
29
+
30
+ #ifndef LIBFFI_TARGET_H
31
+ #define LIBFFI_TARGET_H
32
+
33
+ #ifndef LIBFFI_H
34
+ #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
35
+ #endif
36
+
37
+ #ifndef LIBFFI_ASM
38
+ typedef unsigned long ffi_arg;
39
+ typedef signed long ffi_sarg;
40
+
41
+ typedef enum ffi_abi {
42
+ FFI_FIRST_ABI = 0,
43
+ FFI_SYSV,
44
+ FFI_VFP,
45
+ FFI_LAST_ABI,
46
+ #ifdef __ARM_PCS_VFP
47
+ FFI_DEFAULT_ABI = FFI_VFP,
48
+ #else
49
+ FFI_DEFAULT_ABI = FFI_SYSV,
50
+ #endif
51
+ } ffi_abi;
52
+ #endif
53
+
54
+ #define FFI_EXTRA_CIF_FIELDS \
55
+ int vfp_used; \
56
+ unsigned short vfp_reg_free, vfp_nargs; \
57
+ signed char vfp_args[16] \
58
+
59
+ #define FFI_TARGET_SPECIFIC_VARIADIC
60
+ #define FFI_TARGET_HAS_COMPLEX_TYPE
61
+
62
+ /* ---- Definitions for closures ----------------------------------------- */
63
+
64
+ #define FFI_CLOSURES 1
65
+ #define FFI_GO_CLOSURES 1
66
+ #define FFI_NATIVE_RAW_API 0
67
+
68
+ #if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE
69
+
70
+ #ifdef __MACH__
71
+ #define FFI_TRAMPOLINE_SIZE 12
72
+ #define FFI_TRAMPOLINE_CLOSURE_OFFSET 8
73
+ #else
74
+ #error "No trampoline table implementation"
75
+ #endif
76
+
77
+ #else
78
+ #define FFI_TRAMPOLINE_SIZE 12
79
+ #define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE
80
+ #endif
81
+
82
+ #endif
@@ -0,0 +1,7 @@
1
+ #define ARM_TYPE_VFP_S 0
2
+ #define ARM_TYPE_VFP_D 1
3
+ #define ARM_TYPE_VFP_N 2
4
+ #define ARM_TYPE_INT64 3
5
+ #define ARM_TYPE_INT 4
6
+ #define ARM_TYPE_VOID 5
7
+ #define ARM_TYPE_STRUCT 6
@@ -0,0 +1,383 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
3
+ Copyright (c) 2011 Plausible Labs Cooperative, Inc.
4
+
5
+ ARM 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
+ #include <ffi_cfi.h>
32
+ #include "internal.h"
33
+
34
+ /* GCC 4.8 provides __ARM_ARCH; construct it otherwise. */
35
+ #ifndef __ARM_ARCH
36
+ # if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
37
+ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
38
+ || defined(__ARM_ARCH_7EM__)
39
+ # define __ARM_ARCH 7
40
+ # elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
41
+ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
42
+ || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
43
+ || defined(__ARM_ARCH_6M__)
44
+ # define __ARM_ARCH 6
45
+ # elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
46
+ || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
47
+ || defined(__ARM_ARCH_5TEJ__)
48
+ # define __ARM_ARCH 5
49
+ # else
50
+ # define __ARM_ARCH 4
51
+ # endif
52
+ #endif
53
+
54
+ /* Conditionally compile unwinder directives. */
55
+ #ifdef __ARM_EABI__
56
+ # define UNWIND(...) __VA_ARGS__
57
+ #else
58
+ # define UNWIND(...)
59
+ #endif
60
+
61
+ #if defined(HAVE_AS_CFI_PSEUDO_OP) && defined(__ARM_EABI__)
62
+ .cfi_sections .debug_frame
63
+ #endif
64
+
65
+ #define CONCAT(a, b) CONCAT2(a, b)
66
+ #define CONCAT2(a, b) a ## b
67
+
68
+ #ifdef __USER_LABEL_PREFIX__
69
+ # define CNAME(X) CONCAT (__USER_LABEL_PREFIX__, X)
70
+ #else
71
+ # define CNAME(X) X
72
+ #endif
73
+ #ifdef __ELF__
74
+ # define SIZE(X) .size CNAME(X), . - CNAME(X)
75
+ # define TYPE(X, Y) .type CNAME(X), Y
76
+ #else
77
+ # define SIZE(X)
78
+ # define TYPE(X, Y)
79
+ #endif
80
+
81
+ #define ARM_FUNC_START_LOCAL(name) \
82
+ .align 3; \
83
+ TYPE(CNAME(name), %function); \
84
+ CNAME(name):
85
+
86
+ #define ARM_FUNC_START(name) \
87
+ .globl CNAME(name); \
88
+ FFI_HIDDEN(CNAME(name)); \
89
+ ARM_FUNC_START_LOCAL(name)
90
+
91
+ #define ARM_FUNC_END(name) \
92
+ SIZE(name)
93
+
94
+ /* Aid in defining a jump table with 8 bytes between entries. */
95
+ /* ??? The clang assembler doesn't handle .if with symbolic expressions. */
96
+ #ifdef __clang__
97
+ # define E(index)
98
+ #else
99
+ # define E(index) \
100
+ .if . - 0b - 8*index; \
101
+ .error "type table out of sync"; \
102
+ .endif
103
+ #endif
104
+
105
+ .text
106
+ .syntax unified
107
+ .arm
108
+
109
+ #ifndef __clang__
110
+ /* We require interworking on LDM, which implies ARMv5T,
111
+ which implies the existance of BLX. */
112
+ .arch armv5t
113
+ #endif
114
+
115
+ /* Note that we use STC and LDC to encode VFP instructions,
116
+ so that we do not need ".fpu vfp", nor get that added to
117
+ the object file attributes. These will not be executed
118
+ unless the FFI_VFP abi is used. */
119
+
120
+ @ r0: stack
121
+ @ r1: frame
122
+ @ r2: fn
123
+ @ r3: vfp_used
124
+
125
+ ARM_FUNC_START(ffi_call_VFP)
126
+ UNWIND(.fnstart)
127
+ cfi_startproc
128
+
129
+ cmp r3, #3 @ load only d0 if possible
130
+ #ifdef __clang__
131
+ vldrle d0, [sp]
132
+ vldmgt sp, {d0-d7}
133
+ #else
134
+ ldcle p11, cr0, [r0] @ vldrle d0, [sp]
135
+ ldcgt p11, cr0, [r0], {16} @ vldmgt sp, {d0-d7}
136
+ #endif
137
+ add r0, r0, #64 @ discard the vfp register args
138
+ /* FALLTHRU */
139
+ ARM_FUNC_END(ffi_call_VFP)
140
+
141
+ ARM_FUNC_START(ffi_call_SYSV)
142
+ stm r1, {fp, lr}
143
+ mov fp, r1
144
+
145
+ @ This is a bit of a lie wrt the origin of the unwind info, but
146
+ @ now we've got the usual frame pointer and two saved registers.
147
+ UNWIND(.save {fp,lr})
148
+ UNWIND(.setfp fp, sp)
149
+ cfi_def_cfa(fp, 8)
150
+ cfi_rel_offset(fp, 0)
151
+ cfi_rel_offset(lr, 4)
152
+
153
+ mov sp, r0 @ install the stack pointer
154
+ mov lr, r2 @ move the fn pointer out of the way
155
+ ldr ip, [fp, #16] @ install the static chain
156
+ ldmia sp!, {r0-r3} @ move first 4 parameters in registers.
157
+ blx lr @ call fn
158
+
159
+ @ Load r2 with the pointer to storage for the return value
160
+ @ Load r3 with the return type code
161
+ ldr r2, [fp, #8]
162
+ ldr r3, [fp, #12]
163
+
164
+ @ Deallocate the stack with the arguments.
165
+ mov sp, fp
166
+ cfi_def_cfa_register(sp)
167
+
168
+ @ Store values stored in registers.
169
+ .align 3
170
+ add pc, pc, r3, lsl #3
171
+ nop
172
+ 0:
173
+ E(ARM_TYPE_VFP_S)
174
+ #ifdef __clang__
175
+ vstr s0, [r2]
176
+ #else
177
+ stc p10, cr0, [r2] @ vstr s0, [r2]
178
+ #endif
179
+ pop {fp,pc}
180
+ E(ARM_TYPE_VFP_D)
181
+ #ifdef __clang__
182
+ vstr d0, [r2]
183
+ #else
184
+ stc p11, cr0, [r2] @ vstr d0, [r2]
185
+ #endif
186
+ pop {fp,pc}
187
+ E(ARM_TYPE_VFP_N)
188
+ #ifdef __clang__
189
+ vstm r2, {d0-d3}
190
+ #else
191
+ stc p11, cr0, [r2], {8} @ vstm r2, {d0-d3}
192
+ #endif
193
+ pop {fp,pc}
194
+ E(ARM_TYPE_INT64)
195
+ str r1, [r2, #4]
196
+ nop
197
+ E(ARM_TYPE_INT)
198
+ str r0, [r2]
199
+ pop {fp,pc}
200
+ E(ARM_TYPE_VOID)
201
+ pop {fp,pc}
202
+ nop
203
+ E(ARM_TYPE_STRUCT)
204
+ pop {fp,pc}
205
+
206
+ cfi_endproc
207
+ UNWIND(.fnend)
208
+ ARM_FUNC_END(ffi_call_SYSV)
209
+
210
+
211
+ /*
212
+ int ffi_closure_inner_* (cif, fun, user_data, frame)
213
+ */
214
+
215
+ ARM_FUNC_START(ffi_go_closure_SYSV)
216
+ cfi_startproc
217
+ stmdb sp!, {r0-r3} @ save argument regs
218
+ cfi_adjust_cfa_offset(16)
219
+ ldr r0, [ip, #4] @ load cif
220
+ ldr r1, [ip, #8] @ load fun
221
+ mov r2, ip @ load user_data
222
+ b 0f
223
+ cfi_endproc
224
+ ARM_FUNC_END(ffi_go_closure_SYSV)
225
+
226
+ ARM_FUNC_START(ffi_closure_SYSV)
227
+ UNWIND(.fnstart)
228
+ cfi_startproc
229
+ stmdb sp!, {r0-r3} @ save argument regs
230
+ cfi_adjust_cfa_offset(16)
231
+
232
+ #if FFI_EXEC_TRAMPOLINE_TABLE
233
+ ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure*
234
+ #endif
235
+ ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif
236
+ ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun
237
+ ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data
238
+ 0:
239
+ add ip, sp, #16 @ compute entry sp
240
+ sub sp, sp, #64+32 @ allocate frame
241
+ cfi_adjust_cfa_offset(64+32)
242
+ stmdb sp!, {ip,lr}
243
+
244
+ /* Remember that EABI unwind info only applies at call sites.
245
+ We need do nothing except note the save of the stack pointer
246
+ and the link registers. */
247
+ UNWIND(.save {sp,lr})
248
+ cfi_adjust_cfa_offset(8)
249
+ cfi_rel_offset(lr, 4)
250
+
251
+ add r3, sp, #8 @ load frame
252
+ bl CNAME(ffi_closure_inner_SYSV)
253
+
254
+ @ Load values returned in registers.
255
+ add r2, sp, #8+64 @ load result
256
+ adr r3, CNAME(ffi_closure_ret)
257
+ add pc, r3, r0, lsl #3
258
+ cfi_endproc
259
+ UNWIND(.fnend)
260
+ ARM_FUNC_END(ffi_closure_SYSV)
261
+
262
+ ARM_FUNC_START(ffi_go_closure_VFP)
263
+ cfi_startproc
264
+ stmdb sp!, {r0-r3} @ save argument regs
265
+ cfi_adjust_cfa_offset(16)
266
+ ldr r0, [ip, #4] @ load cif
267
+ ldr r1, [ip, #8] @ load fun
268
+ mov r2, ip @ load user_data
269
+ b 0f
270
+ cfi_endproc
271
+ ARM_FUNC_END(ffi_go_closure_VFP)
272
+
273
+ ARM_FUNC_START(ffi_closure_VFP)
274
+ UNWIND(.fnstart)
275
+ cfi_startproc
276
+ stmdb sp!, {r0-r3} @ save argument regs
277
+ cfi_adjust_cfa_offset(16)
278
+
279
+ #if FFI_EXEC_TRAMPOLINE_TABLE
280
+ ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure*
281
+ #endif
282
+ ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif
283
+ ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun
284
+ ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data
285
+ 0:
286
+ add ip, sp, #16
287
+ sub sp, sp, #64+32 @ allocate frame
288
+ cfi_adjust_cfa_offset(64+32)
289
+ #ifdef __clang__
290
+ vstm sp, {d0-d7}
291
+ #else
292
+ stc p11, cr0, [sp], {16} @ vstm sp, {d0-d7}
293
+ #endif
294
+ stmdb sp!, {ip,lr}
295
+
296
+ /* See above. */
297
+ UNWIND(.save {sp,lr})
298
+ cfi_adjust_cfa_offset(8)
299
+ cfi_rel_offset(lr, 4)
300
+
301
+ add r3, sp, #8 @ load frame
302
+ bl CNAME(ffi_closure_inner_VFP)
303
+
304
+ @ Load values returned in registers.
305
+ add r2, sp, #8+64 @ load result
306
+ adr r3, CNAME(ffi_closure_ret)
307
+ add pc, r3, r0, lsl #3
308
+ cfi_endproc
309
+ UNWIND(.fnend)
310
+ ARM_FUNC_END(ffi_closure_VFP)
311
+
312
+ /* Load values returned in registers for both closure entry points.
313
+ Note that we use LDM with SP in the register set. This is deprecated
314
+ by ARM, but not yet unpredictable. */
315
+
316
+ ARM_FUNC_START_LOCAL(ffi_closure_ret)
317
+ cfi_startproc
318
+ cfi_rel_offset(sp, 0)
319
+ cfi_rel_offset(lr, 4)
320
+ 0:
321
+ E(ARM_TYPE_VFP_S)
322
+ #ifdef __clang__
323
+ vldr s0, [r2]
324
+ #else
325
+ ldc p10, cr0, [r2] @ vldr s0, [r2]
326
+ #endif
327
+ ldm sp, {sp,pc}
328
+ E(ARM_TYPE_VFP_D)
329
+ #ifdef __clang__
330
+ vldr d0, [r2]
331
+ #else
332
+ ldc p11, cr0, [r2] @ vldr d0, [r2]
333
+ #endif
334
+ ldm sp, {sp,pc}
335
+ E(ARM_TYPE_VFP_N)
336
+ #ifdef __clang__
337
+ vldm r2, {d0-d3}
338
+ #else
339
+ ldc p11, cr0, [r2], {8} @ vldm r2, {d0-d3}
340
+ #endif
341
+ ldm sp, {sp,pc}
342
+ E(ARM_TYPE_INT64)
343
+ ldr r1, [r2, #4]
344
+ nop
345
+ E(ARM_TYPE_INT)
346
+ ldr r0, [r2]
347
+ ldm sp, {sp,pc}
348
+ E(ARM_TYPE_VOID)
349
+ ldm sp, {sp,pc}
350
+ nop
351
+ E(ARM_TYPE_STRUCT)
352
+ ldm sp, {sp,pc}
353
+ cfi_endproc
354
+ ARM_FUNC_END(ffi_closure_ret)
355
+
356
+ #if FFI_EXEC_TRAMPOLINE_TABLE
357
+
358
+ #ifdef __MACH__
359
+ #include <mach/machine/vm_param.h>
360
+
361
+ .align PAGE_MAX_SHIFT
362
+ ARM_FUNC_START(ffi_closure_trampoline_table_page)
363
+ .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE
364
+ adr ip, #-PAGE_MAX_SIZE @ the config page is PAGE_MAX_SIZE behind the trampoline page
365
+ sub ip, #8 @ account for pc bias
366
+ ldr pc, [ip, #4] @ jump to ffi_closure_SYSV or ffi_closure_VFP
367
+ .endr
368
+ ARM_FUNC_END(ffi_closure_trampoline_table_page)
369
+ #endif
370
+
371
+ #else
372
+
373
+ ARM_FUNC_START(ffi_arm_trampoline)
374
+ 0: adr ip, 0b
375
+ ldr pc, 1f
376
+ 1: .long 0
377
+ ARM_FUNC_END(ffi_arm_trampoline)
378
+
379
+ #endif /* FFI_EXEC_TRAMPOLINE_TABLE */
380
+
381
+ #if defined __ELF__ && defined __linux__
382
+ .section .note.GNU-stack,"",%progbits
383
+ #endif