ffi 1.9.18 → 1.9.21

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

Potentially problematic release.


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

Files changed (366) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/Rakefile +14 -3
  4. data/ext/ffi_c/AbstractMemory.c +6 -1
  5. data/ext/ffi_c/Platform.c +10 -2
  6. data/ext/ffi_c/extconf.rb +7 -2
  7. data/ext/ffi_c/libffi.bsd.mk +9 -3
  8. data/ext/ffi_c/libffi.darwin.mk +14 -4
  9. data/ext/ffi_c/libffi.gnu.mk +2 -1
  10. data/ext/ffi_c/libffi.mk +9 -4
  11. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  12. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  13. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  14. data/ext/ffi_c/libffi/LICENSE +1 -1
  15. data/ext/ffi_c/libffi/Makefile.am +166 -157
  16. data/ext/ffi_c/libffi/README +164 -52
  17. data/ext/ffi_c/libffi/acinclude.m4 +381 -0
  18. data/ext/ffi_c/libffi/autogen.sh +2 -0
  19. data/ext/ffi_c/libffi/configure.ac +148 -256
  20. data/ext/ffi_c/libffi/configure.host +265 -4
  21. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  22. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  23. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  24. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +207 -0
  25. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  26. data/ext/ffi_c/libffi/include/ffi.h.in +107 -50
  27. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  28. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  29. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  30. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  31. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +637 -0
  32. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  33. data/ext/ffi_c/libffi/libtool-version +1 -1
  34. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  35. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  36. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  37. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  38. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  39. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  40. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  41. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  42. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  43. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  44. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  45. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  46. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  47. data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
  48. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  49. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  50. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  51. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  52. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  53. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  54. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  55. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  56. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  57. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  58. data/ext/ffi_c/libffi/src/arm/ffi.c +597 -517
  59. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  60. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  61. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  62. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  63. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  64. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  65. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  66. data/ext/ffi_c/libffi/src/closures.c +319 -44
  67. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  68. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  69. data/ext/ffi_c/libffi/src/debug.c +6 -1
  70. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  71. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  72. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  73. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  74. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  75. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  76. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  77. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  78. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  79. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  80. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  81. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  82. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  83. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  84. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  85. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  86. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  87. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  88. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  89. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  90. data/ext/ffi_c/libffi/src/mips/ffi.c +95 -28
  91. data/ext/ffi_c/libffi/src/mips/ffitarget.h +9 -2
  92. data/ext/ffi_c/libffi/src/mips/n32.S +126 -56
  93. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  94. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  95. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  96. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  97. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  98. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  99. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  100. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  101. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  102. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  103. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  104. data/ext/ffi_c/libffi/src/powerpc/aix.S +6 -6
  105. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +3 -1
  106. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  107. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  108. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  109. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  110. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +25 -25
  111. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  112. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  113. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  114. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +100 -44
  115. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  116. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  117. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  118. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  119. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  120. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  121. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  122. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  123. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  124. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  125. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  126. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  127. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  128. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  129. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  130. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  131. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  132. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  133. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  134. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  135. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  136. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  137. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  138. data/ext/ffi_c/libffi/src/types.c +43 -14
  139. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  140. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  141. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  142. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  143. data/ext/ffi_c/libffi/src/x86/ffi.c +589 -500
  144. data/ext/ffi_c/libffi/src/x86/ffi64.c +338 -116
  145. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  146. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  147. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  148. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  149. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  150. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  151. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  152. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  153. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  154. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  155. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  156. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  157. data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -73
  158. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +120 -25
  159. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  262. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  263. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  284. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  315. data/ffi.gemspec +2 -2
  316. data/lib/ffi/enum.rb +124 -0
  317. data/lib/ffi/library.rb +65 -13
  318. data/lib/ffi/platform.rb +7 -2
  319. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  320. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  321. data/lib/ffi/pointer.rb +1 -0
  322. data/lib/ffi/struct.rb +0 -2
  323. data/lib/ffi/version.rb +1 -1
  324. data/spec/ffi/bitmask_spec.rb +575 -0
  325. data/spec/ffi/fixtures/BitmaskTest.c +51 -0
  326. data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
  327. data/spec/ffi/struct_spec.rb +0 -4
  328. metadata +143 -51
  329. data/ext/ffi_c/libffi/Makefile.in +0 -1820
  330. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  331. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  332. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  333. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  334. data/ext/ffi_c/libffi/compile +0 -143
  335. data/ext/ffi_c/libffi/config.guess +0 -1501
  336. data/ext/ffi_c/libffi/config.sub +0 -1705
  337. data/ext/ffi_c/libffi/configure +0 -17191
  338. data/ext/ffi_c/libffi/depcomp +0 -630
  339. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  340. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  341. data/ext/ffi_c/libffi/fficonfig.h.in +0 -199
  342. data/ext/ffi_c/libffi/include/Makefile.in +0 -487
  343. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  344. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  345. data/ext/ffi_c/libffi/install-sh +0 -520
  346. data/ext/ffi_c/libffi/ltmain.sh +0 -9636
  347. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  348. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  349. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  350. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  351. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  352. data/ext/ffi_c/libffi/man/Makefile.in +0 -466
  353. data/ext/ffi_c/libffi/mdate-sh +0 -201
  354. data/ext/ffi_c/libffi/missing +0 -376
  355. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  356. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  357. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  358. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  359. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  360. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  361. data/ext/ffi_c/libffi/testsuite/Makefile.in +0 -500
  362. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  365. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  366. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
