ffi 1.11.2

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 (542) hide show
  1. checksums.yaml +7 -0
  2. data/.appveyor.yml +27 -0
  3. data/.gitignore +25 -0
  4. data/.gitmodules +4 -0
  5. data/.travis.yml +42 -0
  6. data/.yardopts +5 -0
  7. data/CHANGELOG.md +147 -0
  8. data/COPYING +49 -0
  9. data/Gemfile +15 -0
  10. data/LICENSE +24 -0
  11. data/LICENSE.SPECS +22 -0
  12. data/README.md +115 -0
  13. data/Rakefile +196 -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 +503 -0
  20. data/ext/ffi_c/Call.h +107 -0
  21. data/ext/ffi_c/ClosurePool.c +283 -0
  22. data/ext/ffi_c/ClosurePool.h +57 -0
  23. data/ext/ffi_c/DynamicLibrary.c +339 -0
  24. data/ext/ffi_c/DynamicLibrary.h +98 -0
  25. data/ext/ffi_c/Function.c +917 -0
  26. data/ext/ffi_c/Function.h +87 -0
  27. data/ext/ffi_c/FunctionInfo.c +271 -0
  28. data/ext/ffi_c/LastError.c +229 -0
  29. data/ext/ffi_c/LastError.h +47 -0
  30. data/ext/ffi_c/LongDouble.c +63 -0
  31. data/ext/ffi_c/LongDouble.h +51 -0
  32. data/ext/ffi_c/MappedType.c +168 -0
  33. data/ext/ffi_c/MappedType.h +59 -0
  34. data/ext/ffi_c/MemoryPointer.c +197 -0
  35. data/ext/ffi_c/MemoryPointer.h +53 -0
  36. data/ext/ffi_c/MethodHandle.c +358 -0
  37. data/ext/ffi_c/MethodHandle.h +55 -0
  38. data/ext/ffi_c/Platform.c +82 -0
  39. data/ext/ffi_c/Platform.h +45 -0
  40. data/ext/ffi_c/Pointer.c +508 -0
  41. data/ext/ffi_c/Pointer.h +63 -0
  42. data/ext/ffi_c/Struct.c +829 -0
  43. data/ext/ffi_c/Struct.h +106 -0
  44. data/ext/ffi_c/StructByValue.c +150 -0
  45. data/ext/ffi_c/StructByValue.h +55 -0
  46. data/ext/ffi_c/StructLayout.c +698 -0
  47. data/ext/ffi_c/Thread.c +137 -0
  48. data/ext/ffi_c/Thread.h +84 -0
  49. data/ext/ffi_c/Type.c +379 -0
  50. data/ext/ffi_c/Type.h +61 -0
  51. data/ext/ffi_c/Types.c +139 -0
  52. data/ext/ffi_c/Types.h +89 -0
  53. data/ext/ffi_c/Variadic.c +298 -0
  54. data/ext/ffi_c/compat.h +78 -0
  55. data/ext/ffi_c/extconf.rb +86 -0
  56. data/ext/ffi_c/ffi.c +93 -0
  57. data/ext/ffi_c/libffi.bsd.mk +40 -0
  58. data/ext/ffi_c/libffi.darwin.mk +105 -0
  59. data/ext/ffi_c/libffi.gnu.mk +32 -0
  60. data/ext/ffi_c/libffi.mk +18 -0
  61. data/ext/ffi_c/libffi.vc.mk +26 -0
  62. data/ext/ffi_c/libffi.vc64.mk +26 -0
  63. data/ext/ffi_c/libffi/.appveyor.yml +66 -0
  64. data/ext/ffi_c/libffi/.gitattributes +4 -0
  65. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  66. data/ext/ffi_c/libffi/.gitignore +38 -0
  67. data/ext/ffi_c/libffi/.travis.yml +63 -0
  68. data/ext/ffi_c/libffi/.travis/ar-lib +270 -0
  69. data/ext/ffi_c/libffi/.travis/build-in-container.sh +22 -0
  70. data/ext/ffi_c/libffi/.travis/build.sh +110 -0
  71. data/ext/ffi_c/libffi/.travis/compile +351 -0
  72. data/ext/ffi_c/libffi/.travis/install.sh +43 -0
  73. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +60 -0
  74. data/ext/ffi_c/libffi/.travis/site.exp +18 -0
  75. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  76. data/ext/ffi_c/libffi/ChangeLog.libffi-3.1 +6000 -0
  77. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  78. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  79. data/ext/ffi_c/libffi/LICENSE +21 -0
  80. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  81. data/ext/ffi_c/libffi/Makefile.am +158 -0
  82. data/ext/ffi_c/libffi/README.md +470 -0
  83. data/ext/ffi_c/libffi/acinclude.m4 +479 -0
  84. data/ext/ffi_c/libffi/autogen.sh +2 -0
  85. data/ext/ffi_c/libffi/config.guess +1466 -0
  86. data/ext/ffi_c/libffi/config.sub +1836 -0
  87. data/ext/ffi_c/libffi/configure.ac +394 -0
  88. data/ext/ffi_c/libffi/configure.host +303 -0
  89. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  90. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  91. data/ext/ffi_c/libffi/include/ffi.h.in +515 -0
  92. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  93. data/ext/ffi_c/libffi/include/ffi_common.h +153 -0
  94. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  95. data/ext/ffi_c/libffi/libffi.pc.in +11 -0
  96. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  97. data/ext/ffi_c/libffi/libtool-version +29 -0
  98. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  99. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +71 -0
  100. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +194 -0
  101. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +122 -0
  102. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +74 -0
  103. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +87 -0
  104. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  105. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  106. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +263 -0
  107. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  108. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  109. data/ext/ffi_c/libffi/make_sunver.pl +333 -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/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  116. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  117. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  118. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  119. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  120. data/ext/ffi_c/libffi/msvcc.sh +353 -0
  121. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1009 -0
  122. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +92 -0
  123. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  124. data/ext/ffi_c/libffi/src/aarch64/sysv.S +440 -0
  125. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  126. data/ext/ffi_c/libffi/src/alpha/ffi.c +521 -0
  127. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +57 -0
  128. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  129. data/ext/ffi_c/libffi/src/alpha/osf.S +282 -0
  130. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  131. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  132. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  133. data/ext/ffi_c/libffi/src/arm/ffi.c +854 -0
  134. data/ext/ffi_c/libffi/src/arm/ffitarget.h +89 -0
  135. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  136. data/ext/ffi_c/libffi/src/arm/sysv.S +385 -0
  137. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  138. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  139. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +55 -0
  140. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  141. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  142. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  143. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  144. data/ext/ffi_c/libffi/src/closures.c +990 -0
  145. data/ext/ffi_c/libffi/src/cris/ffi.c +386 -0
  146. data/ext/ffi_c/libffi/src/cris/ffitarget.h +56 -0
  147. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  148. data/ext/ffi_c/libffi/src/debug.c +64 -0
  149. data/ext/ffi_c/libffi/src/dlmalloc.c +5166 -0
  150. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  151. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  152. data/ext/ffi_c/libffi/src/frv/ffitarget.h +62 -0
  153. data/ext/ffi_c/libffi/src/ia64/ffi.c +604 -0
  154. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +56 -0
  155. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  156. data/ext/ffi_c/libffi/src/ia64/unix.S +567 -0
  157. data/ext/ffi_c/libffi/src/java_raw_api.c +374 -0
  158. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  159. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +53 -0
  160. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  161. data/ext/ffi_c/libffi/src/m68k/ffi.c +362 -0
  162. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +54 -0
  163. data/ext/ffi_c/libffi/src/m68k/sysv.S +357 -0
  164. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  165. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  166. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  167. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  168. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  169. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  170. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  171. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  172. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  173. data/ext/ffi_c/libffi/src/mips/ffi.c +1130 -0
  174. data/ext/ffi_c/libffi/src/mips/ffitarget.h +244 -0
  175. data/ext/ffi_c/libffi/src/mips/n32.S +663 -0
  176. data/ext/ffi_c/libffi/src/mips/o32.S +502 -0
  177. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  178. data/ext/ffi_c/libffi/src/moxie/ffi.c +285 -0
  179. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  180. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  181. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  182. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  183. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  184. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  185. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  186. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  187. data/ext/ffi_c/libffi/src/pa/ffitarget.h +85 -0
  188. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  189. data/ext/ffi_c/libffi/src/pa/linux.S +378 -0
  190. data/ext/ffi_c/libffi/src/powerpc/aix.S +566 -0
  191. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +694 -0
  192. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  193. data/ext/ffi_c/libffi/src/powerpc/darwin.S +378 -0
  194. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +571 -0
  195. data/ext/ffi_c/libffi/src/powerpc/ffi.c +174 -0
  196. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1440 -0
  197. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1007 -0
  198. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  199. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  200. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +198 -0
  201. data/ext/ffi_c/libffi/src/powerpc/linux64.S +228 -0
  202. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +488 -0
  203. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +397 -0
  204. data/ext/ffi_c/libffi/src/powerpc/sysv.S +175 -0
  205. data/ext/ffi_c/libffi/src/prep_cif.c +263 -0
  206. data/ext/ffi_c/libffi/src/raw_api.c +267 -0
  207. data/ext/ffi_c/libffi/src/riscv/ffi.c +481 -0
  208. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  209. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  210. data/ext/ffi_c/libffi/src/s390/ffi.c +756 -0
  211. data/ext/ffi_c/libffi/src/s390/ffitarget.h +70 -0
  212. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  213. data/ext/ffi_c/libffi/src/s390/sysv.S +325 -0
  214. data/ext/ffi_c/libffi/src/sh/ffi.c +717 -0
  215. data/ext/ffi_c/libffi/src/sh/ffitarget.h +54 -0
  216. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  217. data/ext/ffi_c/libffi/src/sh64/ffi.c +469 -0
  218. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +58 -0
  219. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  220. data/ext/ffi_c/libffi/src/sparc/ffi.c +468 -0
  221. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  222. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +81 -0
  223. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  224. data/ext/ffi_c/libffi/src/sparc/v8.S +443 -0
  225. data/ext/ffi_c/libffi/src/sparc/v9.S +440 -0
  226. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  227. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  228. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  229. data/ext/ffi_c/libffi/src/types.c +108 -0
  230. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  231. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  232. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  233. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  234. data/ext/ffi_c/libffi/src/x86/ffi.c +761 -0
  235. data/ext/ffi_c/libffi/src/x86/ffi64.c +886 -0
  236. data/ext/ffi_c/libffi/src/x86/ffitarget.h +147 -0
  237. data/ext/ffi_c/libffi/src/x86/ffiw64.c +311 -0
  238. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  239. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  240. data/ext/ffi_c/libffi/src/x86/sysv.S +1129 -0
  241. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +995 -0
  242. data/ext/ffi_c/libffi/src/x86/unix64.S +566 -0
  243. data/ext/ffi_c/libffi/src/x86/win64.S +237 -0
  244. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  245. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  246. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  247. data/ext/ffi_c/libffi/src/xtensa/sysv.S +258 -0
  248. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  249. data/ext/ffi_c/libffi/testsuite/Makefile.am +119 -0
  250. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  251. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +657 -0
  252. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +283 -0
  253. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +58 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1745 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +743 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +43 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c +55 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +132 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +115 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +61 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +61 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +142 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +138 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +60 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +61 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +74 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +341 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +59 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  350. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  351. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  352. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +52 -0
  353. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  354. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  355. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +134 -0
  356. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  357. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  358. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  359. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  360. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  361. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  362. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  365. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  366. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  367. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  368. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  369. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  370. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +36 -0
  371. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  372. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  373. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  374. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  375. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  376. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  377. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  378. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  379. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  380. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  381. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  382. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  383. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  384. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  385. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  386. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  387. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  388. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  389. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  390. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  391. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  392. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +67 -0
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  395. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +60 -0
  396. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +64 -0
  397. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +66 -0
  398. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  399. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  400. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +81 -0
  401. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +68 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  403. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  404. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +117 -0
  405. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +54 -0
  406. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  407. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  408. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  409. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  410. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  411. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  412. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  415. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  419. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  421. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  422. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  423. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  424. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  425. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +36 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  430. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  431. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  432. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  433. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  434. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  435. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  436. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  441. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  442. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  443. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  444. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  445. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  446. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  457. data/ext/ffi_c/rbffi.h +55 -0
  458. data/ext/ffi_c/rbffi_endian.h +59 -0
  459. data/ext/ffi_c/win32/stdbool.h +8 -0
  460. data/ext/ffi_c/win32/stdint.h +201 -0
  461. data/ffi.gemspec +43 -0
  462. data/lib/ffi.rb +20 -0
  463. data/lib/ffi/autopointer.rb +203 -0
  464. data/lib/ffi/buffer.rb +4 -0
  465. data/lib/ffi/callback.rb +4 -0
  466. data/lib/ffi/data_converter.rb +67 -0
  467. data/lib/ffi/enum.rb +296 -0
  468. data/lib/ffi/errno.rb +43 -0
  469. data/lib/ffi/ffi.rb +45 -0
  470. data/lib/ffi/io.rb +62 -0
  471. data/lib/ffi/library.rb +588 -0
  472. data/lib/ffi/managedstruct.rb +84 -0
  473. data/lib/ffi/memorypointer.rb +1 -0
  474. data/lib/ffi/platform.rb +175 -0
  475. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  476. data/lib/ffi/platform/aarch64-freebsd12/types.conf +128 -0
  477. data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
  478. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  479. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  480. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  481. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  482. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  483. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  484. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  485. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  486. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  487. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  488. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  489. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  490. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  491. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  492. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  493. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  494. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  495. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  496. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  497. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  498. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  499. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  500. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  501. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  502. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  503. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  504. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  505. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  506. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  507. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  508. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  509. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  510. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  511. data/lib/ffi/platform/x86_64-darwin/types.conf +126 -0
  512. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +148 -0
  513. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  514. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  515. data/lib/ffi/platform/x86_64-linux/types.conf +111 -0
  516. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  517. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  518. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  519. data/lib/ffi/platform/x86_64-windows/types.conf +120 -0
  520. data/lib/ffi/pointer.rb +160 -0
  521. data/lib/ffi/struct.rb +311 -0
  522. data/lib/ffi/struct_by_reference.rb +72 -0
  523. data/lib/ffi/struct_layout.rb +96 -0
  524. data/lib/ffi/struct_layout_builder.rb +227 -0
  525. data/lib/ffi/tools/const_generator.rb +230 -0
  526. data/lib/ffi/tools/generator.rb +105 -0
  527. data/lib/ffi/tools/generator_task.rb +32 -0
  528. data/lib/ffi/tools/struct_generator.rb +194 -0
  529. data/lib/ffi/tools/types_generator.rb +135 -0
  530. data/lib/ffi/types.rb +194 -0
  531. data/lib/ffi/union.rb +43 -0
  532. data/lib/ffi/variadic.rb +78 -0
  533. data/lib/ffi/version.rb +3 -0
  534. data/samples/getlogin.rb +8 -0
  535. data/samples/getpid.rb +8 -0
  536. data/samples/gettimeofday.rb +18 -0
  537. data/samples/hello.rb +7 -0
  538. data/samples/inotify.rb +60 -0
  539. data/samples/pty.rb +76 -0
  540. data/samples/qsort.rb +21 -0
  541. data/samples/sample_helper.rb +6 -0
  542. metadata +677 -0
