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,5 +1,6 @@
|
|
1
1
|
/* -----------------------------------------------------------------*-C-*-
|
2
|
-
ffitarget.h - Copyright (c)
|
2
|
+
ffitarget.h - Copyright (c) 2012 Anthony Green
|
3
|
+
Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
|
3
4
|
Target configuration macros for AVR32.
|
4
5
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining
|
@@ -27,6 +28,10 @@
|
|
27
28
|
#ifndef LIBFFI_TARGET_H
|
28
29
|
#define LIBFFI_TARGET_H
|
29
30
|
|
31
|
+
#ifndef LIBFFI_H
|
32
|
+
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
33
|
+
#endif
|
34
|
+
|
30
35
|
#ifndef LIBFFI_ASM
|
31
36
|
typedef unsigned long ffi_arg;
|
32
37
|
typedef signed long ffi_sarg;
|
@@ -0,0 +1,196 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
|
3
|
+
Paulo Pizarro <paulo.pizarro@gmail.com>
|
4
|
+
|
5
|
+
Blackfin Foreign Function Interface
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
``Software''), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be included
|
16
|
+
in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
22
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
23
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
25
|
+
DEALINGS IN THE SOFTWARE.
|
26
|
+
----------------------------------------------------------------------- */
|
27
|
+
#include <ffi.h>
|
28
|
+
#include <ffi_common.h>
|
29
|
+
|
30
|
+
#include <stdlib.h>
|
31
|
+
#include <stdio.h>
|
32
|
+
|
33
|
+
/* Maximum number of GPRs available for argument passing. */
|
34
|
+
#define MAX_GPRARGS 3
|
35
|
+
|
36
|
+
/*
|
37
|
+
* Return types
|
38
|
+
*/
|
39
|
+
#define FFIBFIN_RET_VOID 0
|
40
|
+
#define FFIBFIN_RET_BYTE 1
|
41
|
+
#define FFIBFIN_RET_HALFWORD 2
|
42
|
+
#define FFIBFIN_RET_INT64 3
|
43
|
+
#define FFIBFIN_RET_INT32 4
|
44
|
+
|
45
|
+
/*====================================================================*/
|
46
|
+
/* PROTOTYPE *
|
47
|
+
/*====================================================================*/
|
48
|
+
void ffi_prep_args(unsigned char *, extended_cif *);
|
49
|
+
|
50
|
+
/*====================================================================*/
|
51
|
+
/* Externals */
|
52
|
+
/* (Assembly) */
|
53
|
+
/*====================================================================*/
|
54
|
+
|
55
|
+
extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void));
|
56
|
+
|
57
|
+
/*====================================================================*/
|
58
|
+
/* Implementation */
|
59
|
+
/* */
|
60
|
+
/*====================================================================*/
|
61
|
+
|
62
|
+
|
63
|
+
/*
|
64
|
+
* This function calculates the return type (size) based on type.
|
65
|
+
*/
|
66
|
+
|
67
|
+
ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
68
|
+
{
|
69
|
+
/* --------------------------------------*
|
70
|
+
* Return handling *
|
71
|
+
* --------------------------------------*/
|
72
|
+
switch (cif->rtype->type) {
|
73
|
+
case FFI_TYPE_VOID:
|
74
|
+
cif->flags = FFIBFIN_RET_VOID;
|
75
|
+
break;
|
76
|
+
case FFI_TYPE_UINT16:
|
77
|
+
case FFI_TYPE_SINT16:
|
78
|
+
cif->flags = FFIBFIN_RET_HALFWORD;
|
79
|
+
break;
|
80
|
+
case FFI_TYPE_UINT8:
|
81
|
+
cif->flags = FFIBFIN_RET_BYTE;
|
82
|
+
break;
|
83
|
+
case FFI_TYPE_INT:
|
84
|
+
case FFI_TYPE_UINT32:
|
85
|
+
case FFI_TYPE_SINT32:
|
86
|
+
case FFI_TYPE_FLOAT:
|
87
|
+
case FFI_TYPE_POINTER:
|
88
|
+
case FFI_TYPE_SINT8:
|
89
|
+
cif->flags = FFIBFIN_RET_INT32;
|
90
|
+
break;
|
91
|
+
case FFI_TYPE_SINT64:
|
92
|
+
case FFI_TYPE_UINT64:
|
93
|
+
case FFI_TYPE_DOUBLE:
|
94
|
+
cif->flags = FFIBFIN_RET_INT64;
|
95
|
+
break;
|
96
|
+
case FFI_TYPE_STRUCT:
|
97
|
+
if (cif->rtype->size <= 4){
|
98
|
+
cif->flags = FFIBFIN_RET_INT32;
|
99
|
+
}else if (cif->rtype->size == 8){
|
100
|
+
cif->flags = FFIBFIN_RET_INT64;
|
101
|
+
}else{
|
102
|
+
//it will return via a hidden pointer in P0
|
103
|
+
cif->flags = FFIBFIN_RET_VOID;
|
104
|
+
}
|
105
|
+
break;
|
106
|
+
default:
|
107
|
+
FFI_ASSERT(0);
|
108
|
+
break;
|
109
|
+
}
|
110
|
+
return FFI_OK;
|
111
|
+
}
|
112
|
+
|
113
|
+
/*
|
114
|
+
* This will prepare the arguments and will call the assembly routine
|
115
|
+
* cif = the call interface
|
116
|
+
* fn = the function to be called
|
117
|
+
* rvalue = the return value
|
118
|
+
* avalue = the arguments
|
119
|
+
*/
|
120
|
+
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
|
121
|
+
{
|
122
|
+
int ret_type = cif->flags;
|
123
|
+
extended_cif ecif;
|
124
|
+
ecif.cif = cif;
|
125
|
+
ecif.avalue = avalue;
|
126
|
+
ecif.rvalue = rvalue;
|
127
|
+
|
128
|
+
switch (cif->abi) {
|
129
|
+
case FFI_SYSV:
|
130
|
+
ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn);
|
131
|
+
break;
|
132
|
+
default:
|
133
|
+
FFI_ASSERT(0);
|
134
|
+
break;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
|
139
|
+
/*
|
140
|
+
* This function prepares the parameters (copies them from the ecif to the stack)
|
141
|
+
* to call the function (ffi_prep_args is called by the assembly routine in file
|
142
|
+
* sysv.S, which also calls the actual function)
|
143
|
+
*/
|
144
|
+
void ffi_prep_args(unsigned char *stack, extended_cif *ecif)
|
145
|
+
{
|
146
|
+
register unsigned int i = 0;
|
147
|
+
void **p_argv;
|
148
|
+
unsigned char *argp;
|
149
|
+
ffi_type **p_arg;
|
150
|
+
argp = stack;
|
151
|
+
p_argv = ecif->avalue;
|
152
|
+
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
153
|
+
(i != 0);
|
154
|
+
i--, p_arg++) {
|
155
|
+
size_t z;
|
156
|
+
z = (*p_arg)->size;
|
157
|
+
if (z < sizeof(int)) {
|
158
|
+
z = sizeof(int);
|
159
|
+
switch ((*p_arg)->type) {
|
160
|
+
case FFI_TYPE_SINT8: {
|
161
|
+
signed char v = *(SINT8 *)(* p_argv);
|
162
|
+
signed int t = v;
|
163
|
+
*(signed int *) argp = t;
|
164
|
+
}
|
165
|
+
break;
|
166
|
+
case FFI_TYPE_UINT8: {
|
167
|
+
unsigned char v = *(UINT8 *)(* p_argv);
|
168
|
+
unsigned int t = v;
|
169
|
+
*(unsigned int *) argp = t;
|
170
|
+
}
|
171
|
+
break;
|
172
|
+
case FFI_TYPE_SINT16:
|
173
|
+
*(signed int *) argp = (signed int) * (SINT16 *)(* p_argv);
|
174
|
+
break;
|
175
|
+
case FFI_TYPE_UINT16:
|
176
|
+
*(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv);
|
177
|
+
break;
|
178
|
+
case FFI_TYPE_STRUCT:
|
179
|
+
memcpy(argp, *p_argv, (*p_arg)->size);
|
180
|
+
break;
|
181
|
+
default:
|
182
|
+
FFI_ASSERT(0);
|
183
|
+
break;
|
184
|
+
}
|
185
|
+
} else if (z == sizeof(int)) {
|
186
|
+
*(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv);
|
187
|
+
} else {
|
188
|
+
memcpy(argp, *p_argv, z);
|
189
|
+
}
|
190
|
+
p_argv++;
|
191
|
+
argp += z;
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
|
196
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
|
3
|
+
|
4
|
+
Blackfin Foreign Function Interface
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files (the
|
8
|
+
``Software''), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be included
|
15
|
+
in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
21
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
22
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
24
|
+
DEALINGS IN THE SOFTWARE.
|
25
|
+
----------------------------------------------------------------------- */
|
26
|
+
|
27
|
+
#ifndef LIBFFI_TARGET_H
|
28
|
+
#define LIBFFI_TARGET_H
|
29
|
+
|
30
|
+
#ifndef LIBFFI_ASM
|
31
|
+
typedef unsigned long ffi_arg;
|
32
|
+
typedef signed long ffi_sarg;
|
33
|
+
|
34
|
+
typedef enum ffi_abi {
|
35
|
+
FFI_FIRST_ABI = 0,
|
36
|
+
FFI_SYSV,
|
37
|
+
FFI_LAST_ABI,
|
38
|
+
FFI_DEFAULT_ABI = FFI_SYSV
|
39
|
+
} ffi_abi;
|
40
|
+
#endif
|
41
|
+
|
42
|
+
#endif
|
43
|
+
|
@@ -0,0 +1,179 @@
|
|
1
|
+
/* -----------------------------------------------------------------------
|
2
|
+
sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
|
3
|
+
Paulo Pizarro <paulo.pizarro@gmail.com>
|
4
|
+
|
5
|
+
Blackfin Foreign Function Interface
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
``Software''), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be included
|
16
|
+
in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
22
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
23
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
25
|
+
DEALINGS IN THE SOFTWARE.
|
26
|
+
----------------------------------------------------------------------- */
|
27
|
+
|
28
|
+
#define LIBFFI_ASM
|
29
|
+
#include <fficonfig.h>
|
30
|
+
#include <ffi.h>
|
31
|
+
|
32
|
+
.text
|
33
|
+
.align 4
|
34
|
+
|
35
|
+
/*
|
36
|
+
There is a "feature" in the bfin toolchain that it puts a _ before function names
|
37
|
+
that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV
|
38
|
+
*/
|
39
|
+
.global _ffi_call_SYSV;
|
40
|
+
.type _ffi_call_SYSV, STT_FUNC;
|
41
|
+
.func ffi_call_SYSV
|
42
|
+
|
43
|
+
/*
|
44
|
+
cif->bytes = R0 (fp+8)
|
45
|
+
&ecif = R1 (fp+12)
|
46
|
+
ffi_prep_args = R2 (fp+16)
|
47
|
+
ret_type = stack (fp+20)
|
48
|
+
ecif.rvalue = stack (fp+24)
|
49
|
+
fn = stack (fp+28)
|
50
|
+
got (fp+32)
|
51
|
+
|
52
|
+
There is room for improvement here (we can use temporary registers
|
53
|
+
instead of saving the values in the memory)
|
54
|
+
REGS:
|
55
|
+
P5 => Stack pointer (function arguments)
|
56
|
+
R5 => cif->bytes
|
57
|
+
R4 => ret->type
|
58
|
+
|
59
|
+
FP-20 = P3
|
60
|
+
FP-16 = SP (parameters area)
|
61
|
+
FP-12 = SP (temp)
|
62
|
+
FP-08 = function return part 1 [R0]
|
63
|
+
FP-04 = function return part 2 [R1]
|
64
|
+
*/
|
65
|
+
|
66
|
+
_ffi_call_SYSV:
|
67
|
+
.prologue:
|
68
|
+
LINK 20;
|
69
|
+
[FP-20] = P3;
|
70
|
+
[FP+8] = R0;
|
71
|
+
[FP+12] = R1;
|
72
|
+
[FP+16] = R2;
|
73
|
+
|
74
|
+
.allocate_stack:
|
75
|
+
//alocate cif->bytes into the stack
|
76
|
+
R1 = [FP+8];
|
77
|
+
R0 = SP;
|
78
|
+
R0 = R0 - R1;
|
79
|
+
R1 = 4;
|
80
|
+
R0 = R0 - R1;
|
81
|
+
[FP-12] = SP;
|
82
|
+
SP = R0;
|
83
|
+
[FP-16] = SP;
|
84
|
+
|
85
|
+
.call_prep_args:
|
86
|
+
//get the addr of prep_args
|
87
|
+
P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4];
|
88
|
+
P1 = [P0];
|
89
|
+
P3 = [P0+4];
|
90
|
+
R0 = [FP-16];//SP (parameter area)
|
91
|
+
R1 = [FP+12];//ecif
|
92
|
+
call (P1);
|
93
|
+
|
94
|
+
.call_user_function:
|
95
|
+
//ajust SP so as to allow the user function access the parameters on the stack
|
96
|
+
SP = [FP-16]; //point to function parameters
|
97
|
+
R0 = [SP];
|
98
|
+
R1 = [SP+4];
|
99
|
+
R2 = [SP+8];
|
100
|
+
//load user function address
|
101
|
+
P0 = FP;
|
102
|
+
P0 +=28;
|
103
|
+
P1 = [P0];
|
104
|
+
P1 = [P1];
|
105
|
+
P3 = [P0+4];
|
106
|
+
/*
|
107
|
+
For functions returning aggregate values (struct) occupying more than 8 bytes,
|
108
|
+
the caller allocates the return value object on the stack and the address
|
109
|
+
of this object is passed to the callee as a hidden argument in register P0.
|
110
|
+
*/
|
111
|
+
P0 = [FP+24];
|
112
|
+
|
113
|
+
call (P1);
|
114
|
+
SP = [FP-12];
|
115
|
+
.compute_return:
|
116
|
+
P2 = [FP-20];
|
117
|
+
[FP-8] = R0;
|
118
|
+
[FP-4] = R1;
|
119
|
+
|
120
|
+
R0 = [FP+20];
|
121
|
+
R1 = R0 << 2;
|
122
|
+
|
123
|
+
R0 = [P2+.rettable@GOT17M4];
|
124
|
+
R0 = R1 + R0;
|
125
|
+
P2 = R0;
|
126
|
+
R1 = [P2];
|
127
|
+
|
128
|
+
P2 = [FP+-20];
|
129
|
+
R0 = [P2+.rettable@GOT17M4];
|
130
|
+
R0 = R1 + R0;
|
131
|
+
P2 = R0;
|
132
|
+
R0 = [FP-8];
|
133
|
+
R1 = [FP-4];
|
134
|
+
jump (P2);
|
135
|
+
|
136
|
+
/*
|
137
|
+
#define FFIBFIN_RET_VOID 0
|
138
|
+
#define FFIBFIN_RET_BYTE 1
|
139
|
+
#define FFIBFIN_RET_HALFWORD 2
|
140
|
+
#define FFIBFIN_RET_INT64 3
|
141
|
+
#define FFIBFIN_RET_INT32 4
|
142
|
+
*/
|
143
|
+
.align 4
|
144
|
+
.align 4
|
145
|
+
.rettable:
|
146
|
+
.dd .epilogue - .rettable
|
147
|
+
.dd .rbyte - .rettable;
|
148
|
+
.dd .rhalfword - .rettable;
|
149
|
+
.dd .rint64 - .rettable;
|
150
|
+
.dd .rint32 - .rettable;
|
151
|
+
|
152
|
+
.rbyte:
|
153
|
+
P0 = [FP+24];
|
154
|
+
R0 = R0.B (Z);
|
155
|
+
[P0] = R0;
|
156
|
+
JUMP .epilogue
|
157
|
+
.rhalfword:
|
158
|
+
P0 = [FP+24];
|
159
|
+
R0 = R0.L;
|
160
|
+
[P0] = R0;
|
161
|
+
JUMP .epilogue
|
162
|
+
.rint64:
|
163
|
+
P0 = [FP+24];// &rvalue
|
164
|
+
[P0] = R0;
|
165
|
+
[P0+4] = R1;
|
166
|
+
JUMP .epilogue
|
167
|
+
.rint32:
|
168
|
+
P0 = [FP+24];
|
169
|
+
[P0] = R0;
|
170
|
+
.epilogue:
|
171
|
+
R0 = [FP+8];
|
172
|
+
R1 = [FP+12];
|
173
|
+
R2 = [FP+16];
|
174
|
+
P3 = [FP-20];
|
175
|
+
UNLINK;
|
176
|
+
RTS;
|
177
|
+
|
178
|
+
.size _ffi_call_SYSV,.-_ffi_call_SYSV;
|
179
|
+
.endfunc
|
@@ -30,11 +30,12 @@
|
|
30
30
|
#define _GNU_SOURCE 1
|
31
31
|
#endif
|
32
32
|
|
33
|
+
#include <fficonfig.h>
|
33
34
|
#include <ffi.h>
|
34
35
|
#include <ffi_common.h>
|
35
36
|
|
36
37
|
#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
|
37
|
-
# if
|
38
|
+
# if __linux__ && !defined(__ANDROID__)
|
38
39
|
/* This macro indicates it may be forbidden to map anonymous memory
|
39
40
|
with both write and execute permission. Code compiled when this
|
40
41
|
option is defined will attempt to map such pages once, but if it
|
@@ -64,11 +65,248 @@
|
|
64
65
|
|
65
66
|
#if FFI_CLOSURES
|
66
67
|
|
67
|
-
#
|
68
|
+
#if FFI_EXEC_TRAMPOLINE_TABLE
|
69
|
+
|
70
|
+
#ifdef __MACH__
|
71
|
+
|
72
|
+
#include <mach/mach.h>
|
73
|
+
#include <pthread.h>
|
74
|
+
#include <stdio.h>
|
75
|
+
#include <stdlib.h>
|
76
|
+
|
77
|
+
extern void *ffi_closure_trampoline_table_page;
|
78
|
+
|
79
|
+
typedef struct ffi_trampoline_table ffi_trampoline_table;
|
80
|
+
typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
|
81
|
+
|
82
|
+
struct ffi_trampoline_table
|
83
|
+
{
|
84
|
+
/* contiguous writable and executable pages */
|
85
|
+
vm_address_t config_page;
|
86
|
+
vm_address_t trampoline_page;
|
87
|
+
|
88
|
+
/* free list tracking */
|
89
|
+
uint16_t free_count;
|
90
|
+
ffi_trampoline_table_entry *free_list;
|
91
|
+
ffi_trampoline_table_entry *free_list_pool;
|
92
|
+
|
93
|
+
ffi_trampoline_table *prev;
|
94
|
+
ffi_trampoline_table *next;
|
95
|
+
};
|
96
|
+
|
97
|
+
struct ffi_trampoline_table_entry
|
98
|
+
{
|
99
|
+
void *(*trampoline) ();
|
100
|
+
ffi_trampoline_table_entry *next;
|
101
|
+
};
|
102
|
+
|
103
|
+
/* Total number of trampolines that fit in one trampoline table */
|
104
|
+
#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE)
|
105
|
+
|
106
|
+
static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
|
107
|
+
static ffi_trampoline_table *ffi_trampoline_tables = NULL;
|
108
|
+
|
109
|
+
static ffi_trampoline_table *
|
110
|
+
ffi_trampoline_table_alloc ()
|
111
|
+
{
|
112
|
+
ffi_trampoline_table *table = NULL;
|
113
|
+
|
114
|
+
/* Loop until we can allocate two contiguous pages */
|
115
|
+
while (table == NULL)
|
116
|
+
{
|
117
|
+
vm_address_t config_page = 0x0;
|
118
|
+
kern_return_t kt;
|
119
|
+
|
120
|
+
/* Try to allocate two pages */
|
121
|
+
kt =
|
122
|
+
vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2,
|
123
|
+
VM_FLAGS_ANYWHERE);
|
124
|
+
if (kt != KERN_SUCCESS)
|
125
|
+
{
|
126
|
+
fprintf (stderr, "vm_allocate() failure: %d at %s:%d\n", kt,
|
127
|
+
__FILE__, __LINE__);
|
128
|
+
break;
|
129
|
+
}
|
130
|
+
|
131
|
+
/* Now drop the second half of the allocation to make room for the trampoline table */
|
132
|
+
vm_address_t trampoline_page = config_page + PAGE_MAX_SIZE;
|
133
|
+
kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_MAX_SIZE);
|
134
|
+
if (kt != KERN_SUCCESS)
|
135
|
+
{
|
136
|
+
fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
|
137
|
+
__FILE__, __LINE__);
|
138
|
+
break;
|
139
|
+
}
|
140
|
+
|
141
|
+
/* Remap the trampoline table to directly follow the config page */
|
142
|
+
vm_prot_t cur_prot;
|
143
|
+
vm_prot_t max_prot;
|
144
|
+
|
145
|
+
vm_address_t trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
|
146
|
+
#ifdef __arm__
|
147
|
+
/* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */
|
148
|
+
trampoline_page_template &= ~1UL;
|
149
|
+
#endif
|
150
|
+
|
151
|
+
kt =
|
152
|
+
vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, FALSE,
|
153
|
+
mach_task_self (), trampoline_page_template, FALSE,
|
154
|
+
&cur_prot, &max_prot, VM_INHERIT_SHARE);
|
155
|
+
|
156
|
+
/* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */
|
157
|
+
if (kt != KERN_SUCCESS)
|
158
|
+
{
|
159
|
+
/* Log unexpected failures */
|
160
|
+
if (kt != KERN_NO_SPACE)
|
161
|
+
{
|
162
|
+
fprintf (stderr, "vm_remap() failure: %d at %s:%d\n", kt,
|
163
|
+
__FILE__, __LINE__);
|
164
|
+
}
|
165
|
+
|
166
|
+
vm_deallocate (mach_task_self (), config_page, PAGE_SIZE);
|
167
|
+
continue;
|
168
|
+
}
|
169
|
+
|
170
|
+
/* We have valid trampoline and config pages */
|
171
|
+
table = calloc (1, sizeof (ffi_trampoline_table));
|
172
|
+
table->free_count = FFI_TRAMPOLINE_COUNT;
|
173
|
+
table->config_page = config_page;
|
174
|
+
table->trampoline_page = trampoline_page;
|
175
|
+
|
176
|
+
/* Create and initialize the free list */
|
177
|
+
table->free_list_pool =
|
178
|
+
calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry));
|
179
|
+
|
180
|
+
uint16_t i;
|
181
|
+
for (i = 0; i < table->free_count; i++)
|
182
|
+
{
|
183
|
+
ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
|
184
|
+
entry->trampoline =
|
185
|
+
(void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
|
186
|
+
|
187
|
+
if (i < table->free_count - 1)
|
188
|
+
entry->next = &table->free_list_pool[i + 1];
|
189
|
+
}
|
190
|
+
|
191
|
+
table->free_list = table->free_list_pool;
|
192
|
+
}
|
193
|
+
|
194
|
+
return table;
|
195
|
+
}
|
196
|
+
|
197
|
+
void *
|
198
|
+
ffi_closure_alloc (size_t size, void **code)
|
199
|
+
{
|
200
|
+
/* Create the closure */
|
201
|
+
ffi_closure *closure = malloc (size);
|
202
|
+
if (closure == NULL)
|
203
|
+
return NULL;
|
204
|
+
|
205
|
+
pthread_mutex_lock (&ffi_trampoline_lock);
|
206
|
+
|
207
|
+
/* Check for an active trampoline table with available entries. */
|
208
|
+
ffi_trampoline_table *table = ffi_trampoline_tables;
|
209
|
+
if (table == NULL || table->free_list == NULL)
|
210
|
+
{
|
211
|
+
table = ffi_trampoline_table_alloc ();
|
212
|
+
if (table == NULL)
|
213
|
+
{
|
214
|
+
pthread_mutex_unlock (&ffi_trampoline_lock);
|
215
|
+
free (closure);
|
216
|
+
return NULL;
|
217
|
+
}
|
218
|
+
|
219
|
+
/* Insert the new table at the top of the list */
|
220
|
+
table->next = ffi_trampoline_tables;
|
221
|
+
if (table->next != NULL)
|
222
|
+
table->next->prev = table;
|
223
|
+
|
224
|
+
ffi_trampoline_tables = table;
|
225
|
+
}
|
226
|
+
|
227
|
+
/* Claim the free entry */
|
228
|
+
ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
|
229
|
+
ffi_trampoline_tables->free_list = entry->next;
|
230
|
+
ffi_trampoline_tables->free_count--;
|
231
|
+
entry->next = NULL;
|
232
|
+
|
233
|
+
pthread_mutex_unlock (&ffi_trampoline_lock);
|
234
|
+
|
235
|
+
/* Initialize the return values */
|
236
|
+
*code = entry->trampoline;
|
237
|
+
closure->trampoline_table = table;
|
238
|
+
closure->trampoline_table_entry = entry;
|
239
|
+
|
240
|
+
return closure;
|
241
|
+
}
|
242
|
+
|
243
|
+
void
|
244
|
+
ffi_closure_free (void *ptr)
|
245
|
+
{
|
246
|
+
ffi_closure *closure = ptr;
|
247
|
+
|
248
|
+
pthread_mutex_lock (&ffi_trampoline_lock);
|
249
|
+
|
250
|
+
/* Fetch the table and entry references */
|
251
|
+
ffi_trampoline_table *table = closure->trampoline_table;
|
252
|
+
ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
|
253
|
+
|
254
|
+
/* Return the entry to the free list */
|
255
|
+
entry->next = table->free_list;
|
256
|
+
table->free_list = entry;
|
257
|
+
table->free_count++;
|
258
|
+
|
259
|
+
/* If all trampolines within this table are free, and at least one other table exists, deallocate
|
260
|
+
* the table */
|
261
|
+
if (table->free_count == FFI_TRAMPOLINE_COUNT
|
262
|
+
&& ffi_trampoline_tables != table)
|
263
|
+
{
|
264
|
+
/* Remove from the list */
|
265
|
+
if (table->prev != NULL)
|
266
|
+
table->prev->next = table->next;
|
267
|
+
|
268
|
+
if (table->next != NULL)
|
269
|
+
table->next->prev = table->prev;
|
270
|
+
|
271
|
+
/* Deallocate pages */
|
272
|
+
kern_return_t kt;
|
273
|
+
kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE);
|
274
|
+
if (kt != KERN_SUCCESS)
|
275
|
+
fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
|
276
|
+
__FILE__, __LINE__);
|
277
|
+
|
278
|
+
kt =
|
279
|
+
vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE);
|
280
|
+
if (kt != KERN_SUCCESS)
|
281
|
+
fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
|
282
|
+
__FILE__, __LINE__);
|
283
|
+
|
284
|
+
/* Deallocate free list */
|
285
|
+
free (table->free_list_pool);
|
286
|
+
free (table);
|
287
|
+
}
|
288
|
+
else if (ffi_trampoline_tables != table)
|
289
|
+
{
|
290
|
+
/* Otherwise, bump this table to the top of the list */
|
291
|
+
table->prev = NULL;
|
292
|
+
table->next = ffi_trampoline_tables;
|
293
|
+
if (ffi_trampoline_tables != NULL)
|
294
|
+
ffi_trampoline_tables->prev = table;
|
295
|
+
|
296
|
+
ffi_trampoline_tables = table;
|
297
|
+
}
|
298
|
+
|
299
|
+
pthread_mutex_unlock (&ffi_trampoline_lock);
|
300
|
+
|
301
|
+
/* Free the closure */
|
302
|
+
free (closure);
|
303
|
+
}
|
304
|
+
|
305
|
+
#endif
|
68
306
|
|
69
307
|
// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
|
70
308
|
|
71
|
-
#
|
309
|
+
#elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
|
72
310
|
|
73
311
|
#define USE_LOCKS 1
|
74
312
|
#define USE_DL_PREFIX 1
|
@@ -94,14 +332,6 @@
|
|
94
332
|
/* Don't allocate more than a page unless needed. */
|
95
333
|
#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
|
96
334
|
|
97
|
-
#if FFI_CLOSURE_TEST
|
98
|
-
/* Don't release single pages, to avoid a worst-case scenario of
|
99
|
-
continuously allocating and releasing single pages, but release
|
100
|
-
pairs of pages, which should do just as well given that allocations
|
101
|
-
are likely to be small. */
|
102
|
-
#define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize)
|
103
|
-
#endif
|
104
|
-
|
105
335
|
#include <sys/types.h>
|
106
336
|
#include <sys/stat.h>
|
107
337
|
#include <fcntl.h>
|
@@ -172,6 +402,41 @@ selinux_enabled_check (void)
|
|
172
402
|
|
173
403
|
#endif /* !FFI_MMAP_EXEC_SELINUX */
|
174
404
|
|
405
|
+
/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
|
406
|
+
#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
|
407
|
+
#include <stdlib.h>
|
408
|
+
|
409
|
+
static int emutramp_enabled = -1;
|
410
|
+
|
411
|
+
static int
|
412
|
+
emutramp_enabled_check (void)
|
413
|
+
{
|
414
|
+
char *buf = NULL;
|
415
|
+
size_t len = 0;
|
416
|
+
FILE *f;
|
417
|
+
int ret;
|
418
|
+
f = fopen ("/proc/self/status", "r");
|
419
|
+
if (f == NULL)
|
420
|
+
return 0;
|
421
|
+
ret = 0;
|
422
|
+
|
423
|
+
while (getline (&buf, &len, f) != -1)
|
424
|
+
if (!strncmp (buf, "PaX:", 4))
|
425
|
+
{
|
426
|
+
char emutramp;
|
427
|
+
if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
|
428
|
+
ret = (emutramp == 'E');
|
429
|
+
break;
|
430
|
+
}
|
431
|
+
free (buf);
|
432
|
+
fclose (f);
|
433
|
+
return ret;
|
434
|
+
}
|
435
|
+
|
436
|
+
#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
|
437
|
+
: (emutramp_enabled = emutramp_enabled_check ()))
|
438
|
+
#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
|
439
|
+
|
175
440
|
#elif defined (__CYGWIN__) || defined(__INTERIX)
|
176
441
|
|
177
442
|
#include <sys/mman.h>
|
@@ -181,6 +446,10 @@ selinux_enabled_check (void)
|
|
181
446
|
|
182
447
|
#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
|
183
448
|
|
449
|
+
#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
|
450
|
+
#define is_emutramp_enabled() 0
|
451
|
+
#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
|
452
|
+
|
184
453
|
/* Declare all functions defined in dlmalloc.c as static. */
|
185
454
|
static void *dlmalloc(size_t);
|
186
455
|
static void dlfree(void*);
|
@@ -226,9 +495,15 @@ static size_t execsize = 0;
|
|
226
495
|
|
227
496
|
/* Open a temporary file name, and immediately unlink it. */
|
228
497
|
static int
|
229
|
-
open_temp_exec_file_name (char *name)
|
498
|
+
open_temp_exec_file_name (char *name, int flags)
|
230
499
|
{
|
231
|
-
int fd
|
500
|
+
int fd;
|
501
|
+
|
502
|
+
#ifdef HAVE_MKOSTEMP
|
503
|
+
fd = mkostemp (name, flags);
|
504
|
+
#else
|
505
|
+
fd = mkstemp (name);
|
506
|
+
#endif
|
232
507
|
|
233
508
|
if (fd != -1)
|
234
509
|
unlink (name);
|
@@ -241,8 +516,30 @@ static int
|
|
241
516
|
open_temp_exec_file_dir (const char *dir)
|
242
517
|
{
|
243
518
|
static const char suffix[] = "/ffiXXXXXX";
|
244
|
-
int lendir
|
245
|
-
char *tempname
|
519
|
+
int lendir, flags;
|
520
|
+
char *tempname;
|
521
|
+
#ifdef O_TMPFILE
|
522
|
+
int fd;
|
523
|
+
#endif
|
524
|
+
|
525
|
+
#ifdef O_CLOEXEC
|
526
|
+
flags = O_CLOEXEC;
|
527
|
+
#else
|
528
|
+
flags = 0;
|
529
|
+
#endif
|
530
|
+
|
531
|
+
#ifdef O_TMPFILE
|
532
|
+
fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700);
|
533
|
+
/* If the running system does not support the O_TMPFILE flag then retry without it. */
|
534
|
+
if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) {
|
535
|
+
return fd;
|
536
|
+
} else {
|
537
|
+
errno = 0;
|
538
|
+
}
|
539
|
+
#endif
|
540
|
+
|
541
|
+
lendir = strlen (dir);
|
542
|
+
tempname = __builtin_alloca (lendir + sizeof (suffix));
|
246
543
|
|
247
544
|
if (!tempname)
|
248
545
|
return -1;
|
@@ -250,7 +547,7 @@ open_temp_exec_file_dir (const char *dir)
|
|
250
547
|
memcpy (tempname, dir, lendir);
|
251
548
|
memcpy (tempname + lendir, suffix, sizeof (suffix));
|
252
549
|
|
253
|
-
return open_temp_exec_file_name (tempname);
|
550
|
+
return open_temp_exec_file_name (tempname, flags);
|
254
551
|
}
|
255
552
|
|
256
553
|
/* Open a temporary file in the directory in the named environment
|
@@ -359,7 +656,7 @@ open_temp_exec_file_opts_next (void)
|
|
359
656
|
}
|
360
657
|
|
361
658
|
/* Return a file descriptor of a temporary zero-sized file in a
|
362
|
-
writable and
|
659
|
+
writable and executable filesystem. */
|
363
660
|
static int
|
364
661
|
open_temp_exec_file (void)
|
365
662
|
{
|
@@ -454,9 +751,11 @@ dlmmap (void *start, size_t length, int prot,
|
|
454
751
|
&& flags == (MAP_PRIVATE | MAP_ANONYMOUS)
|
455
752
|
&& fd == -1 && offset == 0);
|
456
753
|
|
457
|
-
|
458
|
-
|
459
|
-
|
754
|
+
if (execfd == -1 && is_emutramp_enabled ())
|
755
|
+
{
|
756
|
+
ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
|
757
|
+
return ptr;
|
758
|
+
}
|
460
759
|
|
461
760
|
if (execfd == -1 && !is_selinux_enabled ())
|
462
761
|
{
|
@@ -497,10 +796,6 @@ dlmunmap (void *start, size_t length)
|
|
497
796
|
msegmentptr seg = segment_holding (gm, start);
|
498
797
|
void *code;
|
499
798
|
|
500
|
-
#if FFI_CLOSURE_TEST
|
501
|
-
printf ("unmapping %zi\n", length);
|
502
|
-
#endif
|
503
|
-
|
504
799
|
if (seg && (code = add_segment_exec_offset (start, seg)) != start)
|
505
800
|
{
|
506
801
|
int ret = munmap (code, length);
|
@@ -569,26 +864,6 @@ ffi_closure_free (void *ptr)
|
|
569
864
|
dlfree (ptr);
|
570
865
|
}
|
571
866
|
|
572
|
-
|
573
|
-
#if FFI_CLOSURE_TEST
|
574
|
-
/* Do some internal sanity testing to make sure allocation and
|
575
|
-
deallocation of pages are working as intended. */
|
576
|
-
int main ()
|
577
|
-
{
|
578
|
-
void *p[3];
|
579
|
-
#define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0)
|
580
|
-
#define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0)
|
581
|
-
GET (0, malloc_getpagesize / 2);
|
582
|
-
GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*));
|
583
|
-
PUT (1);
|
584
|
-
GET (1, 2 * malloc_getpagesize);
|
585
|
-
GET (2, malloc_getpagesize / 2);
|
586
|
-
PUT (1);
|
587
|
-
PUT (0);
|
588
|
-
PUT (2);
|
589
|
-
return 0;
|
590
|
-
}
|
591
|
-
#endif /* FFI_CLOSURE_TEST */
|
592
867
|
# else /* ! FFI_MMAP_EXEC_WRIT */
|
593
868
|
|
594
869
|
/* On many systems, memory returned by malloc is writable and
|