@@ -1,6 +1,8 @@
1
1
  /* -----------------------------------------------------------------*-C-*-
2
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
3
- Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc
2
+ ffitarget.h - Copyright (c) 2012 Anthony Green
3
+ Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc
4
+ Copyright (c) 1996-2003 Red Hat, Inc.
5
+
4
6
  Target configuration macros for PowerPC.
5
7
 
6
8
  Permission is hereby granted, free of charge, to any person obtaining
@@ -28,6 +30,10 @@
28
30
  #ifndef LIBFFI_TARGET_H
29
31
  #define LIBFFI_TARGET_H
30
32
 
33
+ #ifndef LIBFFI_H
34
+ #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
35
+ #endif
36
+
31
37
  /* ---- System specific configurations ----------------------------------- */
32
38
 
33
39
  #if defined (POWERPC) && defined (__powerpc64__) /* linux64 */
@@ -54,49 +60,76 @@ typedef signed long ffi_sarg;
54
60
  typedef enum ffi_abi {
55
61
  FFI_FIRST_ABI = 0,
56
62
 
57
- #ifdef POWERPC
58
- FFI_SYSV,
59
- FFI_GCC_SYSV,
60
- FFI_LINUX64,
61
- FFI_LINUX,
62
- FFI_LINUX_SOFT_FLOAT,
63
- # ifdef POWERPC64
64
- FFI_DEFAULT_ABI = FFI_LINUX64,
65
- # else
66
- # if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106))
67
- FFI_DEFAULT_ABI = FFI_LINUX,
68
- # else
69
- # ifdef __NO_FPRS__
70
- FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT,
71
- # else
72
- FFI_DEFAULT_ABI = FFI_GCC_SYSV,
73
- # endif
74
- # endif
75
- # endif
76
- #endif
77
-
78
- #ifdef POWERPC_AIX
63
+ #if defined (POWERPC_AIX)
79
64
  FFI_AIX,
80
65
  FFI_DARWIN,
81
66
  FFI_DEFAULT_ABI = FFI_AIX,
82
- #endif
67
+ FFI_LAST_ABI
83
68
 
84
- #ifdef POWERPC_DARWIN
69
+ #elif defined (POWERPC_DARWIN)
85
70
  FFI_AIX,
86
71
  FFI_DARWIN,
87
72
  FFI_DEFAULT_ABI = FFI_DARWIN,
88
- #endif
73
+ FFI_LAST_ABI
89
74
 
90
- #ifdef POWERPC_FREEBSD
91
- FFI_SYSV,
92
- FFI_GCC_SYSV,
93
- FFI_LINUX64,
94
- FFI_LINUX,
95
- FFI_LINUX_SOFT_FLOAT,
96
- FFI_DEFAULT_ABI = FFI_SYSV,
75
+ #else
76
+ /* The FFI_COMPAT values are used by old code. Since libffi may be
77
+ a shared library we have to support old values for backwards
78
+ compatibility. */
79
+ FFI_COMPAT_SYSV,
80
+ FFI_COMPAT_GCC_SYSV,
81
+ FFI_COMPAT_LINUX64,
82
+ FFI_COMPAT_LINUX,
83
+ FFI_COMPAT_LINUX_SOFT_FLOAT,
84
+
85
+ # if defined (POWERPC64)
86
+ /* This bit, always set in new code, must not be set in any of the
87
+ old FFI_COMPAT values that might be used for 64-bit linux. We
88
+ only need worry about FFI_COMPAT_LINUX64, but to be safe avoid
89
+ all old values. */
90
+ FFI_LINUX = 8,
91
+ /* This and following bits can reuse FFI_COMPAT values. */
92
+ FFI_LINUX_STRUCT_ALIGN = 1,
93
+ FFI_LINUX_LONG_DOUBLE_128 = 2,
94
+ FFI_DEFAULT_ABI = (FFI_LINUX
95
+ # ifdef __STRUCT_PARM_ALIGN__
96
+ | FFI_LINUX_STRUCT_ALIGN
97
+ # endif
98
+ # ifdef __LONG_DOUBLE_128__
99
+ | FFI_LINUX_LONG_DOUBLE_128
100
+ # endif
101
+ ),
102
+ FFI_LAST_ABI = 12
103
+
104
+ # else
105
+ /* This bit, always set in new code, must not be set in any of the
106
+ old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */
107
+ FFI_SYSV = 8,
108
+ /* This and following bits can reuse FFI_COMPAT values. */
109
+ FFI_SYSV_SOFT_FLOAT = 1,
110
+ FFI_SYSV_STRUCT_RET = 2,
111
+ FFI_SYSV_IBM_LONG_DOUBLE = 4,
112
+ FFI_SYSV_LONG_DOUBLE_128 = 16,
113
+
114
+ FFI_DEFAULT_ABI = (FFI_SYSV
115
+ # ifdef __NO_FPRS__
116
+ | FFI_SYSV_SOFT_FLOAT
117
+ # endif
118
+ # if (defined (__SVR4_STRUCT_RETURN) \
119
+ || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN))
120
+ | FFI_SYSV_STRUCT_RET
121
+ # endif
122
+ # if __LDBL_MANT_DIG__ == 106
123
+ | FFI_SYSV_IBM_LONG_DOUBLE
124
+ # endif
125
+ # ifdef __LONG_DOUBLE_128__
126
+ | FFI_SYSV_LONG_DOUBLE_128
127
+ # endif
128
+ ),
129
+ FFI_LAST_ABI = 32
130
+ # endif
97
131
  #endif
