ffi 1.9.18 → 1.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +52 -0
  5. data/.yardopts +5 -0
  6. data/Gemfile +15 -0
  7. data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
  8. data/README.md +3 -4
  9. data/Rakefile +41 -5
  10. data/appveyor.yml +22 -0
  11. data/ext/ffi_c/AbstractMemory.c +6 -1
  12. data/ext/ffi_c/Call.c +1 -22
  13. data/ext/ffi_c/Call.h +0 -9
  14. data/ext/ffi_c/Closure.c +54 -0
  15. data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
  16. data/ext/ffi_c/Function.c +16 -25
  17. data/ext/ffi_c/Function.h +1 -2
  18. data/ext/ffi_c/FunctionInfo.c +0 -4
  19. data/ext/ffi_c/MethodHandle.c +33 -268
  20. data/ext/ffi_c/Platform.c +10 -2
  21. data/ext/ffi_c/extconf.rb +10 -5
  22. data/ext/ffi_c/ffi.c +2 -2
  23. data/ext/ffi_c/libffi/.appveyor.yml +48 -0
  24. data/ext/ffi_c/libffi/.gitignore +36 -0
  25. data/ext/ffi_c/libffi/.travis/install.sh +14 -0
  26. data/ext/ffi_c/libffi/.travis.yml +30 -0
  27. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  28. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  29. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  30. data/ext/ffi_c/libffi/LICENSE +1 -1
  31. data/ext/ffi_c/libffi/Makefile.am +169 -158
  32. data/ext/ffi_c/libffi/Makefile.in +927 -938
  33. data/ext/ffi_c/libffi/README +164 -52
  34. data/ext/ffi_c/libffi/acinclude.m4 +387 -0
  35. data/ext/ffi_c/libffi/autogen.sh +2 -0
  36. data/ext/ffi_c/libffi/config.guess +336 -371
  37. data/ext/ffi_c/libffi/config.sub +246 -115
  38. data/ext/ffi_c/libffi/configure +6976 -2189
  39. data/ext/ffi_c/libffi/configure.ac +148 -256
  40. data/ext/ffi_c/libffi/configure.host +277 -4
  41. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  42. data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
  43. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  44. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  45. data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
  46. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  47. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  48. data/ext/ffi_c/libffi/include/Makefile.in +188 -71
  49. data/ext/ffi_c/libffi/include/ffi.h.in +112 -50
  50. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  51. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  52. data/ext/ffi_c/libffi/install-sh +190 -202
  53. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  54. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  55. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  56. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  57. data/ext/ffi_c/libffi/libtool-version +1 -1
  58. data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
  59. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  60. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  61. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  62. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  63. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  64. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  67. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  68. data/ext/ffi_c/libffi/man/Makefile.in +141 -49
  69. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  70. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  71. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  72. data/ext/ffi_c/libffi/missing +150 -311
  73. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  74. data/ext/ffi_c/libffi/src/aarch64/ffi.c +964 -0
  75. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  76. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  77. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  78. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  79. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  80. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  81. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  82. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  83. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  84. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  85. data/ext/ffi_c/libffi/src/arm/ffi.c +608 -517
  86. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  87. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  88. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  89. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  90. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  91. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  92. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  93. data/ext/ffi_c/libffi/src/closures.c +366 -45
  94. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  95. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  96. data/ext/ffi_c/libffi/src/debug.c +6 -1
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  98. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  99. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  100. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  101. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  102. data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
  103. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  104. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  105. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  106. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  107. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  108. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  109. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  110. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  111. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  112. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  113. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  114. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  115. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  116. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  117. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  118. data/ext/ffi_c/libffi/src/mips/ffi.c +103 -28
  119. data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
  120. data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
  121. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  122. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  123. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  124. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  125. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  126. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  127. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  128. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  129. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  130. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  131. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  132. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  133. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  134. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  135. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  136. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  137. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  138. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +111 -30
  139. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  140. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  141. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  142. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +103 -44
  143. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  144. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  145. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  146. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  147. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  148. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  149. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  150. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  151. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  152. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  153. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  154. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  155. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  156. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  157. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  158. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  159. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  160. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  161. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  162. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  163. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  164. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  165. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  166. data/ext/ffi_c/libffi/src/types.c +43 -14
  167. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  168. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  169. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  170. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  171. data/ext/ffi_c/libffi/src/x86/ffi.c +591 -500
  172. data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -116
  173. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  174. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  175. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  176. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  177. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  178. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  179. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  180. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  181. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  182. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  183. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  184. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  185. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -73
  186. data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
  187. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -25
  188. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  293. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  345. data/ext/ffi_c/libffi.bsd.mk +11 -5
  346. data/ext/ffi_c/libffi.darwin.mk +14 -4
  347. data/ext/ffi_c/libffi.gnu.mk +3 -2
  348. data/ext/ffi_c/libffi.mk +10 -5
  349. data/ext/ffi_c/libffi.vc.mk +1 -1
  350. data/ext/ffi_c/libffi.vc64.mk +1 -1
  351. data/ffi.gemspec +16 -3
  352. data/lib/ffi/enum.rb +124 -0
  353. data/lib/ffi/library.rb +66 -14
  354. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  355. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  356. data/lib/ffi/platform.rb +7 -2
  357. data/lib/ffi/pointer.rb +1 -0
  358. data/lib/ffi/struct.rb +0 -2
  359. data/lib/ffi/version.rb +1 -2
  360. data/samples/getlogin.rb +8 -0
  361. data/samples/getpid.rb +8 -0
  362. data/samples/gettimeofday.rb +18 -0
  363. data/samples/hello.rb +7 -0
  364. data/samples/inotify.rb +60 -0
  365. data/samples/pty.rb +76 -0
  366. data/samples/qsort.rb +21 -0
  367. data/samples/sample_helper.rb +6 -0
  368. metadata +164 -115
  369. data/ext/ffi_c/ClosurePool.c +0 -283
  370. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  371. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  372. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  373. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  374. data/ext/ffi_c/libffi/compile +0 -143
  375. data/ext/ffi_c/libffi/depcomp +0 -630
  376. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  377. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  378. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  379. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  380. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  381. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  382. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  383. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  384. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  385. data/ext/ffi_c/libffi/mdate-sh +0 -201
  386. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  387. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  388. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  389. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  390. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  391. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  392. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  395. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  396. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  397. data/gen/Rakefile +0 -30
  398. data/libtest/Benchmark.c +0 -52
  399. data/libtest/BoolTest.c +0 -34
  400. data/libtest/BufferTest.c +0 -31
  401. data/libtest/ClosureTest.c +0 -205
  402. data/libtest/EnumTest.c +0 -51
  403. data/libtest/FunctionTest.c +0 -70
  404. data/libtest/GNUmakefile +0 -149
  405. data/libtest/GlobalVariable.c +0 -62
  406. data/libtest/LastErrorTest.c +0 -21
  407. data/libtest/NumberTest.c +0 -132
  408. data/libtest/PointerTest.c +0 -63
  409. data/libtest/ReferenceTest.c +0 -23
  410. data/libtest/StringTest.c +0 -34
  411. data/libtest/StructTest.c +0 -243
  412. data/libtest/UnionTest.c +0 -43
  413. data/libtest/VariadicTest.c +0 -99
  414. data/spec/ffi/async_callback_spec.rb +0 -35
  415. data/spec/ffi/bool_spec.rb +0 -32
  416. data/spec/ffi/buffer_spec.rb +0 -279
  417. data/spec/ffi/callback_spec.rb +0 -773
  418. data/spec/ffi/custom_param_type.rb +0 -37
  419. data/spec/ffi/custom_type_spec.rb +0 -74
  420. data/spec/ffi/dup_spec.rb +0 -52
  421. data/spec/ffi/enum_spec.rb +0 -423
  422. data/spec/ffi/errno_spec.rb +0 -20
  423. data/spec/ffi/ffi_spec.rb +0 -28
  424. data/spec/ffi/fixtures/Benchmark.c +0 -52
  425. data/spec/ffi/fixtures/BoolTest.c +0 -34
  426. data/spec/ffi/fixtures/BufferTest.c +0 -31
  427. data/spec/ffi/fixtures/ClosureTest.c +0 -205
  428. data/spec/ffi/fixtures/EnumTest.c +0 -51
  429. data/spec/ffi/fixtures/FunctionTest.c +0 -142
  430. data/spec/ffi/fixtures/GNUmakefile +0 -149
  431. data/spec/ffi/fixtures/GlobalVariable.c +0 -62
  432. data/spec/ffi/fixtures/LastErrorTest.c +0 -21
  433. data/spec/ffi/fixtures/NumberTest.c +0 -132
  434. data/spec/ffi/fixtures/PipeHelper.h +0 -21
  435. data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
  436. data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
  437. data/spec/ffi/fixtures/PointerTest.c +0 -63
  438. data/spec/ffi/fixtures/ReferenceTest.c +0 -23
  439. data/spec/ffi/fixtures/StringTest.c +0 -34
  440. data/spec/ffi/fixtures/StructTest.c +0 -243
  441. data/spec/ffi/fixtures/UnionTest.c +0 -43
  442. data/spec/ffi/fixtures/VariadicTest.c +0 -99
  443. data/spec/ffi/fixtures/classes.rb +0 -438
  444. data/spec/ffi/function_spec.rb +0 -97
  445. data/spec/ffi/io_spec.rb +0 -16
  446. data/spec/ffi/library_spec.rb +0 -286
  447. data/spec/ffi/long_double.rb +0 -30
  448. data/spec/ffi/managed_struct_spec.rb +0 -68
  449. data/spec/ffi/memorypointer_spec.rb +0 -78
  450. data/spec/ffi/number_spec.rb +0 -247
  451. data/spec/ffi/platform_spec.rb +0 -114
  452. data/spec/ffi/pointer_spec.rb +0 -285
  453. data/spec/ffi/rbx/attach_function_spec.rb +0 -34
  454. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
  455. data/spec/ffi/rbx/spec_helper.rb +0 -6
  456. data/spec/ffi/rbx/struct_spec.rb +0 -18
  457. data/spec/ffi/spec_helper.rb +0 -93
  458. data/spec/ffi/string_spec.rb +0 -118
  459. data/spec/ffi/strptr_spec.rb +0 -50
  460. data/spec/ffi/struct_by_ref_spec.rb +0 -43
  461. data/spec/ffi/struct_callback_spec.rb +0 -69
  462. data/spec/ffi/struct_initialize_spec.rb +0 -35
  463. data/spec/ffi/struct_packed_spec.rb +0 -50
  464. data/spec/ffi/struct_spec.rb +0 -886
  465. data/spec/ffi/typedef_spec.rb +0 -91
  466. data/spec/ffi/union_spec.rb +0 -67
  467. data/spec/ffi/variadic_spec.rb +0 -132
  468. data/spec/spec.opts +0 -4
