ffi 1.9.18-x86-mingw32 → 1.9.21-x86-mingw32
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.
- checksums.yaml +5 -5
- data/README.md +3 -2
- data/Rakefile +14 -4
- data/ext/ffi_c/AbstractMemory.c +6 -1
- data/ext/ffi_c/Platform.c +10 -2
- data/ext/ffi_c/extconf.rb +7 -2
- data/ext/ffi_c/libffi.bsd.mk +9 -3
- data/ext/ffi_c/libffi.darwin.mk +14 -4
- data/ext/ffi_c/libffi.gnu.mk +2 -1
- data/ext/ffi_c/libffi.mk +9 -4
- data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
- data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
- data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +166 -157
- data/ext/ffi_c/libffi/Makefile.in +923 -938
- data/ext/ffi_c/libffi/README +164 -52
- data/ext/ffi_c/libffi/acinclude.m4 +381 -0
- data/ext/ffi_c/libffi/aclocal.m4 +645 -384
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.0 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.1 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.2 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/output.3 +21972 -0
- data/ext/ffi_c/libffi/autom4te.cache/requests +331 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.0 +4010 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.1 +1005 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.2 +4010 -0
- data/ext/ffi_c/libffi/autom4te.cache/traces.3 +4010 -0
- data/ext/ffi_c/libffi/compile +218 -14
- data/ext/ffi_c/libffi/config.guess +329 -368
- data/ext/ffi_c/libffi/config.sub +232 -112
- data/ext/ffi_c/libffi/configure +6970 -2189
- data/ext/ffi_c/libffi/configure.ac +148 -256
- data/ext/ffi_c/libffi/configure.host +265 -4
- data/ext/ffi_c/libffi/depcomp +346 -185
- data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
- data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
- data/ext/ffi_c/libffi/{mdate-sh → doc/mdate-sh} +40 -13
- data/ext/ffi_c/libffi/{texinfo.tex → doc/texinfo.tex} +3990 -1121
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
- data/ext/ffi_c/libffi/fficonfig.h.in~ +210 -0
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +207 -0
- data/ext/ffi_c/libffi/include/Makefile.am +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +188 -71
- data/ext/ffi_c/libffi/include/ffi.h.in +107 -50
- data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
- data/ext/ffi_c/libffi/install-sh +190 -202
- data/ext/ffi_c/libffi/libffi.map.in +80 -0
- data/ext/ffi_c/libffi/libffi.pc.in +3 -2
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +637 -0
- data/ext/ffi_c/libffi/libtool-ldflags +106 -0
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
- data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
- data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
- data/ext/ffi_c/libffi/m4/libtool.m4 +1691 -1135
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +104 -36
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +4 -3
- data/ext/ffi_c/libffi/m4/ltversion.m4 +6 -6
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +4 -3
- data/ext/ffi_c/libffi/man/Makefile.am +2 -2
- data/ext/ffi_c/libffi/man/Makefile.in +141 -49
- data/ext/ffi_c/libffi/man/ffi.3 +10 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
- data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
- data/ext/ffi_c/libffi/missing +150 -311
- data/ext/ffi_c/libffi/msvcc.sh +72 -9
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
- data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
- data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
- data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
- data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +597 -517
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
- data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
- data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
- data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
- data/ext/ffi_c/libffi/src/closures.c +319 -44
- data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/debug.c +6 -1
- data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
- data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
- data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
- data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
- data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
- data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
- data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
- data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
- data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
- data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +95 -28
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +9 -2
- data/ext/ffi_c/libffi/src/mips/n32.S +126 -56
- data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
- data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
- data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
- data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
- data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
- data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
- data/ext/ffi_c/libffi/src/powerpc/aix.S +6 -6
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +3 -1
- data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +25 -25
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +100 -44
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
- data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
- data/ext/ffi_c/libffi/src/raw_api.c +18 -5
- data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
- data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
- data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
- data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
- data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
- data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
- data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
- data/ext/ffi_c/libffi/src/types.c +43 -14
- data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
- data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
- data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +589 -500
- data/ext/ffi_c/libffi/src/x86/ffi64.c +338 -116
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
- data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
- data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
- data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
- data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
- data/ext/ffi_c/libffi/stamp-h.in +1 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -73
- data/ext/ffi_c/libffi/testsuite/Makefile.in +218 -111
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +120 -25
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
- data/ffi.gemspec +2 -2
- data/lib/2.0/ffi_c.so +0 -0
- data/lib/2.1/ffi_c.so +0 -0
- data/lib/2.2/ffi_c.so +0 -0
- data/lib/2.3/ffi_c.so +0 -0
- data/lib/2.4/ffi_c.so +0 -0
- data/lib/2.5/ffi_c.so +0 -0
- data/lib/ffi/enum.rb +124 -0
- data/lib/ffi/library.rb +65 -13
- data/lib/ffi/platform.rb +7 -2
- data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
- data/lib/ffi/pointer.rb +1 -0
- data/lib/ffi/struct.rb +0 -2
- data/lib/ffi/version.rb +1 -1
- data/spec/ffi/bitmask_spec.rb +575 -0
- data/spec/ffi/embed-test/ext/Makefile +242 -0
- data/spec/ffi/fixtures/BitmaskTest.c +51 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +4 -0
- data/spec/ffi/struct_spec.rb +0 -4
- metadata +158 -32
- data/ext/ffi_c/libffi/Makefile.vc +0 -141
- data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
- data/ext/ffi_c/libffi/build-ios.sh +0 -67
- data/ext/ffi_c/libffi/doc/libffi.info +0 -593
- data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
- data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
- data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
- data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
- data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
- data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
- data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
- data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
- data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
@@ -1,6 +1,8 @@
|
|
1
1
|
/* -----------------------------------------------------------------*-C-*-
|
2
|
-
ffitarget.h - Copyright (c)
|
3
|
-
|
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
|
-
#
|
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
|
-
|
67
|
+
FFI_LAST_ABI
|
83
68
|
|
84
|
-
#
|
69
|
+
#elif defined (POWERPC_DARWIN)
|
85
70
|
FFI_AIX,
|
86
71
|
FFI_DARWIN,
|
87
72
|
FFI_DEFAULT_ABI = FFI_DARWIN,
|
88
|
-
|
73
|
+
FFI_LAST_ABI
|
89
74
|
|
90
|
-
#
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
-
/*
|
109
|
-
|
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 (
|
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
|
-
/*
|
115
|
-
|
116
|
-
|
117
|
-
#define
|
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
|
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
|
33
|
-
.hidden ffi_call_LINUX64
|
34
|
-
.globl 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
|
-
|
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
|
-
.
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
97
|
+
# if _CALL_ELF == 2
|
98
|
+
mr %r12, %r29
|
99
|
+
# else
|
100
|
+
ld %r12, 0(%r29)
|
64
101
|
ld %r2, 8(%r29)
|
65
|
-
|
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 %
|
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
|
112
|
-
bt
|
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(%
|
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
|
-
|
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
|
33
|
+
#ifdef POWERPC64
|
34
34
|
FFI_HIDDEN (ffi_closure_LINUX64)
|
35
|
-
|
36
|
-
.
|
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
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
54
|
-
|
55
|
-
|
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
|
-
#
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
66
|
-
stfd
|
67
|
-
stfd
|
68
|
-
stfd
|
69
|
-
stfd
|
70
|
-
stfd
|
71
|
-
stfd
|
72
|
-
stfd
|
73
|
-
stfd
|
74
|
-
stfd
|
75
|
-
stfd
|
76
|
-
stfd
|
77
|
-
stfd
|
78
|
-
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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,
|
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
|
-
|
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,
|
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,
|
205
|
+
lfs %f1, RETVAL+0(%r1)
|
129
206
|
mtlr %r0
|
130
|
-
addi %r1, %r1,
|
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,
|
212
|
+
lfd %f1, RETVAL+0(%r1)
|
134
213
|
mtlr %r0
|
135
|
-
addi %r1, %r1,
|
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,
|
219
|
+
lfd %f1, RETVAL+0(%r1)
|
139
220
|
mtlr %r0
|
140
|
-
lfd %f2,
|
221
|
+
lfd %f2, RETVAL+8(%r1)
|
141
222
|
b .Lfinish
|
142
223
|
# case FFI_TYPE_UINT8
|
143
|
-
|
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,
|
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
|
-
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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,
|
289
|
+
ld %r3, RETVAL+0(%r1)
|
175
290
|
mtlr %r0
|
176
|
-
addi %r1, %r1,
|
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,
|
296
|
+
ld %r3, RETVAL+0(%r1)
|
180
297
|
mtlr %r0
|
181
|
-
addi %r1, %r1,
|
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,
|
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,
|
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
|
-
|
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
|
-
#
|
194
|
-
|
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
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
.
|
211
|
-
|
212
|
-
.
|
213
|
-
|
214
|
-
.
|
215
|
-
|
216
|
-
|
217
|
-
.
|
218
|
-
|
219
|
-
.
|
220
|
-
.
|
221
|
-
.
|
222
|
-
|
223
|
-
|
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
|