98
132
 
99
- FFI_LAST_ABI
100
133
  } ffi_abi;
101
134
  #endif
102
135
 
@@ -104,26 +137,49 @@ typedef enum ffi_abi {
104
137
 
105
138
  #define FFI_CLOSURES 1
106
139
  #define FFI_NATIVE_RAW_API 0
140
+ #if defined (POWERPC) || defined (POWERPC_FREEBSD)
141
+ # define FFI_GO_CLOSURES 1
142
+ # define FFI_TARGET_SPECIFIC_VARIADIC 1
143
+ # define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs
144
+ #endif
107
145
 
108
- /* For additional types like the below, take care about the order in
109
- ppc_closures.S. They must follow after the FFI_TYPE_LAST. */
146
+ /* ppc_closure.S and linux64_closure.S expect this. */
147
+ #define FFI_PPC_TYPE_LAST FFI_TYPE_POINTER
148
+
149
+ /* We define additional types below. If generic types are added that
150
+ must be supported by powerpc libffi then it is likely that
151
+ FFI_PPC_TYPE_LAST needs increasing *and* the jump tables in
152
+ ppc_closure.S and linux64_closure.S be extended. */
153
+
154
+ #if !(FFI_TYPE_LAST == FFI_PPC_TYPE_LAST \
155
+ || (FFI_TYPE_LAST == FFI_TYPE_COMPLEX \
156
+ && !defined FFI_TARGET_HAS_COMPLEX_TYPE))
157
+ # error "You likely have a broken powerpc libffi"
158
+ #endif
110
159
 