@@ -30,68 +30,135 @@
30
30
 
31
31
  .file "linux64_closure.S"
32
32
 
33
- #ifdef __powerpc64__
33
+ #ifdef POWERPC64
34
34
  FFI_HIDDEN (ffi_closure_LINUX64)
35
- FFI_HIDDEN (.ffi_closure_LINUX64)
36
- .globl ffi_closure_LINUX64, .ffi_closure_LINUX64
35
+ .globl ffi_closure_LINUX64
36
+ .text
37
+ .cfi_startproc
38
+ # if _CALL_ELF == 2
39
+ ffi_closure_LINUX64:
40
+ addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha
41
+ addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l
42
+ .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64
43
+ # else
37
44
  .section ".opd","aw"
38
45
  .align 3
39
46
  ffi_closure_LINUX64:
47
+ # ifdef _CALL_LINUX
48
+ .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0
49
+ .type ffi_closure_LINUX64,@function
50
+ .text
51
+ .L.ffi_closure_LINUX64:
52
+ # else
53
+ FFI_HIDDEN (.ffi_closure_LINUX64)
54
+ .globl .ffi_closure_LINUX64
40
55
  .quad .ffi_closure_LINUX64,.TOC.@tocbase,0
41
56
  .size ffi_closure_LINUX64,24