@@ -0,0 +1,311 @@
1
+ /* -----------------------------------------------------------------------
2
+ sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
3
+ Copyright (c) 2011 Plausible Labs Cooperative, Inc.
4
+ Copyright (c) 2019 Microsoft Corporation.
5
+
6
+ ARM Foreign Function Interface
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
+ #define LIBFFI_ASM
30
+ #include <fficonfig.h>
31
+ #include <ffi.h>
32
+ #include <ffi_cfi.h>
33
+ #include "internal.h"
34
+ #include "ksarm.h"
35
+
36
+
37
+ ; 8 byte aligned AREA to support 8 byte aligned jump tables
38
+ MACRO
39
+ NESTED_ENTRY_FFI $FuncName, $AreaName, $ExceptHandler
40
+
41
+ ; compute the function's labels
42
+ __DeriveFunctionLabels $FuncName
43
+
44
+ ; determine the area we will put the function into
45
+ __FuncArea SETS "|.text|"
46
+ IF "$AreaName" != ""
47
+ __FuncArea SETS "$AreaName"
48
+ ENDIF
49
+
50
+ ; set up the exception handler itself
51
+ __FuncExceptionHandler SETS ""
52
+ IF "$ExceptHandler" != ""
53
+ __FuncExceptionHandler SETS "|$ExceptHandler|"
54
+ ENDIF
55
+
56
+ ; switch to the specified area, jump tables require 8 byte alignment
57
+ AREA $__FuncArea,CODE,CODEALIGN,ALIGN=3,READONLY
58
+
59
+ ; export the function name
60
+ __ExportProc $FuncName
61
+
62
+ ; flush any pending literal pool stuff
63
+ ROUT
64
+
65
+ ; reset the state of the unwind code tracking
66
+ __ResetUnwindState
67
+
68
+ MEND
69
+
70
+ ; MACRO
71
+ ; TABLE_ENTRY $Type, $Table
72
+ ;$Type_$Table
73
+ ; MEND
74
+
75
+ #define E(index,table) return_##index##_##table
76
+
77
+ ; r0: stack
78
+ ; r1: frame
79
+ ; r2: fn
80
+ ; r3: vfp_used
81
+
82
+ ; fake entry point exists only to generate exists only to
83
+ ; generate .pdata for exception unwinding
84
+ NESTED_ENTRY_FFI ffi_call_VFP_fake
85
+ PROLOG_PUSH {r11, lr} ; save fp and lr for unwind
86
+
87
+ ALTERNATE_ENTRY ffi_call_VFP
88
+ cmp r3, #3 ; load only d0 if possible
89
+ vldrle d0, [r0]
90
+ vldmgt r0, {d0-d7}
91
+ add r0, r0, #64 ; discard the vfp register args
92
+ b ffi_call_SYSV
93
+ NESTED_END ffi_call_VFP_fake
94
+
95
+ ; fake entry point exists only to generate exists only to
96
+ ; generate .pdata for exception unwinding
97
+ NESTED_ENTRY_FFI ffi_call_SYSV_fake
98
+ PROLOG_PUSH {r11, lr} ; save fp and lr for unwind
99
+
100
+ ALTERNATE_ENTRY ffi_call_SYSV
101
+ stm r1, {fp, lr}
102
+ mov fp, r1
103
+
104
+ mov sp, r0 ; install the stack pointer
105
+ mov lr, r2 ; move the fn pointer out of the way
106
+ ldr ip, [fp, #16] ; install the static chain
107
+ ldmia sp!, {r0-r3} ; move first 4 parameters in registers.
108
+ blx lr ; call fn
109
+
110
+ ; Load r2 with the pointer to storage for the return value
111
+ ; Load r3 with the return type code
112
+ ldr r2, [fp, #8]
113
+ ldr r3, [fp, #12]
114
+
115
+ ; Deallocate the stack with the arguments.
116
+ mov sp, fp
117
+
118
+ ; Store values stored in registers.
119
+ ALIGN 8
120
+ lsl r3, #3
121
+ add r3, r3, pc
122
+ add r3, #8
123
+ mov pc, r3
124
+
125
+
126
+ E(ARM_TYPE_VFP_S, ffi_call)
127
+ ALIGN 8
128
+ vstr s0, [r2]
129
+ pop {fp,pc}
130
+ E(ARM_TYPE_VFP_D, ffi_call)
131
+ ALIGN 8
132
+ vstr d0, [r2]
133
+ pop {fp,pc}
134
+ E(ARM_TYPE_VFP_N, ffi_call)
135
+ ALIGN 8
136
+ vstm r2, {d0-d3}
137
+ pop {fp,pc}
138
+ E(ARM_TYPE_INT64, ffi_call)
139
+ ALIGN 8
140
+ str r1, [r2, #4]
141
+ nop
142
+ E(ARM_TYPE_INT, ffi_call)
143
+ ALIGN 8
144
+ str r0, [r2]
145
+ pop {fp,pc}
146
+ E(ARM_TYPE_VOID, ffi_call)
147
+ ALIGN 8
148
+ pop {fp,pc}
149
+ nop
150
+ E(ARM_TYPE_STRUCT, ffi_call)
151
+ ALIGN 8
152
+ cmp r3, #ARM_TYPE_STRUCT
153
+ pop {fp,pc}
154
+ NESTED_END ffi_call_SYSV_fake
155
+
156
+ IMPORT |ffi_closure_inner_SYSV|
157
+ /*
158
+ int ffi_closure_inner_SYSV
159
+ (
160
+ cif, ; r0
161
+ fun, ; r1
162
+ user_data, ; r2
163
+ frame ; r3
164
+ )
165
+ */
166
+
167
+ NESTED_ENTRY_FFI ffi_go_closure_SYSV
168
+ stmdb sp!, {r0-r3} ; save argument regs
169
+ ldr r0, [ip, #4] ; load cif
170
+ ldr r1, [ip, #8] ; load fun
171
+ mov r2, ip ; load user_data
172
+ b ffi_go_closure_SYSV_0
173
+ NESTED_END ffi_go_closure_SYSV
174
+
175
+ ; r3: ffi_closure
176
+
177
+ ; fake entry point exists only to generate exists only to
178
+ ; generate .pdata for exception unwinding
179
+ NESTED_ENTRY_FFI ffi_closure_SYSV_fake
180
+ PROLOG_PUSH {r11, lr} ; save fp and lr for unwind
181
+ ALTERNATE_ENTRY ffi_closure_SYSV
182
+ ldmfd sp!, {ip,r0} ; restore fp (r0 is used for stack alignment)
183
+ stmdb sp!, {r0-r3} ; save argument regs
184
+
185
+ ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] ; ffi_closure->cif
186
+ ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] ; ffi_closure->fun
187
+ ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] ; ffi_closure->user_data
188
+
189
+ ALTERNATE_ENTRY ffi_go_closure_SYSV_0
190
+ add ip, sp, #16 ; compute entry sp
191
+
192
+ sub sp, sp, #64+32 ; allocate frame parameter (sizeof(vfp_space) = 64, sizeof(result) = 32)
193
+ mov r3, sp ; set frame parameter
194
+ stmdb sp!, {ip,lr}
195
+
196
+ bl ffi_closure_inner_SYSV ; call the Python closure
197
+
198
+ ; Load values returned in registers.
199
+ add r2, sp, #64+8 ; address of closure_frame->result
200
+ bl ffi_closure_ret ; move result to correct register or memory for type
201
+
202
+ ldmfd sp!, {ip,lr}
203
+ mov sp, ip ; restore stack pointer
204
+ mov pc, lr
205
+ NESTED_END ffi_closure_SYSV_fake
206
+
207
+ IMPORT |ffi_closure_inner_VFP|
208
+ /*
209
+ int ffi_closure_inner_VFP
210
+ (
211
+ cif, ; r0
212
+ fun, ; r1
213
+ user_data, ; r2
214
+ frame ; r3
215
+ )
216
+ */
217
+
218
+ NESTED_ENTRY_FFI ffi_go_closure_VFP
219
+ stmdb sp!, {r0-r3} ; save argument regs
220
+ ldr r0, [ip, #4] ; load cif
221
+ ldr r1, [ip, #8] ; load fun
222
+ mov r2, ip ; load user_data
223
+ b ffi_go_closure_VFP_0
224
+ NESTED_END ffi_go_closure_VFP
225
+
226
+ ; fake entry point exists only to generate exists only to
227
+ ; generate .pdata for exception unwinding
228
+ ; r3: closure
229
+ NESTED_ENTRY_FFI ffi_closure_VFP_fake
230
+ PROLOG_PUSH {r11, lr} ; save fp and lr for unwind
231
+
232
+ ALTERNATE_ENTRY ffi_closure_VFP
233
+ ldmfd sp!, {ip,r0} ; restore fp (r0 is used for stack alignment)
234
+ stmdb sp!, {r0-r3} ; save argument regs
235
+
236
+ ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] ; load cif
237
+ ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] ; load fun
238
+ ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] ; load user_data
239
+
240
+ ALTERNATE_ENTRY ffi_go_closure_VFP_0
241
+ add ip, sp, #16 ; compute entry sp
242
+ sub sp, sp, #32 ; save space for closure_frame->result
243
+ vstmdb sp!, {d0-d7} ; push closure_frame->vfp_space
244
+
245
+ mov r3, sp ; save closure_frame
246
+ stmdb sp!, {ip,lr}
247
+
248
+ bl ffi_closure_inner_VFP
249
+
250
+ ; Load values returned in registers.
251
+ add r2, sp, #64+8 ; load result
252
+ bl ffi_closure_ret
253
+ ldmfd sp!, {ip,lr}
254
+ mov sp, ip ; restore stack pointer
255
+ mov pc, lr
256
+ NESTED_END ffi_closure_VFP_fake
257
+
258
+ /* Load values returned in registers for both closure entry points.
259
+ Note that we use LDM with SP in the register set. This is deprecated
260
+ by ARM, but not yet unpredictable. */
261
+
262
+ NESTED_ENTRY_FFI ffi_closure_ret
263
+ stmdb sp!, {fp,lr}
264
+
265
+ ALIGN 8
266
+ lsl r0, #3
267
+ add r0, r0, pc
268
+ add r0, #8
269
+ mov pc, r0
270
+
271
+ E(ARM_TYPE_VFP_S, ffi_closure)
272
+ ALIGN 8
273
+ vldr s0, [r2]
274
+ b call_epilogue
275
+ E(ARM_TYPE_VFP_D, ffi_closure)
276
+ ALIGN 8
277
+ vldr d0, [r2]
278
+ b call_epilogue
279
+ E(ARM_TYPE_VFP_N, ffi_closure)
280
+ ALIGN 8
281
+ vldm r2, {d0-d3}
282
+ b call_epilogue
283
+ E(ARM_TYPE_INT64, ffi_closure)
284
+ ALIGN 8
285
+ ldr r1, [r2, #4]
286
+ nop
287
+ E(ARM_TYPE_INT, ffi_closure)
288
+ ALIGN 8
289
+ ldr r0, [r2]
290
+ b call_epilogue
291
+ E(ARM_TYPE_VOID, ffi_closure)
292
+ ALIGN 8
293
+ b call_epilogue
294
+ nop
295
+ E(ARM_TYPE_STRUCT, ffi_closure)
296
+ ALIGN 8
297
+ b call_epilogue
298
+ call_epilogue
299
+ ldmfd sp!, {fp,pc}
300
+ NESTED_END ffi_closure_ret
301
+
302
+ AREA |.trampoline|, DATA, THUMB, READONLY
303
+ EXPORT |ffi_arm_trampoline|
304
+ |ffi_arm_trampoline| DATA
305
+ thisproc adr ip, thisproc
306
+ stmdb sp!, {ip, r0}
307
+ ldr pc, [pc, #0]
308
+ DCD 0
309
+ ;ENDP
310
+
311
+ END
@@ -0,0 +1,423 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffi.c - Copyright (c) 2011 Anthony Green
3
+ Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
4
+
5
+ AVR32 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
+ #include <ffi.h>
29
+ #include <ffi_common.h>
30
+
31
+ #include <stdlib.h>
32
+ #include <stdio.h>
33
+ #include <unistd.h>
34
+ #include <asm/unistd.h>
35
+
36
+ /* #define DEBUG */
37
+
38
+ extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
39
+ unsigned int, unsigned int, unsigned int*, unsigned int,
40
+ void (*fn)(void));
41
+ extern void ffi_closure_SYSV (ffi_closure *);
42
+
43
+ unsigned int pass_struct_on_stack(ffi_type *type)
44
+ {
45
+ if(type->type != FFI_TYPE_STRUCT)
46
+ return 0;
47
+
48
+ if(type->alignment < type->size &&
49
+ !(type->size == 4 || type->size == 8) &&
50
+ !(type->size == 8 && type->alignment >= 4))
51
+ return 1;
52
+
53
+ if(type->size == 3 || type->size == 5 || type->size == 6 ||
54
+ type->size == 7)
55
+ return 1;
56
+
57
+ return 0;
58
+ }
59
+
60
+ /* ffi_prep_args is called by the assembly routine once stack space
61
+ * has been allocated for the function's arguments
62
+ *
63
+ * This is annoyingly complex since we need to keep track of used
64
+ * registers.
65
+ */
66
+
67
+ void ffi_prep_args(char *stack, extended_cif *ecif)
68
+ {
69
+ unsigned int i;
70
+ void **p_argv;
71
+ ffi_type **p_arg;
72
+ char *reg_base = stack;
73
+ char *stack_base = stack + 20;
74
+ unsigned int stack_offset = 0;
75
+ unsigned int reg_mask = 0;
76
+
77
+ p_argv = ecif->avalue;
78
+
79
+ /* If cif->flags is struct then we know it's not passed in registers */
80
+ if(ecif->cif->flags == FFI_TYPE_STRUCT)
81
+ {
82
+ *(void**)reg_base = ecif->rvalue;
83
+ reg_mask |= 1;
84
+ }
85
+
86
+ for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
87
+ i++, p_arg++)
88
+ {
89
+ size_t z = (*p_arg)->size;
90
+ int alignment = (*p_arg)->alignment;
91
+ int type = (*p_arg)->type;
92
+ char *addr = 0;
93
+
94
+ if(z % 4 != 0)
95
+ z += (4 - z % 4);
96
+
97
+ if(reg_mask != 0x1f)
98
+ {
99
+ if(pass_struct_on_stack(*p_arg))
100
+ {
101
+ addr = stack_base + stack_offset;
102
+ stack_offset += z;
103
+ }
104
+ else if(z == sizeof(int))
105
+ {
106
+ char index = 0;
107
+
108
+ while((reg_mask >> index) & 1)
109
+ index++;
110
+
111
+ addr = reg_base + (index * 4);
112
+ reg_mask |= (1 << index);
113
+ }
114
+ else if(z == 2 * sizeof(int))
115
+ {
116
+ if(!((reg_mask >> 1) & 1))
117
+ {
118
+ addr = reg_base + 4;
119
+ reg_mask |= (3 << 1);
120
+ }
121
+ else if(!((reg_mask >> 3) & 1))
122
+ {
123
+ addr = reg_base + 12;
124
+ reg_mask |= (3 << 3);
125
+ }
126
+ }
127
+ }
128
+
129
+ if(!addr)
130
+ {
131
+ addr = stack_base + stack_offset;
132
+ stack_offset += z;
133
+ }
134
+
135
+ if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL)
136
+ type = (*p_arg)->elements[0]->type;
137
+
138
+ switch(type)
139
+ {
140
+ case FFI_TYPE_UINT8:
141
+ *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv);
142
+ break;
143
+ case FFI_TYPE_SINT8:
144
+ *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv);
145
+ break;
146
+ case FFI_TYPE_UINT16:
147
+ *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv);
148
+ break;
149
+ case FFI_TYPE_SINT16:
150
+ *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv);
151
+ break;
152
+ default:
153
+ memcpy(addr, *p_argv, z);
154
+ }
155
+
156
+ p_argv++;
157
+ }
158
+
159
+ #ifdef DEBUG
160
+ /* Debugging */
161
+ for(i = 0; i < 5; i++)
162
+ {
163
+ if((reg_mask & (1 << i)) == 0)
164
+ printf("r%d: (unused)\n", 12 - i);
165
+ else
166
+ printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]);
167
+ }
168
+
169
+ for(i = 0; i < stack_offset / 4; i++)
170
+ {
171
+ printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]);
172
+ }
173
+ #endif
174
+ }
175
+
176
+ /* Perform machine dependent cif processing */
177
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
178
+ {
179
+ /* Round the stack up to a multiple of 8 bytes. This isn't needed
180
+ * everywhere, but it is on some platforms, and it doesn't harm
181
+ * anything when it isn't needed. */
182
+ cif->bytes = (cif->bytes + 7) & ~7;
183
+
184
+ /* Flag to indicate that he return value is in fact a struct */
185
+ cif->rstruct_flag = 0;
186
+
187
+ /* Set the return type flag */
188
+ switch(cif->rtype->type)
189
+ {
190
+ case FFI_TYPE_SINT8:
191
+ case FFI_TYPE_UINT8:
192
+ cif->flags = (unsigned)FFI_TYPE_UINT8;
193
+ break;
194
+ case FFI_TYPE_SINT16:
195
+ case FFI_TYPE_UINT16:
196
+ cif->flags = (unsigned)FFI_TYPE_UINT16;
197
+ break;
198
+ case FFI_TYPE_FLOAT:
199
+ case FFI_TYPE_SINT32:
200
+ case FFI_TYPE_UINT32:
201
+ case FFI_TYPE_POINTER:
202
+ cif->flags = (unsigned)FFI_TYPE_UINT32;
203
+ break;
204
+ case FFI_TYPE_DOUBLE:
205
+ case FFI_TYPE_SINT64:
206
+ case FFI_TYPE_UINT64:
207
+ cif->flags = (unsigned)FFI_TYPE_UINT64;
208
+ break;
209
+ case FFI_TYPE_STRUCT:
210
+ cif->rstruct_flag = 1;
211
+ if(!pass_struct_on_stack(cif->rtype))
212
+ {
213
+ if(cif->rtype->size <= 1)
214
+ cif->flags = (unsigned)FFI_TYPE_UINT8;
215
+ else if(cif->rtype->size <= 2)
216
+ cif->flags = (unsigned)FFI_TYPE_UINT16;
217
+ else if(cif->rtype->size <= 4)
218
+ cif->flags = (unsigned)FFI_TYPE_UINT32;
219
+ else if(cif->rtype->size <= 8)
220
+ cif->flags = (unsigned)FFI_TYPE_UINT64;
221
+ else
222
+ cif->flags = (unsigned)cif->rtype->type;
223
+ }
224
+ else
225
+ cif->flags = (unsigned)cif->rtype->type;
226
+ break;
227
+ default:
228
+ cif->flags = (unsigned)cif->rtype->type;
229
+ break;
230
+ }
231
+
232
+ return FFI_OK;
233
+ }
234
+
235
+ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
236
+ {
237
+ extended_cif ecif;
238
+
239
+ unsigned int size = 0, i = 0;
240
+ ffi_type **p_arg;
241
+
242
+ ecif.cif = cif;
243
+ ecif.avalue = avalue;
244
+
245
+ for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
246
+ size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
247
+
248
+ /* If the return value is a struct and we don't have a return value
249
+ * address then we need to make one */
250
+
251
+ /* If cif->flags is struct then it's not suitable for registers */
252
+ if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT))
253
+ ecif.rvalue = alloca(cif->rtype->size);
254
+ else
255
+ ecif.rvalue = rvalue;
256
+
257
+ switch(cif->abi)
258
+ {
259
+ case FFI_SYSV:
260
+ ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags,
261
+ ecif.rvalue, cif->rstruct_flag, fn);
262
+ break;
263
+ default:
264
+ FFI_ASSERT(0);
265
+ break;
266
+ }
267
+ }
268
+
269
+ static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
270
+ void **avalue, ffi_cif *cif)
271
+ {
272
+ register unsigned int i, reg_mask = 0;
273
+ register void **p_argv;
274
+ register ffi_type **p_arg;
275
+ register char *reg_base = stack;
276
+ register char *stack_base = stack + 20;
277
+ register unsigned int stack_offset = 0;
278
+
279
+ #ifdef DEBUG
280
+ /* Debugging */
281
+ for(i = 0; i < cif->nargs + 7; i++)
282
+ {
283
+ printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]);
284
+ }
285
+ #endif
286
+
287
+ /* If cif->flags is struct then we know it's not passed in registers */
288
+ if(cif->flags == FFI_TYPE_STRUCT)
289
+ {
290
+ *rvalue = *(void **)reg_base;
291
+ reg_mask |= 1;
292
+ }
293
+
294
+ p_argv = avalue;
295
+
296
+ for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
297
+ {
298
+ size_t z = (*p_arg)->size;
299
+ int alignment = (*p_arg)->alignment;
300
+
301
+ *p_argv = 0;
302
+
303
+ if(z % 4 != 0)
304
+ z += (4 - z % 4);
305
+
306
+ if(reg_mask != 0x1f)
307
+ {
308
+ if(pass_struct_on_stack(*p_arg))
309
+ {
310
+ *p_argv = (void*)stack_base + stack_offset;
311
+ stack_offset += z;
312
+ }
313
+ else if(z <= sizeof(int))
314
+ {
315
+ char index = 0;
316
+
317
+ while((reg_mask >> index) & 1)
318
+ index++;
319
+
320
+ *p_argv = (void*)reg_base + (index * 4);
321
+ reg_mask |= (1 << index);
322
+ }
323
+ else if(z == 2 * sizeof(int))
324
+ {
325
+ if(!((reg_mask >> 1) & 1))
326
+ {
327
+ *p_argv = (void*)reg_base + 4;
328
+ reg_mask |= (3 << 1);
329
+ }
330
+ else if(!((reg_mask >> 3) & 1))
331
+ {
332
+ *p_argv = (void*)reg_base + 12;
333
+ reg_mask |= (3 << 3);
334
+ }
335
+ }
336
+ }
337
+
338
+ if(!*p_argv)
339
+ {
340
+ *p_argv = (void*)stack_base + stack_offset;
341
+ stack_offset += z;
342
+ }
343
+
344
+ if((*p_arg)->type != FFI_TYPE_STRUCT ||
345
+ (*p_arg)->elements[1] == NULL)
346
+ {
347
+ if(alignment == 1)
348
+ **(unsigned int**)p_argv <<= 24;
349
+ else if(alignment == 2)
350
+ **(unsigned int**)p_argv <<= 16;
351
+ }
352
+
353
+ p_argv++;
354
+ }
355
+
356
+ #ifdef DEBUG
357
+ /* Debugging */
358
+ for(i = 0; i < cif->nargs; i++)
359
+ {
360
+ printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i]));
361
+ }
362
+ #endif
363
+ }
364
+
365
+ /* This function is jumped to by the trampoline */
366
+
367
+ unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp,
368
+ void *args)
369
+ {
370
+ ffi_cif *cif;
371
+ void **arg_area;
372
+ unsigned int i, size = 0;
373
+ ffi_type **p_arg;
374
+
375
+ cif = closure->cif;
376
+
377
+ for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
378
+ size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
379
+
380
+ arg_area = (void **)alloca(size);
381
+
382
+ /* this call will initialize ARG_AREA, such that each element in that
383
+ * array points to the corresponding value on the stack; and if the
384
+ * function returns a structure, it will re-set RESP to point to the
385
+ * structure return address. */
386
+
387
+ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
388
+
389
+ (closure->fun)(cif, *respp, arg_area, closure->user_data);
390
+
391
+ return cif->flags;
392
+ }
393
+
394
+ ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif,
395
+ void (*fun)(ffi_cif*, void*, void**, void*), void *user_data,
396
+ void *codeloc)
397
+ {
398
+ if (cif->abi != FFI_SYSV)
399
+ return FFI_BAD_ABI;
400
+
401
+ unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]);
402
+ unsigned int __fun = (unsigned int)(&ffi_closure_SYSV);
403
+ unsigned int __ctx = (unsigned int)(codeloc);
404
+ unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag);
405
+ unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner);
406
+ *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */
407
+ *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */
408
+ *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */
409
+ *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */
410
+ *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */
411
+ *(unsigned int*) &__tramp[20] = __ctx;
412
+ *(unsigned int*) &__tramp[24] = __rstruct_flag;
413
+ *(unsigned int*) &__tramp[28] = __inner;
414
+ *(unsigned int*) &__tramp[32] = __fun;
415
+ syscall(__NR_cacheflush, 0, (&__tramp[0]), 36);
416
+
417
+ closure->cif = cif;
418
+ closure->user_data = user_data;
419
+ closure->fun = fun;
420
+
421
+ return FFI_OK;
422
+ }
423
+