111
160
  /* Needed for soft-float long-double-128 support. */
112
- #define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1)
161
+ #define FFI_TYPE_UINT128 (FFI_PPC_TYPE_LAST + 1)
162
+
163
+ /* Needed for FFI_SYSV small structure returns. */
164
+ #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2)
113
165
 
114
- /* Needed for FFI_SYSV small structure returns.
115
- We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are
116
- defined in ffi.c, to determine the exact return type and its size. */
117
- #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2)
166
+ /* Used by ELFv2 for homogenous structure returns. */
167
+ #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 1)
168
+ #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 2)
169
+ #define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 3)
118
170
 
119
- #if defined(POWERPC64) || defined(POWERPC_AIX)
171
+ #if _CALL_ELF == 2
172
+ # define FFI_TRAMPOLINE_SIZE 32
173
+ #else
174
+ # if defined(POWERPC64) || defined(POWERPC_AIX)
120
175
  # if defined(POWERPC_DARWIN64)
121
176
  # define FFI_TRAMPOLINE_SIZE 48
122
177
  # else
123
178
  # define FFI_TRAMPOLINE_SIZE 24
124
179
  # endif
125
- #else /* POWERPC || POWERPC_AIX */
180
+ # else /* POWERPC || POWERPC_AIX */
126
181
  # define FFI_TRAMPOLINE_SIZE 40
182
+ # endif
127
183
  #endif
128
184
 
129
185
  #ifndef LIBFFI_ASM
@@ -29,47 +29,83 @@
29
29
  #include <fficonfig.h>
30
30
  #include <ffi.h>
31
31
 
32
- #ifdef __powerpc64__
33
- .hidden ffi_call_LINUX64, .ffi_call_LINUX64
34
- .globl ffi_call_LINUX64, .ffi_call_LINUX64
32
+ #ifdef POWERPC64
33
+ .hidden ffi_call_LINUX64
34
+ .globl ffi_call_LINUX64
35
+ .text
36
+ .cfi_startproc
37
+ # if _CALL_ELF == 2
38
+ ffi_call_LINUX64:
39
+ addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha
40
+ addi %r2, %r2, .TOC.-ffi_call_LINUX64@l
41
+ .localentry ffi_call_LINUX64, . - ffi_call_LINUX64
42
+ # else
35
43
  .section ".opd","aw"
36
44
  .align 3
37
45
  ffi_call_LINUX64:
46
+ # ifdef _CALL_LINUX
47
+ .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0
48
+ .type ffi_call_LINUX64,@function
49
+ .text
50
+ .L.ffi_call_LINUX64:
51
+ # else
52
+ .hidden .ffi_call_LINUX64
53
+ .globl .ffi_call_LINUX64
38
54
  .quad .ffi_call_LINUX64,.TOC.@tocbase,0
39
55
  .size ffi_call_LINUX64,24
40
56
  .type .ffi_call_LINUX64,@function
41
57
  .text
42
58
  .ffi_call_LINUX64:
43
- .LFB1:
59
+ # endif
60
+ # endif
44
61
  mflr %r0
45
62
  std %r28, -32(%r1)
46
63
  std %r29, -24(%r1)
47
64
  std %r30, -16(%r1)
48
65
  std %r31, -8(%r1)
66
+ std %r7, 8(%r1) /* closure, saved in cr field. */
49
67
  std %r0, 16(%r1)
50
68
 
51
69
  mr %r28, %r1 /* our AP. */