42
57
  .type .ffi_closure_LINUX64,@function
43
58
  .text
44
59
  .ffi_closure_LINUX64:
45
- .LFB1:
46
- # save general regs into parm save area
47
- std %r3, 48(%r1)
48
- std %r4, 56(%r1)
49
- std %r5, 64(%r1)
50
- std %r6, 72(%r1)
60
+ # endif
61
+ # endif
62
+
63
+ # if _CALL_ELF == 2
64
+ # 32 byte special reg save area + 64 byte parm save area
65
+ # + 64 byte retval area + 13*8 fpr save area + round to 16
66
+ # define STACKFRAME 272
67
+ # define PARMSAVE 32
68
+ # define RETVAL PARMSAVE+64
69
+ # else
70
+ # 48 bytes special reg save area + 64 bytes parm save area
71
+ # + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
72
+ # define STACKFRAME 240
73
+ # define PARMSAVE 48
74
+ # define RETVAL PARMSAVE+64
75
+ # endif
76
+
77
+ # if _CALL_ELF == 2
78
+ ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif
79
+ mflr %r0
80
+ lwz %r12, 28(%r12) # cif->flags
81
+ mtcrf 0x40, %r12
82
+ addi %r12, %r1, PARMSAVE
83
+ bt 7, 0f
84
+ # Our caller has not allocated a parameter save area.
85
+ # We need to allocate one here and use it to pass gprs to
86
+ # ffi_closure_helper_LINUX64.
87
+ addi %r12, %r1, -STACKFRAME+PARMSAVE
88
+ 0:
89
+ # Save general regs into parm save area
90
+ std %r3, 0(%r12)
91
+ std %r4, 8(%r12)
92
+ std %r5, 16(%r12)
93
+ std %r6, 24(%r12)
94
+ std %r7, 32(%r12)
95
+ std %r8, 40(%r12)
96
+ std %r9, 48(%r12)
97
+ std %r10, 56(%r12)
98
+
99
+ # load up the pointer to the parm save area
100
+ mr %r7, %r12
101
+ # else
102
+ # copy r2 to r11 and load TOC into r2
103
+ mr %r11, %r2
104
+ ld %r2, 16(%r2)
105
+
51
106
  mflr %r0
