ffi 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
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,1007 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffi_linux64.c - Copyright (C) 2013 IBM
3
+ Copyright (C) 2011 Anthony Green
4
+ Copyright (C) 2011 Kyle Moffett
5
+ Copyright (C) 2008 Red Hat, Inc
6
+ Copyright (C) 2007, 2008 Free Software Foundation, Inc
7
+ Copyright (c) 1998 Geoffrey Keating
8
+
9
+ PowerPC Foreign Function Interface
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining
12
+ a copy of this software and associated documentation files (the
13
+ ``Software''), to deal in the Software without restriction, including
14
+ without limitation the rights to use, copy, modify, merge, publish,
15
+ distribute, sublicense, and/or sell copies of the Software, and to
16
+ permit persons to whom the Software is furnished to do so, subject to
17
+ the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included
20
+ in all copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
23
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
26
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28
+ OTHER DEALINGS IN THE SOFTWARE.
29
+ ----------------------------------------------------------------------- */
30
+
31
+ #include "ffi.h"
32
+
33
+ #ifdef POWERPC64
34
+ #include "ffi_common.h"
35
+ #include "ffi_powerpc.h"
36
+
37
+
38
+ /* About the LINUX64 ABI. */
39
+ enum {
40
+ NUM_GPR_ARG_REGISTERS64 = 8,
41
+ NUM_FPR_ARG_REGISTERS64 = 13
42
+ };
43
+ enum { ASM_NEEDS_REGISTERS64 = 4 };
44
+
45
+
46
+ #if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
47
+ /* Adjust size of ffi_type_longdouble. */
48
+ void FFI_HIDDEN
49
+ ffi_prep_types_linux64 (ffi_abi abi)
50
+ {
51
+ if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX)
52
+ {
53
+ ffi_type_longdouble.size = 8;
54
+ ffi_type_longdouble.alignment = 8;
55
+ }
56
+ else
57
+ {
58
+ ffi_type_longdouble.size = 16;
59
+ ffi_type_longdouble.alignment = 16;
60
+ }
61
+ }
62
+ #endif
63
+
64
+
65
+ static unsigned int
66
+ discover_homogeneous_aggregate (ffi_abi abi,
67
+ const ffi_type *t,
68
+ unsigned int *elnum)
69
+ {
70
+ switch (t->type)
71
+ {
72
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
73
+ case FFI_TYPE_LONGDOUBLE:
74
+ /* 64-bit long doubles are equivalent to doubles. */
75
+ if ((abi & FFI_LINUX_LONG_DOUBLE_128) == 0)
76
+ {
77
+ *elnum = 1;
78
+ return FFI_TYPE_DOUBLE;
79
+ }
80
+ /* IBM extended precision values use unaligned pairs
81
+ of FPRs, but according to the ABI must be considered
82
+ distinct from doubles. They are also limited to a
83
+ maximum of four members in a homogeneous aggregate. */
84
+ else
85
+ {
86
+ *elnum = 2;
87
+ return FFI_TYPE_LONGDOUBLE;
88
+ }
89
+ #endif
90
+ case FFI_TYPE_FLOAT:
91
+ case FFI_TYPE_DOUBLE:
92
+ *elnum = 1;
93
+ return (int) t->type;
94
+
95
+ case FFI_TYPE_STRUCT:;
96
+ {
97
+ unsigned int base_elt = 0, total_elnum = 0;
98
+ ffi_type **el = t->elements;
99
+ while (*el)
100
+ {
101
+ unsigned int el_elt, el_elnum = 0;
102
+ el_elt = discover_homogeneous_aggregate (abi, *el, &el_elnum);
103
+ if (el_elt == 0
104
+ || (base_elt && base_elt != el_elt))
105
+ return 0;
106
+ base_elt = el_elt;
107
+ total_elnum += el_elnum;
108
+ #if _CALL_ELF == 2
109
+ if (total_elnum > 8)
110
+ return 0;
111
+ #else
112
+ if (total_elnum > 1)
113
+ return 0;
114
+ #endif
115
+ el++;
116
+ }
117
+ *elnum = total_elnum;
118
+ return base_elt;
119
+ }
120
+
121
+ default:
122
+ return 0;
123
+ }
124
+ }
125
+
126
+
127
+ /* Perform machine dependent cif processing */
128
+ static ffi_status
129
+ ffi_prep_cif_linux64_core (ffi_cif *cif)
130
+ {
131
+ ffi_type **ptr;
132
+ unsigned bytes;
133
+ unsigned i, fparg_count = 0, intarg_count = 0;
134
+ unsigned flags = cif->flags;
135
+ unsigned elt, elnum, rtype;
136
+
137
+ #if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE
138
+ /* If compiled without long double support.. */
139
+ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
140
+ return FFI_BAD_ABI;
141
+ #endif
142
+
143
+ /* The machine-independent calculation of cif->bytes doesn't work
144
+ for us. Redo the calculation. */
145
+ #if _CALL_ELF == 2
146
+ /* Space for backchain, CR, LR, TOC and the asm's temp regs. */
147
+ bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long);
148
+
149
+ /* Space for the general registers. */
150
+ bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long);
151
+ #else
152
+ /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp
153
+ regs. */
154
+ bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long);
155
+
156
+ /* Space for the mandatory parm save area and general registers. */
157
+ bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long);
158
+ #endif
159
+
160
+ /* Return value handling. */
161
+ rtype = cif->rtype->type;
162
+ #if _CALL_ELF == 2
163
+ homogeneous:
164
+ #endif
165
+ switch (rtype)
166
+ {
167
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
168
+ case FFI_TYPE_LONGDOUBLE:
169
+ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
170
+ flags |= FLAG_RETURNS_128BITS;
171
+ /* Fall through. */
172
+ #endif
173
+ case FFI_TYPE_DOUBLE:
174
+ flags |= FLAG_RETURNS_64BITS;
175
+ /* Fall through. */
176
+ case FFI_TYPE_FLOAT:
177
+ flags |= FLAG_RETURNS_FP;
178
+ break;
179
+
180
+ case FFI_TYPE_UINT128:
181
+ flags |= FLAG_RETURNS_128BITS;
182
+ /* Fall through. */
183
+ case FFI_TYPE_UINT64:
184
+ case FFI_TYPE_SINT64:
185
+ case FFI_TYPE_POINTER:
186
+ flags |= FLAG_RETURNS_64BITS;
187
+ break;
188
+
189
+ case FFI_TYPE_STRUCT:
190
+ #if _CALL_ELF == 2
191
+ elt = discover_homogeneous_aggregate (cif->abi, cif->rtype, &elnum);
192
+ if (elt)
193
+ {
194
+ flags |= FLAG_RETURNS_SMST;
195
+ rtype = elt;
196
+ goto homogeneous;
197
+ }
198
+ if (cif->rtype->size <= 16)
199
+ {
200
+ flags |= FLAG_RETURNS_SMST;
201
+ break;
202
+ }
203
+ #endif
204
+ intarg_count++;
205
+ flags |= FLAG_RETVAL_REFERENCE;
206
+ /* Fall through. */
207
+ case FFI_TYPE_VOID:
208
+ flags |= FLAG_RETURNS_NOTHING;
209
+ break;
210
+
211
+ default:
212
+ /* Returns 32-bit integer, or similar. Nothing to do here. */
213
+ break;
214
+ }
215
+
216
+ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
217
+ {
218
+ unsigned int align;
219
+
220
+ switch ((*ptr)->type)
221
+ {
222
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
223
+ case FFI_TYPE_LONGDOUBLE:
224
+ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
225
+ {
226
+ fparg_count++;
227
+ intarg_count++;
228
+ }
229
+ /* Fall through. */
230
+ #endif
231
+ case FFI_TYPE_DOUBLE:
232
+ case FFI_TYPE_FLOAT:
233
+ fparg_count++;
234
+ intarg_count++;
235
+ if (fparg_count > NUM_FPR_ARG_REGISTERS64)
236
+ flags |= FLAG_ARG_NEEDS_PSAVE;
237
+ break;
238
+
239
+ case FFI_TYPE_STRUCT:
240
+ if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0)
241
+ {
242
+ align = (*ptr)->alignment;
243
+ if (align > 16)
244
+ align = 16;
245
+ align = align / 8;
246
+ if (align > 1)
247
+ intarg_count = FFI_ALIGN (intarg_count, align);
248
+ }
249
+ intarg_count += ((*ptr)->size + 7) / 8;
250
+ elt = discover_homogeneous_aggregate (cif->abi, *ptr, &elnum);
251
+ if (elt)
252
+ {
253
+ fparg_count += elnum;
254
+ if (fparg_count > NUM_FPR_ARG_REGISTERS64)
255
+ flags |= FLAG_ARG_NEEDS_PSAVE;
256
+ }
257
+ else
258
+ {
259
+ if (intarg_count > NUM_GPR_ARG_REGISTERS64)
260
+ flags |= FLAG_ARG_NEEDS_PSAVE;
261
+ }
262
+ break;
263
+
264
+ case FFI_TYPE_POINTER:
265
+ case FFI_TYPE_UINT64:
266
+ case FFI_TYPE_SINT64:
267
+ case FFI_TYPE_INT:
268
+ case FFI_TYPE_UINT32:
269
+ case FFI_TYPE_SINT32:
270
+ case FFI_TYPE_UINT16:
271
+ case FFI_TYPE_SINT16:
272
+ case FFI_TYPE_UINT8:
273
+ case FFI_TYPE_SINT8:
274
+ /* Everything else is passed as a 8-byte word in a GPR, either
275
+ the object itself or a pointer to it. */
276
+ intarg_count++;
277
+ if (intarg_count > NUM_GPR_ARG_REGISTERS64)
278
+ flags |= FLAG_ARG_NEEDS_PSAVE;
279
+ break;
280
+ default:
281
+ FFI_ASSERT (0);
282
+ }
283
+ }
284
+
285
+ if (fparg_count != 0)
286
+ flags |= FLAG_FP_ARGUMENTS;
287
+ if (intarg_count > 4)
288
+ flags |= FLAG_4_GPR_ARGUMENTS;
289
+
290
+ /* Space for the FPR registers, if needed. */
291
+ if (fparg_count != 0)
292
+ bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double);
293
+
294
+ /* Stack space. */
295
+ #if _CALL_ELF == 2
296
+ if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0)
297
+ bytes += intarg_count * sizeof (long);
298
+ #else
299
+ if (intarg_count > NUM_GPR_ARG_REGISTERS64)
300
+ bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long);
301
+ #endif
302
+
303
+ /* The stack space allocated needs to be a multiple of 16 bytes. */
304
+ bytes = (bytes + 15) & ~0xF;
305
+
306
+ cif->flags = flags;
307
+ cif->bytes = bytes;
308
+
309
+ return FFI_OK;
310
+ }
311
+
312
+ ffi_status FFI_HIDDEN
313
+ ffi_prep_cif_linux64 (ffi_cif *cif)
314
+ {
315
+ if ((cif->abi & FFI_LINUX) != 0)
316
+ cif->nfixedargs = cif->nargs;
317
+ #if _CALL_ELF != 2
318
+ else if (cif->abi == FFI_COMPAT_LINUX64)
319
+ {
320
+ /* This call is from old code. Don't touch cif->nfixedargs
321
+ since old code will be using a smaller cif. */
322
+ cif->flags |= FLAG_COMPAT;
323
+ /* Translate to new abi value. */
324
+ cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128;
325
+ }
326
+ #endif
327
+ else
328
+ return FFI_BAD_ABI;
329
+ return ffi_prep_cif_linux64_core (cif);
330
+ }
331
+
332
+ ffi_status FFI_HIDDEN
333
+ ffi_prep_cif_linux64_var (ffi_cif *cif,
334
+ unsigned int nfixedargs,
335
+ unsigned int ntotalargs MAYBE_UNUSED)
336
+ {
337
+ if ((cif->abi & FFI_LINUX) != 0)
338
+ cif->nfixedargs = nfixedargs;
339
+ #if _CALL_ELF != 2
340
+ else if (cif->abi == FFI_COMPAT_LINUX64)
341
+ {
342
+ /* This call is from old code. Don't touch cif->nfixedargs
343
+ since old code will be using a smaller cif. */
344
+ cif->flags |= FLAG_COMPAT;
345
+ /* Translate to new abi value. */
346
+ cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128;
347
+ }
348
+ #endif
349
+ else
350
+ return FFI_BAD_ABI;
351
+ #if _CALL_ELF == 2
352
+ cif->flags |= FLAG_ARG_NEEDS_PSAVE;
353
+ #endif
354
+ return ffi_prep_cif_linux64_core (cif);
355
+ }
356
+
357
+
358
+ /* ffi_prep_args64 is called by the assembly routine once stack space
359
+ has been allocated for the function's arguments.
360
+
361
+ The stack layout we want looks like this:
362
+
363
+ | Ret addr from ffi_call_LINUX64 8bytes | higher addresses
364
+ |--------------------------------------------|
365
+ | CR save area 8bytes |
366
+ |--------------------------------------------|
367
+ | Previous backchain pointer 8 | stack pointer here
368
+ |--------------------------------------------|<+ <<< on entry to
369
+ | Saved r28-r31 4*8 | | ffi_call_LINUX64
370
+ |--------------------------------------------| |
371
+ | GPR registers r3-r10 8*8 | |
372
+ |--------------------------------------------| |
373
+ | FPR registers f1-f13 (optional) 13*8 | |
374
+ |--------------------------------------------| |
375
+ | Parameter save area | |
376
+ |--------------------------------------------| |
377
+ | TOC save area 8 | |
378
+ |--------------------------------------------| | stack |
379
+ | Linker doubleword 8 | | grows |
380
+ |--------------------------------------------| | down V
381
+ | Compiler doubleword 8 | |
382
+ |--------------------------------------------| | lower addresses
383
+ | Space for callee's LR 8 | |
384
+ |--------------------------------------------| |
385
+ | CR save area 8 | |
386
+ |--------------------------------------------| | stack pointer here
387
+ | Current backchain pointer 8 |-/ during
388
+ |--------------------------------------------| <<< ffi_call_LINUX64
389
+
390
+ */
391
+
392
+ void FFI_HIDDEN
393
+ ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack)
394
+ {
395
+ const unsigned long bytes = ecif->cif->bytes;
396
+ const unsigned long flags = ecif->cif->flags;
397
+
398
+ typedef union
399
+ {
400
+ char *c;
401
+ unsigned long *ul;
402
+ float *f;
403
+ double *d;
404
+ size_t p;
405
+ } valp;
406
+
407
+ /* 'stacktop' points at the previous backchain pointer. */
408
+ valp stacktop;
409
+
410
+ /* 'next_arg' points at the space for gpr3, and grows upwards as
411
+ we use GPR registers, then continues at rest. */
412
+ valp gpr_base;
413
+ valp gpr_end;
414
+ valp rest;
415
+ valp next_arg;
416
+
417
+ /* 'fpr_base' points at the space for f1, and grows upwards as
418
+ we use FPR registers. */
419
+ valp fpr_base;
420
+ unsigned int fparg_count;
421
+
422
+ unsigned int i, words, nargs, nfixedargs;
423
+ ffi_type **ptr;
424
+ double double_tmp;
425
+ union
426
+ {
427
+ void **v;
428
+ char **c;
429
+ signed char **sc;
430
+ unsigned char **uc;
431
+ signed short **ss;
432
+ unsigned short **us;
433
+ signed int **si;
434
+ unsigned int **ui;
435
+ unsigned long **ul;
436
+ float **f;
437
+ double **d;
438
+ } p_argv;
439
+ unsigned long gprvalue;
440
+ unsigned long align;
441
+
442
+ stacktop.c = (char *) stack + bytes;
443
+ gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64;
444
+ gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64;
445
+ #if _CALL_ELF == 2
446
+ rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64;
447
+ #else
448
+ rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64;
449
+ #endif
450
+ fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64;
451
+ fparg_count = 0;
452
+ next_arg.ul = gpr_base.ul;
453
+
454
+ /* Check that everything starts aligned properly. */
455
+ FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
456
+ FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
457
+ FFI_ASSERT ((bytes & 0xF) == 0);
458
+
459
+ /* Deal with return values that are actually pass-by-reference. */
460
+ if (flags & FLAG_RETVAL_REFERENCE)
461
+ *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue;
462
+
463
+ /* Now for the arguments. */
464
+ p_argv.v = ecif->avalue;
465
+ nargs = ecif->cif->nargs;
466
+ #if _CALL_ELF != 2
467
+ nfixedargs = (unsigned) -1;
468
+ if ((flags & FLAG_COMPAT) == 0)
469
+ #endif
470
+ nfixedargs = ecif->cif->nfixedargs;
471
+ for (ptr = ecif->cif->arg_types, i = 0;
472
+ i < nargs;
473
+ i++, ptr++, p_argv.v++)
474
+ {
475
+ unsigned int elt, elnum;
476
+
477
+ switch ((*ptr)->type)
478
+ {
479
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
480
+ case FFI_TYPE_LONGDOUBLE:
481
+ if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
482
+ {
483
+ double_tmp = (*p_argv.d)[0];
484
+ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
485
+ {
486
+ *fpr_base.d++ = double_tmp;
487
+ # if _CALL_ELF != 2
488
+ if ((flags & FLAG_COMPAT) != 0)
489
+ *next_arg.d = double_tmp;
490
+ # endif
491
+ }
492
+ else
493
+ *next_arg.d = double_tmp;
494
+ if (++next_arg.ul == gpr_end.ul)
495
+ next_arg.ul = rest.ul;
496
+ fparg_count++;
497
+ double_tmp = (*p_argv.d)[1];
498
+ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
499
+ {
500
+ *fpr_base.d++ = double_tmp;
501
+ # if _CALL_ELF != 2
502
+ if ((flags & FLAG_COMPAT) != 0)
503
+ *next_arg.d = double_tmp;
504
+ # endif
505
+ }
506
+ else
507
+ *next_arg.d = double_tmp;
508
+ if (++next_arg.ul == gpr_end.ul)
509
+ next_arg.ul = rest.ul;
510
+ fparg_count++;
511
+ FFI_ASSERT (__LDBL_MANT_DIG__ == 106);
512
+ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
513
+ break;
514
+ }
515
+ /* Fall through. */
516
+ #endif
517
+ case FFI_TYPE_DOUBLE:
518
+ #if _CALL_ELF != 2
519
+ do_double:
520
+ #endif
521
+ double_tmp = **p_argv.d;
522
+ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
523
+ {
524
+ *fpr_base.d++ = double_tmp;
525
+ #if _CALL_ELF != 2
526
+ if ((flags & FLAG_COMPAT) != 0)
527
+ *next_arg.d = double_tmp;
528
+ #endif
529
+ }
530
+ else
531
+ *next_arg.d = double_tmp;
532
+ if (++next_arg.ul == gpr_end.ul)
533
+ next_arg.ul = rest.ul;
534
+ fparg_count++;
535
+ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
536
+ break;
537
+
538
+ case FFI_TYPE_FLOAT:
539
+ #if _CALL_ELF != 2
540
+ do_float:
541
+ #endif
542
+ double_tmp = **p_argv.f;
543
+ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
544
+ {
545
+ *fpr_base.d++ = double_tmp;
546
+ #if _CALL_ELF != 2
547
+ if ((flags & FLAG_COMPAT) != 0)
548
+ {
549
+ # ifndef __LITTLE_ENDIAN__
550
+ next_arg.f[1] = (float) double_tmp;
551
+ # else
552
+ next_arg.f[0] = (float) double_tmp;
553
+ # endif
554
+ }
555
+ #endif
556
+ }
557
+ else
558
+ {
559
+ # ifndef __LITTLE_ENDIAN__
560
+ next_arg.f[1] = (float) double_tmp;
561
+ # else
562
+ next_arg.f[0] = (float) double_tmp;
563
+ # endif
564
+ }
565
+ if (++next_arg.ul == gpr_end.ul)
566
+ next_arg.ul = rest.ul;
567
+ fparg_count++;
568
+ FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
569
+ break;
570
+
571
+ case FFI_TYPE_STRUCT:
572
+ if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0)
573
+ {
574
+ align = (*ptr)->alignment;
575
+ if (align > 16)
576
+ align = 16;
577
+ if (align > 1)
578
+ {
579
+ next_arg.p = FFI_ALIGN (next_arg.p, align);
580
+ if (next_arg.ul == gpr_end.ul)
581
+ next_arg.ul = rest.ul;
582
+ }
583
+ }
584
+ elt = discover_homogeneous_aggregate (ecif->cif->abi, *ptr, &elnum);
585
+ if (elt)
586
+ {
587
+ #if _CALL_ELF == 2
588
+ union {
589
+ void *v;
590
+ float *f;
591
+ double *d;
592
+ } arg;
593
+
594
+ arg.v = *p_argv.v;
595
+ if (elt == FFI_TYPE_FLOAT)
596
+ {
597
+ do
598
+ {
599
+ double_tmp = *arg.f++;
600
+ if (fparg_count < NUM_FPR_ARG_REGISTERS64
601
+ && i < nfixedargs)
602
+ *fpr_base.d++ = double_tmp;
603
+ else
604
+ *next_arg.f = (float) double_tmp;
605
+ if (++next_arg.f == gpr_end.f)
606
+ next_arg.f = rest.f;
607
+ fparg_count++;
608
+ }
609
+ while (--elnum != 0);
610
+ if ((next_arg.p & 7) != 0)
611
+ if (++next_arg.f == gpr_end.f)
612
+ next_arg.f = rest.f;
613
+ }
614
+ else
615
+ do
616
+ {
617
+ double_tmp = *arg.d++;
618
+ if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
619
+ *fpr_base.d++ = double_tmp;
620
+ else
621
+ *next_arg.d = double_tmp;
622
+ if (++next_arg.d == gpr_end.d)
623
+ next_arg.d = rest.d;
624
+ fparg_count++;
625
+ }
626
+ while (--elnum != 0);
627
+ #else
628
+ if (elt == FFI_TYPE_FLOAT)
629
+ goto do_float;
630
+ else
631
+ goto do_double;
632
+ #endif
633
+ }
634
+ else
635
+ {
636
+ words = ((*ptr)->size + 7) / 8;
637
+ if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul)
638
+ {
639
+ size_t first = gpr_end.c - next_arg.c;
640
+ memcpy (next_arg.c, *p_argv.c, first);
641
+ memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first);
642
+ next_arg.c = rest.c + words * 8 - first;
643
+ }
644
+ else
645
+ {
646
+ char *where = next_arg.c;
647
+
648
+ #ifndef __LITTLE_ENDIAN__
649
+ /* Structures with size less than eight bytes are passed
650
+ left-padded. */
651
+ if ((*ptr)->size < 8)
652
+ where += 8 - (*ptr)->size;
653
+ #endif
654
+ memcpy (where, *p_argv.c, (*ptr)->size);
655
+ next_arg.ul += words;
656
+ if (next_arg.ul == gpr_end.ul)
657
+ next_arg.ul = rest.ul;
658
+ }
659
+ }
660
+ break;
661
+
662
+ case FFI_TYPE_UINT8:
663
+ gprvalue = **p_argv.uc;
664
+ goto putgpr;
665
+ case FFI_TYPE_SINT8:
666
+ gprvalue = **p_argv.sc;
667
+ goto putgpr;
668
+ case FFI_TYPE_UINT16:
669
+ gprvalue = **p_argv.us;
670
+ goto putgpr;
671
+ case FFI_TYPE_SINT16:
672
+ gprvalue = **p_argv.ss;
673
+ goto putgpr;
674
+ case FFI_TYPE_UINT32:
675
+ gprvalue = **p_argv.ui;
676
+ goto putgpr;
677
+ case FFI_TYPE_INT:
678
+ case FFI_TYPE_SINT32:
679
+ gprvalue = **p_argv.si;
680
+ goto putgpr;
681
+
682
+ case FFI_TYPE_UINT64:
683
+ case FFI_TYPE_SINT64:
684
+ case FFI_TYPE_POINTER:
685
+ gprvalue = **p_argv.ul;
686
+ putgpr:
687
+ *next_arg.ul++ = gprvalue;
688
+ if (next_arg.ul == gpr_end.ul)
689
+ next_arg.ul = rest.ul;
690
+ break;
691
+ }
692
+ }
693
+
694
+ FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS
695
+ || (next_arg.ul >= gpr_base.ul
696
+ && next_arg.ul <= gpr_base.ul + 4));
697
+ }
698
+
699
+
700
+ #if _CALL_ELF == 2
701
+ #define MIN_CACHE_LINE_SIZE 8
702
+
703
+ static void
704
+ flush_icache (char *wraddr, char *xaddr, int size)
705
+ {
706
+ int i;
707
+ for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE)
708
+ __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;"
709
+ : : "r" (xaddr + i), "r" (wraddr + i) : "memory");
710
+ __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;"
711
+ : : "r"(xaddr + size - 1), "r"(wraddr + size - 1)
712
+ : "memory");
713
+ }
714
+ #endif
715
+
716
+
717
+ ffi_status FFI_HIDDEN
718
+ ffi_prep_closure_loc_linux64 (ffi_closure *closure,
719
+ ffi_cif *cif,
720
+ void (*fun) (ffi_cif *, void *, void **, void *),
721
+ void *user_data,
722
+ void *codeloc)
723
+ {
724
+ #if _CALL_ELF == 2
725
+ unsigned int *tramp = (unsigned int *) &closure->tramp[0];
726
+
727
+ if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
728
+ return FFI_BAD_ABI;
729
+
730
+ tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */
731
+ tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */
732
+ tramp[2] = 0x7d8903a6; /* mtctr 12 */
733
+ tramp[3] = 0x4e800420; /* bctr */
734
+ /* 1: .quad function_addr */
735
+ /* 2: .quad context */
736
+ *(void **) &tramp[4] = (void *) ffi_closure_LINUX64;
737
+ *(void **) &tramp[6] = codeloc;
738
+ flush_icache ((char *) tramp, (char *) codeloc, 4 * 4);
739
+ #else
740
+ void **tramp = (void **) &closure->tramp[0];
741
+
742
+ if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
743
+ return FFI_BAD_ABI;
744
+
745
+ /* Copy function address and TOC from ffi_closure_LINUX64 OPD. */
746
+ memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *));
747
+ tramp[1] = codeloc;
748
+ memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *));
749
+ #endif
750
+
751
+ closure->cif = cif;
752
+ closure->fun = fun;
753
+ closure->user_data = user_data;
754
+
755
+ return FFI_OK;
756
+ }
757
+
758
+
759
+ int FFI_HIDDEN
760
+ ffi_closure_helper_LINUX64 (ffi_cif *cif,
761
+ void (*fun) (ffi_cif *, void *, void **, void *),
762
+ void *user_data,
763
+ void *rvalue,
764
+ unsigned long *pst,
765
+ ffi_dblfl *pfr)
766
+ {
767
+ /* rvalue is the pointer to space for return value in closure assembly */
768
+ /* pst is the pointer to parameter save area
769
+ (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */
770
+ /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */
771
+
772
+ void **avalue;
773
+ ffi_type **arg_types;
774
+ unsigned long i, avn, nfixedargs;
775
+ ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64;
776
+ unsigned long align;
777
+
778
+ avalue = alloca (cif->nargs * sizeof (void *));
779
+
780
+ /* Copy the caller's structure return value address so that the
781
+ closure returns the data directly to the caller. */
782
+ if (cif->rtype->type == FFI_TYPE_STRUCT
783
+ && (cif->flags & FLAG_RETURNS_SMST) == 0)
784
+ {
785
+ rvalue = (void *) *pst;
786
+ pst++;
787
+ }
788
+
789
+ i = 0;
790
+ avn = cif->nargs;
791
+ #if _CALL_ELF != 2
792
+ nfixedargs = (unsigned) -1;
793
+ if ((cif->flags & FLAG_COMPAT) == 0)
794
+ #endif
795
+ nfixedargs = cif->nfixedargs;
796
+ arg_types = cif->arg_types;
797
+
798
+ /* Grab the addresses of the arguments from the stack frame. */
799
+ while (i < avn)
800
+ {
801
+ unsigned int elt, elnum;
802
+
803
+ switch (arg_types[i]->type)
804
+ {
805
+ case FFI_TYPE_SINT8:
806
+ case FFI_TYPE_UINT8:
807
+ #ifndef __LITTLE_ENDIAN__
808
+ avalue[i] = (char *) pst + 7;
809
+ pst++;
810
+ break;
811
+ #endif
812
+
813
+ case FFI_TYPE_SINT16:
814
+ case FFI_TYPE_UINT16:
815
+ #ifndef __LITTLE_ENDIAN__
816
+ avalue[i] = (char *) pst + 6;
817
+ pst++;
818
+ break;
819
+ #endif
820
+
821
+ case FFI_TYPE_SINT32:
822
+ case FFI_TYPE_UINT32:
823
+ #ifndef __LITTLE_ENDIAN__
824
+ avalue[i] = (char *) pst + 4;
825
+ pst++;
826
+ break;
827
+ #endif
828
+
829
+ case FFI_TYPE_SINT64:
830
+ case FFI_TYPE_UINT64:
831
+ case FFI_TYPE_POINTER:
832
+ avalue[i] = pst;
833
+ pst++;
834
+ break;
835
+
836
+ case FFI_TYPE_STRUCT:
837
+ if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0)
838
+ {
839
+ align = arg_types[i]->alignment;
840
+ if (align > 16)
841
+ align = 16;
842
+ if (align > 1)
843
+ pst = (unsigned long *) FFI_ALIGN ((size_t) pst, align);
844
+ }
845
+ elt = discover_homogeneous_aggregate (cif->abi, arg_types[i], &elnum);
846
+ if (elt)
847
+ {
848
+ #if _CALL_ELF == 2
849
+ union {
850
+ void *v;
851
+ unsigned long *ul;
852
+ float *f;
853
+ double *d;
854
+ size_t p;
855
+ } to, from;
856
+
857
+ /* Repackage the aggregate from its parts. The
858
+ aggregate size is not greater than the space taken by
859
+ the registers so store back to the register/parameter
860
+ save arrays. */
861
+ if (pfr + elnum <= end_pfr)
862
+ to.v = pfr;
863
+ else
864
+ to.v = pst;
865
+
866
+ avalue[i] = to.v;
867
+ from.ul = pst;
868
+ if (elt == FFI_TYPE_FLOAT)
869
+ {
870
+ do
871
+ {
872
+ if (pfr < end_pfr && i < nfixedargs)
873
+ {
874
+ *to.f = (float) pfr->d;
875
+ pfr++;
876
+ }
877
+ else
878
+ *to.f = *from.f;
879
+ to.f++;
880
+ from.f++;
881
+ }
882
+ while (--elnum != 0);
883
+ }
884
+ else
885
+ {
886
+ do
887
+ {
888
+ if (pfr < end_pfr && i < nfixedargs)
889
+ {
890
+ *to.d = pfr->d;
891
+ pfr++;
892
+ }
893
+ else
894
+ *to.d = *from.d;
895
+ to.d++;
896
+ from.d++;
897
+ }
898
+ while (--elnum != 0);
899
+ }
900
+ #else
901
+ if (elt == FFI_TYPE_FLOAT)
902
+ goto do_float;
903
+ else
904
+ goto do_double;
905
+ #endif
906
+ }
907
+ else
908
+ {
909
+ #ifndef __LITTLE_ENDIAN__
910
+ /* Structures with size less than eight bytes are passed
911
+ left-padded. */
912
+ if (arg_types[i]->size < 8)
913
+ avalue[i] = (char *) pst + 8 - arg_types[i]->size;
914
+ else
915
+ #endif
916
+ avalue[i] = pst;
917
+ }
918
+ pst += (arg_types[i]->size + 7) / 8;
919
+ break;
920
+
921
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
922
+ case FFI_TYPE_LONGDOUBLE:
923
+ if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
924
+ {
925
+ if (pfr + 1 < end_pfr && i + 1 < nfixedargs)
926
+ {
927
+ avalue[i] = pfr;
928
+ pfr += 2;
929
+ }
930
+ else
931
+ {
932
+ if (pfr < end_pfr && i < nfixedargs)
933
+ {
934
+ /* Passed partly in f13 and partly on the stack.
935
+ Move it all to the stack. */
936
+ *pst = *(unsigned long *) pfr;
937
+ pfr++;
938
+ }
939
+ avalue[i] = pst;
940
+ }
941
+ pst += 2;
942
+ break;
943
+ }
944
+ /* Fall through. */
945
+ #endif
946
+ case FFI_TYPE_DOUBLE:
947
+ #if _CALL_ELF != 2
948
+ do_double:
949
+ #endif
950
+ /* On the outgoing stack all values are aligned to 8 */
951
+ /* there are 13 64bit floating point registers */
952
+
953
+ if (pfr < end_pfr && i < nfixedargs)
954
+ {
955
+ avalue[i] = pfr;
956
+ pfr++;
957
+ }
958
+ else
959
+ avalue[i] = pst;
960
+ pst++;
961
+ break;
962
+
963
+ case FFI_TYPE_FLOAT:
964
+ #if _CALL_ELF != 2
965
+ do_float:
966
+ #endif
967
+ if (pfr < end_pfr && i < nfixedargs)
968
+ {
969
+ /* Float values are stored as doubles in the
970
+ ffi_closure_LINUX64 code. Fix them here. */
971
+ pfr->f = (float) pfr->d;
972
+ avalue[i] = pfr;
973
+ pfr++;
974
+ }
975
+ else
976
+ {
977
+ #ifndef __LITTLE_ENDIAN__
978
+ avalue[i] = (char *) pst + 4;
979
+ #else
980
+ avalue[i] = pst;
981
+ #endif
982
+ }
983
+ pst++;
984
+ break;
985
+
986
+ default:
987
+ FFI_ASSERT (0);
988
+ }
989
+
990
+ i++;
991
+ }
992
+
993
+ (*fun) (cif, rvalue, avalue, user_data);
994
+
995
+ /* Tell ffi_closure_LINUX64 how to perform return type promotions. */
996
+ if ((cif->flags & FLAG_RETURNS_SMST) != 0)
997
+ {
998
+ if ((cif->flags & FLAG_RETURNS_FP) == 0)
999
+ return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1;
1000
+ else if ((cif->flags & FLAG_RETURNS_64BITS) != 0)
1001
+ return FFI_V2_TYPE_DOUBLE_HOMOG;
1002
+ else
1003
+ return FFI_V2_TYPE_FLOAT_HOMOG;
1004
+ }
1005
+ return cif->rtype->type;
1006
+ }
1007
+ #endif