52
- .LCFI0:
53
- stdux %r1, %r1, %r4
54
- mr %r31, %r5 /* flags, */
55
- mr %r30, %r6 /* rvalue, */
56
- mr %r29, %r7 /* function address. */
70
+ .cfi_def_cfa_register 28
71
+ .cfi_offset 65, 16
72
+ .cfi_offset 31, -8
73
+ .cfi_offset 30, -16
74
+ .cfi_offset 29, -24
75
+ .cfi_offset 28, -32
76
+
77
+ stdux %r1, %r1, %r8
78
+ mr %r31, %r6 /* flags, */
79
+ mr %r30, %r5 /* rvalue, */
80
+ mr %r29, %r4 /* function address. */
81
+ /* Save toc pointer, not for the ffi_prep_args64 call, but for the later
82
+ bctrl function call. */
83
+ # if _CALL_ELF == 2
84
+ std %r2, 24(%r1)
85
+ # else
57
86
  std %r2, 40(%r1)
87
+ # endif
58
88
 
59
89
  /* Call ffi_prep_args64. */
60
90
  mr %r4, %r1
91
+ # if defined _CALL_LINUX || _CALL_ELF == 2
92
+ bl ffi_prep_args64
93
+ # else
61
94
  bl .ffi_prep_args64
95
+ # endif
62
96
 
63
- ld %r0, 0(%r29)
97
+ # if _CALL_ELF == 2
98
+ mr %r12, %r29
99
+ # else
100
+ ld %r12, 0(%r29)
64
101
  ld %r2, 8(%r29)
65
- ld %r11, 16(%r29)
66
-
102
+ # endif
67
103
  /* Now do the call. */
68
104
  /* Set up cr1 with bits 4-7 of the flags. */
69
105
  mtcrf 0x40, %r31
70
106
 
71
107
  /* Get the address to call into CTR. */
72
- mtctr %r0
108
+ mtctr %r12
73
109
  /* Load all those argument registers. */
74
110
  ld %r3, -32-(8*8)(%r28)
75
111
  ld %r4, -32-(7*8)(%r28)
@@ -100,24 +136,31 @@ ffi_call_LINUX64:
100
136
  2:
101
137
 
102
138
  /* Make the call. */
139
+ ld %r11, 8(%r28)
103
140
  bctrl
104
141
 
105
142
  /* This must follow the call immediately, the unwinder
106
143
  uses this to find out if r2 has been saved or not. */
144
+ # if _CALL_ELF == 2
145
+ ld %r2, 24(%r1)
146
+ # else
107
147
  ld %r2, 40(%r1)
148
+ # endif
108
149
 
109
150
  /* Now, deal with the return value. */
110
151
  mtcrf 0x01, %r31
111
- bt- 30, .Ldone_return_value
112
- bt- 29, .Lfp_return_value
152
+ bt 31, .Lstruct_return_value
153
+ bt 30, .Ldone_return_value
154
+ bt 29, .Lfp_return_value
113
155
  std %r3, 0(%r30)
114
156
  /* Fall through... */
115
157
 
116
158
  .Ldone_return_value:
117
159
  /* Restore the registers we used and return. */
118
160
  mr %r1, %r28
161
+ .cfi_def_cfa_register 1
119
162
  ld %r0, 16(%r28)
120
- ld %r28, -32(%r1)
163
+ ld %r28, -32(%r28)
121
164
  mtlr %r0
122
165
  ld %r29, -24(%r1)
123
166
  ld %r30, -16(%r1)
@@ -125,6 +168,7 @@ ffi_call_LINUX64:
125
168
  blr
126
169
 
127
170
  .Lfp_return_value:
171
+ .cfi_def_cfa_register 28
128
172
  bf 28, .Lfloat_return_value
129
173
  stfd %f1, 0(%r30)
130
174
  mtcrf 0x02, %r31 /* cr6 */
@@ -134,54 +178,51 @@ ffi_call_LINUX64:
134
178
  .Lfloat_return_value:
135
179
  stfs %f1, 0(%r30)