107
+ # Save general regs into parm save area
108
+ # This is the parameter save area set up by our caller.
109
+ std %r3, PARMSAVE+0(%r1)
110
+ std %r4, PARMSAVE+8(%r1)
111
+ std %r5, PARMSAVE+16(%r1)
112
+ std %r6, PARMSAVE+24(%r1)
113
+ std %r7, PARMSAVE+32(%r1)
114
+ std %r8, PARMSAVE+40(%r1)
115
+ std %r9, PARMSAVE+48(%r1)
116
+ std %r10, PARMSAVE+56(%r1)
52
117
 
53
- std %r7, 80(%r1)
54
- std %r8, 88(%r1)
55
- std %r9, 96(%r1)
56
- std %r10, 104(%r1)
118
+ # load up the pointer to the parm save area
119
+ addi %r7, %r1, PARMSAVE
120
+ # endif
57
121
  std %r0, 16(%r1)
58
122
 
59
- # mandatory 48 bytes special reg save area + 64 bytes parm save area
60
- # + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
61
- stdu %r1, -240(%r1)
62
- .LCFI0:
123
+ # closure->cif
124
+ ld %r3, FFI_TRAMPOLINE_SIZE(%r11)
125
+ # closure->fun
126
+ ld %r4, FFI_TRAMPOLINE_SIZE+8(%r11)
127
+ # closure->user_data
128
+ ld %r5, FFI_TRAMPOLINE_SIZE+16(%r11)
63
129
 
130
+ .Ldoclosure:
64
131
  # next save fpr 1 to fpr 13
65
- stfd %f1, 128+(0*8)(%r1)
66
- stfd %f2, 128+(1*8)(%r1)
67
- stfd %f3, 128+(2*8)(%r1)
68
- stfd %f4, 128+(3*8)(%r1)
69
- stfd %f5, 128+(4*8)(%r1)
70
- stfd %f6, 128+(5*8)(%r1)
71
- stfd %f7, 128+(6*8)(%r1)
72
- stfd %f8, 128+(7*8)(%r1)
73
- stfd %f9, 128+(8*8)(%r1)
74
- stfd %f10, 128+(9*8)(%r1)
75
- stfd %f11, 128+(10*8)(%r1)
76
- stfd %f12, 128+(11*8)(%r1)
77
- stfd %f13, 128+(12*8)(%r1)
78
-
79
- # set up registers for the routine that actually does the work
80
- # get the context pointer from the trampoline
81
- mr %r3, %r11
82
-
83
- # now load up the pointer to the result storage
84
- addi %r4, %r1, 112
85
-
86
- # now load up the pointer to the parameter save area
87
- # in the previous frame
88
- addi %r5, %r1, 240 + 48
89
-
90
- # now load up the pointer to the saved fpr registers */
91
- addi %r6, %r1, 128
132
+ stfd %f1, -104+(0*8)(%r1)
133
+ stfd %f2, -104+(1*8)(%r1)
134
+ stfd %f3, -104+(2*8)(%r1)
135
+ stfd %f4, -104+(3*8)(%r1)
136
+ stfd %f5, -104+(4*8)(%r1)
137
+ stfd %f6, -104+(5*8)(%r1)
138
+ stfd %f7, -104+(6*8)(%r1)
139
+ stfd %f8, -104+(7*8)(%r1)
140
+ stfd %f9, -104+(8*8)(%r1)
141
+ stfd %f10, -104+(9*8)(%r1)
142
+ stfd %f11, -104+(10*8)(%r1)
143
+ stfd %f12, -104+(11*8)(%r1)
144
+ stfd %f13, -104+(12*8)(%r1)
145
+
146
+ # load up the pointer to the saved fpr registers */
147
+ addi %r8, %r1, -104
148
+
149
+ # load up the pointer to the result storage
150
+ addi %r6, %r1, -STACKFRAME+RETVAL
151
+
152
+ stdu %r1, -STACKFRAME(%r1)
153
+ .cfi_def_cfa_offset STACKFRAME
154
+ .cfi_offset 65, 16
92
155
 
93
156
  # make the call
157
+ # if defined _CALL_LINUX || _CALL_ELF == 2
158
+ bl ffi_closure_helper_LINUX64
159
+ # else
94
160
  bl .ffi_closure_helper_LINUX64
161
+ # endif
95
162
  .Lret:
96
163
 
97
164
  # now r3 contains the return type
@@ -100,10 +167,12 @@ ffi_closure_LINUX64:
100
167
 
101
168
  # look up the proper starting point in table
102
169
  # by using return type as offset
170
+ ld %r0, STACKFRAME+16(%r1)
171
+ cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT
172
+ bge .Lsmall
103
173
  mflr %r4 # move address of .Lret to r4
104
174
  sldi %r3, %r3, 4 # now multiply return type by 16
105
175
  addi %r4, %r4, .Lret_type0 - .Lret
106
- ld %r0, 240+16(%r1)
107
176
  add %r3, %r3, %r4 # add contents of table to table address
108
177
  mtctr %r3
109
178
  bctr # jump to it
@@ -116,121 +185,304 @@ ffi_closure_LINUX64:
116
185
  .Lret_type0:
117
186
  # case FFI_TYPE_VOID
118
187
  mtlr %r0
119
- addi %r1, %r1, 240
188
+ addi %r1, %r1, STACKFRAME
189
+ .cfi_def_cfa_offset 0
120
190
  blr
191
+ .cfi_def_cfa_offset STACKFRAME
121
192
  nop
122
193
  # case FFI_TYPE_INT
123
- lwa %r3, 112+4(%r1)
194
+ # ifdef __LITTLE_ENDIAN__
195
+ lwa %r3, RETVAL+0(%r1)
196
+ # else
197
+ lwa %r3, RETVAL+4(%r1)
198
+ # endif
124
199
  mtlr %r0
125
- addi %r1, %r1, 240
200
+ addi %r1, %r1, STACKFRAME
201
+ .cfi_def_cfa_offset 0
126
202
  blr
203
+ .cfi_def_cfa_offset STACKFRAME
127
204
  # case FFI_TYPE_FLOAT
128
- lfs %f1, 112+0(%r1)
205
+ lfs %f1, RETVAL+0(%r1)
129
206
  mtlr %r0
130
- addi %r1, %r1, 240
207
+ addi %r1, %r1, STACKFRAME
208
+ .cfi_def_cfa_offset 0
131
209
  blr
210
+ .cfi_def_cfa_offset STACKFRAME
132
211
  # case FFI_TYPE_DOUBLE
133
- lfd %f1, 112+0(%r1)
212
+ lfd %f1, RETVAL+0(%r1)
134
213
  mtlr %r0
135
- addi %r1, %r1, 240
214
+ addi %r1, %r1, STACKFRAME
215
+ .cfi_def_cfa_offset 0
136
216
  blr
217
+ .cfi_def_cfa_offset STACKFRAME
137
218
  # case FFI_TYPE_LONGDOUBLE
138
- lfd %f1, 112+0(%r1)
219
+ lfd %f1, RETVAL+0(%r1)
139
220
  mtlr %r0
140
- lfd %f2, 112+8(%r1)
221
+ lfd %f2, RETVAL+8(%r1)
141
222
  b .Lfinish
142
223
  # case FFI_TYPE_UINT8
143
- lbz %r3, 112+7(%r1)
224
+ # ifdef __LITTLE_ENDIAN__
225
+ lbz %r3, RETVAL+0(%r1)
226
+ # else
227
+ lbz %r3, RETVAL+7(%r1)
228
+ # endif
144
229
  mtlr %r0
145
- addi %r1, %r1, 240
230
+ addi %r1, %r1, STACKFRAME
231
+ .cfi_def_cfa_offset 0
146
232
  blr
233
+ .cfi_def_cfa_offset STACKFRAME
147
234
  # case FFI_TYPE_SINT8