136
180
  b .Ldone_return_value
137
- .LFE1:
181
+
182
+ .Lstruct_return_value:
183
+ bf 29, .Lsmall_struct
184
+ bf 28, .Lfloat_homog_return_value
185
+ stfd %f1, 0(%r30)
186
+ stfd %f2, 8(%r30)
187
+ stfd %f3, 16(%r30)
188
+ stfd %f4, 24(%r30)
189
+ stfd %f5, 32(%r30)
190
+ stfd %f6, 40(%r30)
191
+ stfd %f7, 48(%r30)
192
+ stfd %f8, 56(%r30)
193
+ b .Ldone_return_value
194
+
195
+ .Lfloat_homog_return_value:
196
+ stfs %f1, 0(%r30)
197
+ stfs %f2, 4(%r30)
198
+ stfs %f3, 8(%r30)
199
+ stfs %f4, 12(%r30)
200
+ stfs %f5, 16(%r30)
201
+ stfs %f6, 20(%r30)
202
+ stfs %f7, 24(%r30)
203
+ stfs %f8, 28(%r30)
204
+ b .Ldone_return_value
205
+
206
+ .Lsmall_struct:
207
+ std %r3, 0(%r30)
208
+ std %r4, 8(%r30)
209
+ b .Ldone_return_value
210
+
211
+ .cfi_endproc
212
+ # if _CALL_ELF == 2
213
+ .size ffi_call_LINUX64,.-ffi_call_LINUX64
214
+ # else
215
+ # ifdef _CALL_LINUX
216
+ .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64
217
+ # else
138
218
  .long 0
139
219
  .byte 0,12,0,1,128,4,0,0
140
220
  .size .ffi_call_LINUX64,.-.ffi_call_LINUX64
221
+ # endif
222
+ # endif
141
223
 
142
- .section .eh_frame,EH_FRAME_FLAGS,@progbits
143
- .Lframe1:
144
- .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
145
- .LSCIE1:
146
- .4byte 0x0 # CIE Identifier Tag
147
- .byte 0x1 # CIE Version
148
- .ascii "zR\0" # CIE Augmentation
149
- .uleb128 0x1 # CIE Code Alignment Factor
150
- .sleb128 -8 # CIE Data Alignment Factor
151
- .byte 0x41 # CIE RA Column
152
- .uleb128 0x1 # Augmentation size
153
- .byte 0x14 # FDE Encoding (pcrel udata8)
154
- .byte 0xc # DW_CFA_def_cfa
155
- .uleb128 0x1
156
- .uleb128 0x0
157
- .align 3
158
- .LECIE1:
159
- .LSFDE1:
160
- .4byte .LEFDE1-.LASFDE1 # FDE Length
161
- .LASFDE1:
162
- .4byte .LASFDE1-.Lframe1 # FDE CIE offset
163
- .8byte .LFB1-. # FDE initial location
164
- .8byte .LFE1-.LFB1 # FDE address range
165
- .uleb128 0x0 # Augmentation size
166
- .byte 0x2 # DW_CFA_advance_loc1
167
- .byte .LCFI0-.LFB1
168
- .byte 0xd # DW_CFA_def_cfa_register
169
- .uleb128 0x1c
170
- .byte 0x11 # DW_CFA_offset_extended_sf
171
- .uleb128 0x41
172
- .sleb128 -2
173
- .byte 0x9f # DW_CFA_offset, column 0x1f
174
- .uleb128 0x1
175
- .byte 0x9e # DW_CFA_offset, column 0x1e
176
- .uleb128 0x2
177
- .byte 0x9d # DW_CFA_offset, column 0x1d
178
- .uleb128 0x3
179
- .byte 0x9c # DW_CFA_offset, column 0x1c
180
- .uleb128 0x4
181
- .align 3
182
- .LEFDE1:
183
224
  #endif
184
225
 
185
- #if defined __ELF__ && defined __linux__
226
+ #if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
186
227
  .section .note.GNU-stack,"",@progbits
187
228
  #endif
@@ -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