148
- lbz %r3, 112+7(%r1)
235
+ # ifdef __LITTLE_ENDIAN__
236
+ lbz %r3, RETVAL+0(%r1)
237
+ # else
238
+ lbz %r3, RETVAL+7(%r1)
239
+ # endif
149
240
  extsb %r3,%r3
150
241
  mtlr %r0
151
242
  b .Lfinish
152
243
  # case FFI_TYPE_UINT16
153
- lhz %r3, 112+6(%r1)
244
+ # ifdef __LITTLE_ENDIAN__
245
+ lhz %r3, RETVAL+0(%r1)
246
+ # else
247
+ lhz %r3, RETVAL+6(%r1)
248
+ # endif
154
249
  mtlr %r0
155
250
  .Lfinish:
156
- addi %r1, %r1, 240
251
+ addi %r1, %r1, STACKFRAME
252
+ .cfi_def_cfa_offset 0
157
253
  blr
254
+ .cfi_def_cfa_offset STACKFRAME
158
255
  # case FFI_TYPE_SINT16
159
- lha %r3, 112+6(%r1)
256
+ # ifdef __LITTLE_ENDIAN__
257
+ lha %r3, RETVAL+0(%r1)
258
+ # else
259
+ lha %r3, RETVAL+6(%r1)
260
+ # endif
160
261
  mtlr %r0
161
- addi %r1, %r1, 240
262
+ addi %r1, %r1, STACKFRAME
263
+ .cfi_def_cfa_offset 0
162
264
  blr
265
+ .cfi_def_cfa_offset STACKFRAME
163
266
  # case FFI_TYPE_UINT32
164
- lwz %r3, 112+4(%r1)
267
+ # ifdef __LITTLE_ENDIAN__
268
+ lwz %r3, RETVAL+0(%r1)
269
+ # else
270
+ lwz %r3, RETVAL+4(%r1)
271
+ # endif
165
272
  mtlr %r0
166
- addi %r1, %r1, 240
273
+ addi %r1, %r1, STACKFRAME
274
+ .cfi_def_cfa_offset 0
167
275
  blr
276
+ .cfi_def_cfa_offset STACKFRAME
168
277
  # case FFI_TYPE_SINT32
169
- lwa %r3, 112+4(%r1)
278
+ # ifdef __LITTLE_ENDIAN__
279
+ lwa %r3, RETVAL+0(%r1)
280
+ # else
281
+ lwa %r3, RETVAL+4(%r1)
282
+ # endif
170
283
  mtlr %r0
171
- addi %r1, %r1, 240
284
+ addi %r1, %r1, STACKFRAME
285
+ .cfi_def_cfa_offset 0
172
286
  blr
287
+ .cfi_def_cfa_offset STACKFRAME
173
288
  # case FFI_TYPE_UINT64
174
- ld %r3, 112+0(%r1)
289
+ ld %r3, RETVAL+0(%r1)
175
290
  mtlr %r0
176
- addi %r1, %r1, 240
291
+ addi %r1, %r1, STACKFRAME
292
+ .cfi_def_cfa_offset 0
177
293
  blr
294
+ .cfi_def_cfa_offset STACKFRAME
178
295
  # case FFI_TYPE_SINT64
179
- ld %r3, 112+0(%r1)
296
+ ld %r3, RETVAL+0(%r1)
180
297
  mtlr %r0
181
- addi %r1, %r1, 240
298
+ addi %r1, %r1, STACKFRAME
299
+ .cfi_def_cfa_offset 0
182
300
  blr
301
+ .cfi_def_cfa_offset STACKFRAME
183
302
  # case FFI_TYPE_STRUCT
184
303
  mtlr %r0
185
- addi %r1, %r1, 240
304
+ addi %r1, %r1, STACKFRAME
305
+ .cfi_def_cfa_offset 0
186
306
  blr
307
+ .cfi_def_cfa_offset STACKFRAME
187
308
  nop
188
309
  # case FFI_TYPE_POINTER
189
- ld %r3, 112+0(%r1)
310
+ ld %r3, RETVAL+0(%r1)
311
+ mtlr %r0
312
+ addi %r1, %r1, STACKFRAME
313
+ .cfi_def_cfa_offset 0
314
+ blr
315
+ .cfi_def_cfa_offset STACKFRAME
316
+ # case FFI_V2_TYPE_FLOAT_HOMOG
317
+ lfs %f1, RETVAL+0(%r1)
318
+ lfs %f2, RETVAL+4(%r1)
319
+ lfs %f3, RETVAL+8(%r1)
320
+ b .Lmorefloat
321
+ # case FFI_V2_TYPE_DOUBLE_HOMOG
322
+ lfd %f1, RETVAL+0(%r1)
323
+ lfd %f2, RETVAL+8(%r1)
324
+ lfd %f3, RETVAL+16(%r1)
325
+ lfd %f4, RETVAL+24(%r1)
326
+ mtlr %r0
327
+ lfd %f5, RETVAL+32(%r1)
328
+ lfd %f6, RETVAL+40(%r1)
329
+ lfd %f7, RETVAL+48(%r1)
330
+ lfd %f8, RETVAL+56(%r1)
331
+ addi %r1, %r1, STACKFRAME
332
+ .cfi_def_cfa_offset 0
333
+ blr
334
+ .cfi_def_cfa_offset STACKFRAME
335
+ .Lmorefloat:
336
+ lfs %f4, RETVAL+12(%r1)
337
+ mtlr %r0
338
+ lfs %f5, RETVAL+16(%r1)
339
+ lfs %f6, RETVAL+20(%r1)
340
+ lfs %f7, RETVAL+24(%r1)
341
+ lfs %f8, RETVAL+28(%r1)
342
+ addi %r1, %r1, STACKFRAME
343
+ .cfi_def_cfa_offset 0
344
+ blr
345
+ .cfi_def_cfa_offset STACKFRAME
346
+ .Lsmall:
347
+ # ifdef __LITTLE_ENDIAN__
348
+ ld %r3,RETVAL+0(%r1)
349
+ mtlr %r0
350
+ ld %r4,RETVAL+8(%r1)
351
+ addi %r1, %r1, STACKFRAME
352
+ .cfi_def_cfa_offset 0
353
+ blr
354
+ # else
355
+ # A struct smaller than a dword is returned in the low bits of r3
356
+ # ie. right justified. Larger structs are passed left justified
357
+ # in r3 and r4. The return value area on the stack will have
358
+ # the structs as they are usually stored in memory.
359
+ cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes?
360
+ neg %r5, %r3
361
+ ld %r3,RETVAL+0(%r1)
362
+ blt .Lsmalldown
363
+ mtlr %r0
364
+ ld %r4,RETVAL+8(%r1)
365
+ addi %r1, %r1, STACKFRAME
366
+ .cfi_def_cfa_offset 0
367
+ blr
368
+ .cfi_def_cfa_offset STACKFRAME
369
+ .Lsmalldown:
370
+ addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7
190
371
  mtlr %r0
191
- addi %r1, %r1, 240
372
+ sldi %r5, %r5, 3
373
+ addi %r1, %r1, STACKFRAME
374
+ .cfi_def_cfa_offset 0
375
+ srd %r3, %r3, %r5
192
376
  blr
193
- # esac
194
- .LFE1:
377
+ # endif
378
+
379
+ .cfi_endproc
380
+ # if _CALL_ELF == 2
381
+ .size ffi_closure_LINUX64,.-ffi_closure_LINUX64
382
+ # else
383
+ # ifdef _CALL_LINUX
384
+ .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64
385
+ # else
195
386
  .long 0
196
387
  .byte 0,12,0,1,128,0,0,0
197
388
  .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64
389
+ # endif
390
+ # endif
391
+
392
+
393
+ FFI_HIDDEN (ffi_go_closure_linux64)
394
+ .globl ffi_go_closure_linux64
395
+ .text
396
+ .cfi_startproc
397
+ # if _CALL_ELF == 2
398
+ ffi_go_closure_linux64:
399
+ addis %r2, %r12, .TOC.-ffi_go_closure_linux64@ha
400
+ addi %r2, %r2, .TOC.-ffi_go_closure_linux64@l
401
+ .localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64
402
+ # else
403
+ .section ".opd","aw"
404
+ .align 3
405
+ ffi_go_closure_linux64:
406
+ # ifdef _CALL_LINUX
407
+ .quad .L.ffi_go_closure_linux64,.TOC.@tocbase,0
408
+ .type ffi_go_closure_linux64,@function
409
+ .text
410
+ .L.ffi_go_closure_linux64:
411
+ # else
412
+ FFI_HIDDEN (.ffi_go_closure_linux64)
413
+ .globl .ffi_go_closure_linux64
414
+ .quad .ffi_go_closure_linux64,.TOC.@tocbase,0
415
+ .size ffi_go_closure_linux64,24
416
+ .type .ffi_go_closure_linux64,@function
417
+ .text
418
+ .ffi_go_closure_linux64:
419
+ # endif
420
+ # endif
421
+
422
+ # if _CALL_ELF == 2
423
+ ld %r12, 8(%r11) # closure->cif
424
+ mflr %r0
425
+ lwz %r12, 28(%r12) # cif->flags
426
+ mtcrf 0x40, %r12
427
+ addi %r12, %r1, PARMSAVE
428
+ bt 7, 0f
429
+ # Our caller has not allocated a parameter save area.
430
+ # We need to allocate one here and use it to pass gprs to
431
+ # ffi_closure_helper_LINUX64.
432
+ addi %r12, %r1, -STACKFRAME+PARMSAVE
433
+ 0:
434
+ # Save general regs into parm save area
435
+ std %r3, 0(%r12)
436
+ std %r4, 8(%r12)
437
+ std %r5, 16(%r12)
438
+ std %r6, 24(%r12)
439
+ std %r7, 32(%r12)
440
+ std %r8, 40(%r12)
441
+ std %r9, 48(%r12)
442
+ std %r10, 56(%r12)
443
+
444
+ # load up the pointer to the parm save area
445
+ mr %r7, %r12
446
+ # else
447
+ mflr %r0
448
+ # Save general regs into parm save area
449
+ # This is the parameter save area set up by our caller.
450
+ std %r3, PARMSAVE+0(%r1)
451
+ std %r4, PARMSAVE+8(%r1)
452
+ std %r5, PARMSAVE+16(%r1)
453
+ std %r6, PARMSAVE+24(%r1)
454
+ std %r7, PARMSAVE+32(%r1)
455
+ std %r8, PARMSAVE+40(%r1)
456
+ std %r9, PARMSAVE+48(%r1)
457
+ std %r10, PARMSAVE+56(%r1)
198
458
 
199
- .section .eh_frame,EH_FRAME_FLAGS,@progbits
200
- .Lframe1:
201
- .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
202
- .LSCIE1:
203
- .4byte 0x0 # CIE Identifier Tag
204
- .byte 0x1 # CIE Version
205
- .ascii "zR\0" # CIE Augmentation
206
- .uleb128 0x1 # CIE Code Alignment Factor
207
- .sleb128 -8 # CIE Data Alignment Factor
208
- .byte 0x41 # CIE RA Column
209
- .uleb128 0x1 # Augmentation size
210
- .byte 0x14 # FDE Encoding (pcrel udata8)
211
- .byte 0xc # DW_CFA_def_cfa
212
- .uleb128 0x1
213
- .uleb128 0x0
214
- .align 3
215
- .LECIE1:
216
- .LSFDE1:
217
- .4byte .LEFDE1-.LASFDE1 # FDE Length
218
- .LASFDE1:
219
- .4byte .LASFDE1-.Lframe1 # FDE CIE offset
220
- .8byte .LFB1-. # FDE initial location
221
- .8byte .LFE1-.LFB1 # FDE address range
222
- .uleb128 0x0 # Augmentation size
223
- .byte 0x2 # DW_CFA_advance_loc1
224
- .byte .LCFI0-.LFB1
225
- .byte 0xe # DW_CFA_def_cfa_offset
226
- .uleb128 240
227
- .byte 0x11 # DW_CFA_offset_extended_sf
228
- .uleb128 0x41
229
- .sleb128 -2
230
- .align 3
231
- .LEFDE1:
459
+ # load up the pointer to the parm save area
460
+ addi %r7, %r1, PARMSAVE
461
+ # endif
462
+ std %r0, 16(%r1)
463
+
464
+ # closure->cif
465
+ ld %r3, 8(%r11)
466
+ # closure->fun
467
+ ld %r4, 16(%r11)
468
+ # user_data
469
+ mr %r5, %r11
470
+ b .Ldoclosure
471
+
472
+ .cfi_endproc
473
+ # if _CALL_ELF == 2
474
+ .size ffi_go_closure_linux64,.-ffi_go_closure_linux64
475
+ # else
476
+ # ifdef _CALL_LINUX
477
+ .size ffi_go_closure_linux64,.-.L.ffi_go_closure_linux64
478
+ # else
479
+ .long 0
480
+ .byte 0,12,0,1,128,0,0,0
481
+ .size .ffi_go_closure_linux64,.-.ffi_go_closure_linux64
482
+ # endif
483
+ # endif
232
484
  #endif
233
485
 
234
- #if defined __ELF__ && defined __linux__
486
+ #if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
235
487
  .section .note.GNU-stack,"",@progbits
236
488
  #endif