ffi 1.9.18 → 1.9.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +22 -0
- data/.gitmodules +3 -0
- data/.travis.yml +52 -0
- data/.yardopts +5 -0
- data/Gemfile +15 -0
- data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
- data/README.md +3 -4
- data/Rakefile +41 -5
- data/appveyor.yml +22 -0
- data/ext/ffi_c/AbstractMemory.c +6 -1
- data/ext/ffi_c/Call.c +1 -22
- data/ext/ffi_c/Call.h +0 -9
- data/ext/ffi_c/Closure.c +54 -0
- data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
- data/ext/ffi_c/Function.c +16 -25
- data/ext/ffi_c/Function.h +1 -2
- data/ext/ffi_c/FunctionInfo.c +0 -4
- data/ext/ffi_c/MethodHandle.c +33 -268
- data/ext/ffi_c/Platform.c +10 -2
- data/ext/ffi_c/extconf.rb +10 -5
- data/ext/ffi_c/ffi.c +2 -2
- data/ext/ffi_c/libffi/.appveyor.yml +48 -0
- data/ext/ffi_c/libffi/.gitignore +36 -0
- data/ext/ffi_c/libffi/.travis/install.sh +14 -0
- data/ext/ffi_c/libffi/.travis.yml +30 -0
- 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 +169 -158
- data/ext/ffi_c/libffi/Makefile.in +927 -938
- data/ext/ffi_c/libffi/README +164 -52
- data/ext/ffi_c/libffi/acinclude.m4 +387 -0
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/config.guess +336 -371
- data/ext/ffi_c/libffi/config.sub +246 -115
- data/ext/ffi_c/libffi/configure +6976 -2189
- data/ext/ffi_c/libffi/configure.ac +148 -256
- data/ext/ffi_c/libffi/configure.host +277 -4
- 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/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -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 +112 -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 +1043 -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/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 +964 -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 +608 -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 +366 -45
- 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/ia64/unix.S +2 -0
- 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 +103 -28
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
- data/ext/ffi_c/libffi/src/mips/n32.S +128 -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 +245 -7
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
- 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 +111 -30
- 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 +103 -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 +591 -500
- data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -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 +79 -73
- data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -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_3float.c +95 -0
- 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/ext/ffi_c/libffi.bsd.mk +11 -5
- data/ext/ffi_c/libffi.darwin.mk +14 -4
- data/ext/ffi_c/libffi.gnu.mk +3 -2
- data/ext/ffi_c/libffi.mk +10 -5
- data/ext/ffi_c/libffi.vc.mk +1 -1
- data/ext/ffi_c/libffi.vc64.mk +1 -1
- data/ffi.gemspec +16 -3
- data/lib/ffi/enum.rb +124 -0
- data/lib/ffi/library.rb +66 -14
- data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
- data/lib/ffi/platform.rb +7 -2
- data/lib/ffi/pointer.rb +1 -0
- data/lib/ffi/struct.rb +0 -2
- data/lib/ffi/version.rb +1 -2
- data/samples/getlogin.rb +8 -0
- data/samples/getpid.rb +8 -0
- data/samples/gettimeofday.rb +18 -0
- data/samples/hello.rb +7 -0
- data/samples/inotify.rb +60 -0
- data/samples/pty.rb +76 -0
- data/samples/qsort.rb +21 -0
- data/samples/sample_helper.rb +6 -0
- metadata +164 -115
- data/ext/ffi_c/ClosurePool.c +0 -283
- data/ext/ffi_c/libffi/Makefile.vc +0 -141
- data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
- data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
- data/ext/ffi_c/libffi/build-ios.sh +0 -67
- data/ext/ffi_c/libffi/compile +0 -143
- data/ext/ffi_c/libffi/depcomp +0 -630
- 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/m4/libtool.m4 +0 -7831
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
- data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
- data/ext/ffi_c/libffi/mdate-sh +0 -201
- 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
- data/ext/ffi_c/libffi/texinfo.tex +0 -7210
- data/gen/Rakefile +0 -30
- data/libtest/Benchmark.c +0 -52
- data/libtest/BoolTest.c +0 -34
- data/libtest/BufferTest.c +0 -31
- data/libtest/ClosureTest.c +0 -205
- data/libtest/EnumTest.c +0 -51
- data/libtest/FunctionTest.c +0 -70
- data/libtest/GNUmakefile +0 -149
- data/libtest/GlobalVariable.c +0 -62
- data/libtest/LastErrorTest.c +0 -21
- data/libtest/NumberTest.c +0 -132
- data/libtest/PointerTest.c +0 -63
- data/libtest/ReferenceTest.c +0 -23
- data/libtest/StringTest.c +0 -34
- data/libtest/StructTest.c +0 -243
- data/libtest/UnionTest.c +0 -43
- data/libtest/VariadicTest.c +0 -99
- data/spec/ffi/async_callback_spec.rb +0 -35
- data/spec/ffi/bool_spec.rb +0 -32
- data/spec/ffi/buffer_spec.rb +0 -279
- data/spec/ffi/callback_spec.rb +0 -773
- data/spec/ffi/custom_param_type.rb +0 -37
- data/spec/ffi/custom_type_spec.rb +0 -74
- data/spec/ffi/dup_spec.rb +0 -52
- data/spec/ffi/enum_spec.rb +0 -423
- data/spec/ffi/errno_spec.rb +0 -20
- data/spec/ffi/ffi_spec.rb +0 -28
- data/spec/ffi/fixtures/Benchmark.c +0 -52
- data/spec/ffi/fixtures/BoolTest.c +0 -34
- data/spec/ffi/fixtures/BufferTest.c +0 -31
- data/spec/ffi/fixtures/ClosureTest.c +0 -205
- data/spec/ffi/fixtures/EnumTest.c +0 -51
- data/spec/ffi/fixtures/FunctionTest.c +0 -142
- data/spec/ffi/fixtures/GNUmakefile +0 -149
- data/spec/ffi/fixtures/GlobalVariable.c +0 -62
- data/spec/ffi/fixtures/LastErrorTest.c +0 -21
- data/spec/ffi/fixtures/NumberTest.c +0 -132
- data/spec/ffi/fixtures/PipeHelper.h +0 -21
- data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
- data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
- data/spec/ffi/fixtures/PointerTest.c +0 -63
- data/spec/ffi/fixtures/ReferenceTest.c +0 -23
- data/spec/ffi/fixtures/StringTest.c +0 -34
- data/spec/ffi/fixtures/StructTest.c +0 -243
- data/spec/ffi/fixtures/UnionTest.c +0 -43
- data/spec/ffi/fixtures/VariadicTest.c +0 -99
- data/spec/ffi/fixtures/classes.rb +0 -438
- data/spec/ffi/function_spec.rb +0 -97
- data/spec/ffi/io_spec.rb +0 -16
- data/spec/ffi/library_spec.rb +0 -286
- data/spec/ffi/long_double.rb +0 -30
- data/spec/ffi/managed_struct_spec.rb +0 -68
- data/spec/ffi/memorypointer_spec.rb +0 -78
- data/spec/ffi/number_spec.rb +0 -247
- data/spec/ffi/platform_spec.rb +0 -114
- data/spec/ffi/pointer_spec.rb +0 -285
- data/spec/ffi/rbx/attach_function_spec.rb +0 -34
- data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
- data/spec/ffi/rbx/spec_helper.rb +0 -6
- data/spec/ffi/rbx/struct_spec.rb +0 -18
- data/spec/ffi/spec_helper.rb +0 -93
- data/spec/ffi/string_spec.rb +0 -118
- data/spec/ffi/strptr_spec.rb +0 -50
- data/spec/ffi/struct_by_ref_spec.rb +0 -43
- data/spec/ffi/struct_callback_spec.rb +0 -69
- data/spec/ffi/struct_initialize_spec.rb +0 -35
- data/spec/ffi/struct_packed_spec.rb +0 -50
- data/spec/ffi/struct_spec.rb +0 -886
- data/spec/ffi/typedef_spec.rb +0 -91
- data/spec/ffi/union_spec.rb +0 -67
- data/spec/ffi/variadic_spec.rb +0 -132
- data/spec/spec.opts +0 -4
|
@@ -30,11 +30,88 @@
|
|
|
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
|
|
|
37
|
+
#ifdef __NetBSD__
|
|
38
|
+
#include <sys/param.h>
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
#if __NetBSD_Version__ - 0 >= 799007200
|
|
42
|
+
/* NetBSD with PROT_MPROTECT */
|
|
43
|
+
#include <sys/mman.h>
|
|
44
|
+
|
|
45
|
+
#include <stddef.h>
|
|
46
|
+
#include <unistd.h>
|
|
47
|
+
|
|
48
|
+
static const size_t overhead =
|
|
49
|
+
(sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ?
|
|
50
|
+
sizeof(max_align_t)
|
|
51
|
+
: sizeof(void *) + sizeof(size_t);
|
|
52
|
+
|
|
53
|
+
#define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d)))
|
|
54
|
+
|
|
55
|
+
void *
|
|
56
|
+
ffi_closure_alloc (size_t size, void **code)
|
|
57
|
+
{
|
|
58
|
+
static size_t page_size;
|
|
59
|
+
size_t rounded_size;
|
|
60
|
+
void *codeseg, *dataseg;
|
|
61
|
+
int prot;
|
|
62
|
+
|
|
63
|
+
/* Expect that PAX mprotect is active and a separate code mapping is necessary. */
|
|
64
|
+
if (!code)
|
|
65
|
+
return NULL;
|
|
66
|
+
|
|
67
|
+
/* Obtain system page size. */
|
|
68
|
+
if (!page_size)
|
|
69
|
+
page_size = sysconf(_SC_PAGESIZE);
|
|
70
|
+
|
|
71
|
+
/* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */
|
|
72
|
+
rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1);
|
|
73
|
+
|
|
74
|
+
/* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */
|
|
75
|
+
prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC);
|
|
76
|
+
dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0);
|
|
77
|
+
if (dataseg == MAP_FAILED)
|
|
78
|
+
return NULL;
|
|
79
|
+
|
|
80
|
+
/* Create secondary mapping and switch it to RX. */
|
|
81
|
+
codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP);
|
|
82
|
+
if (codeseg == MAP_FAILED) {
|
|
83
|
+
munmap(dataseg, rounded_size);
|
|
84
|
+
return NULL;
|
|
85
|
+
}
|
|
86
|
+
if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) {
|
|
87
|
+
munmap(codeseg, rounded_size);
|
|
88
|
+
munmap(dataseg, rounded_size);
|
|
89
|
+
return NULL;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Remember allocation size and location of the secondary mapping for ffi_closure_free. */
|
|
93
|
+
memcpy(dataseg, &rounded_size, sizeof(rounded_size));
|
|
94
|
+
memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *));
|
|
95
|
+
*code = ADD_TO_POINTER(codeseg, overhead);
|
|
96
|
+
return ADD_TO_POINTER(dataseg, overhead);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
void
|
|
100
|
+
ffi_closure_free (void *ptr)
|
|
101
|
+
{
|
|
102
|
+
void *codeseg, *dataseg;
|
|
103
|
+
size_t rounded_size;
|
|
104
|
+
|
|
105
|
+
dataseg = ADD_TO_POINTER(ptr, -overhead);
|
|
106
|
+
memcpy(&rounded_size, dataseg, sizeof(rounded_size));
|
|
107
|
+
memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *));
|
|
108
|
+
munmap(dataseg, rounded_size);
|
|
109
|
+
munmap(codeseg, rounded_size);
|
|
110
|
+
}
|
|
111
|
+
#else /* !NetBSD with PROT_MPROTECT */
|
|
112
|
+
|
|
36
113
|
#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
|
|
37
|
-
# if
|
|
114
|
+
# if __linux__ && !defined(__ANDROID__)
|
|
38
115
|
/* This macro indicates it may be forbidden to map anonymous memory
|
|
39
116
|
with both write and execute permission. Code compiled when this
|
|
40
117
|
option is defined will attempt to map such pages once, but if it
|
|
@@ -54,7 +131,7 @@
|
|
|
54
131
|
#endif
|
|
55
132
|
|
|
56
133
|
#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
|
|
57
|
-
#
|
|
134
|
+
# if defined(__linux__) && !defined(__ANDROID__)
|
|
58
135
|
/* When defined to 1 check for SELinux and if SELinux is active,
|
|
59
136
|
don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
|
|
60
137
|
might cause audit messages. */
|
|
@@ -64,11 +141,216 @@
|
|
|
64
141
|
|
|
65
142
|
#if FFI_CLOSURES
|
|
66
143
|
|
|
67
|
-
#
|
|
144
|
+
#if FFI_EXEC_TRAMPOLINE_TABLE
|
|
145
|
+
|
|
146
|
+
#ifdef __MACH__
|
|
147
|
+
|
|
148
|
+
#include <mach/mach.h>
|
|
149
|
+
#include <pthread.h>
|
|
150
|
+
#include <stdio.h>
|
|
151
|
+
#include <stdlib.h>
|
|
152
|
+
|
|
153
|
+
extern void *ffi_closure_trampoline_table_page;
|
|
154
|
+
|
|
155
|
+
typedef struct ffi_trampoline_table ffi_trampoline_table;
|
|
156
|
+
typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
|
|
157
|
+
|
|
158
|
+
struct ffi_trampoline_table
|
|
159
|
+
{
|
|
160
|
+
/* contiguous writable and executable pages */
|
|
161
|
+
vm_address_t config_page;
|
|
162
|
+
vm_address_t trampoline_page;
|
|
163
|
+
|
|
164
|
+
/* free list tracking */
|
|
165
|
+
uint16_t free_count;
|
|
166
|
+
ffi_trampoline_table_entry *free_list;
|
|
167
|
+
ffi_trampoline_table_entry *free_list_pool;
|
|
168
|
+
|
|
169
|
+
ffi_trampoline_table *prev;
|
|
170
|
+
ffi_trampoline_table *next;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
struct ffi_trampoline_table_entry
|
|
174
|
+
{
|
|
175
|
+
void *(*trampoline) ();
|
|
176
|
+
ffi_trampoline_table_entry *next;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/* Total number of trampolines that fit in one trampoline table */
|
|
180
|
+
#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE)
|
|
181
|
+
|
|
182
|
+
static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
183
|
+
static ffi_trampoline_table *ffi_trampoline_tables = NULL;
|
|
184
|
+
|
|
185
|
+
static ffi_trampoline_table *
|
|
186
|
+
ffi_trampoline_table_alloc (void)
|
|
187
|
+
{
|
|
188
|
+
ffi_trampoline_table *table;
|
|
189
|
+
vm_address_t config_page;
|
|
190
|
+
vm_address_t trampoline_page;
|
|
191
|
+
vm_address_t trampoline_page_template;
|
|
192
|
+
vm_prot_t cur_prot;
|
|
193
|
+
vm_prot_t max_prot;
|
|
194
|
+
kern_return_t kt;
|
|
195
|
+
uint16_t i;
|
|
196
|
+
|
|
197
|
+
/* Allocate two pages -- a config page and a placeholder page */
|
|
198
|
+
config_page = 0x0;
|
|
199
|
+
kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2,
|
|
200
|
+
VM_FLAGS_ANYWHERE);
|
|
201
|
+
if (kt != KERN_SUCCESS)
|
|
202
|
+
return NULL;
|
|
203
|
+
|
|
204
|
+
/* Remap the trampoline table on top of the placeholder page */
|
|
205
|
+
trampoline_page = config_page + PAGE_MAX_SIZE;
|
|
206
|
+
trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
|
|
207
|
+
#ifdef __arm__
|
|
208
|
+
/* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */
|
|
209
|
+
trampoline_page_template &= ~1UL;
|
|
210
|
+
#endif
|
|
211
|
+
kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0,
|
|
212
|
+
VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template,
|
|
213
|
+
FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
|
|
214
|
+
if (kt != KERN_SUCCESS)
|
|
215
|
+
{
|
|
216
|
+
vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2);
|
|
217
|
+
return NULL;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* We have valid trampoline and config pages */
|
|
221
|
+
table = calloc (1, sizeof (ffi_trampoline_table));
|
|
222
|
+
table->free_count = FFI_TRAMPOLINE_COUNT;
|
|
223
|
+
table->config_page = config_page;
|
|
224
|
+
table->trampoline_page = trampoline_page;
|
|
225
|
+
|
|
226
|
+
/* Create and initialize the free list */
|
|
227
|
+
table->free_list_pool =
|
|
228
|
+
calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry));
|
|
229
|
+
|
|
230
|
+
for (i = 0; i < table->free_count; i++)
|
|
231
|
+
{
|
|
232
|
+
ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
|
|
233
|
+
entry->trampoline =
|
|
234
|
+
(void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
|
|
235
|
+
|
|
236
|
+
if (i < table->free_count - 1)
|
|
237
|
+
entry->next = &table->free_list_pool[i + 1];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
table->free_list = table->free_list_pool;
|
|
241
|
+
|
|
242
|
+
return table;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static void
|
|
246
|
+
ffi_trampoline_table_free (ffi_trampoline_table *table)
|
|
247
|
+
{
|
|
248
|
+
/* Remove from the list */
|
|
249
|
+
if (table->prev != NULL)
|
|
250
|
+
table->prev->next = table->next;
|
|
251
|
+
|
|
252
|
+
if (table->next != NULL)
|
|
253
|
+
table->next->prev = table->prev;
|
|
254
|
+
|
|
255
|
+
/* Deallocate pages */
|
|
256
|
+
vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2);
|
|
257
|
+
|
|
258
|
+
/* Deallocate free list */
|
|
259
|
+
free (table->free_list_pool);
|
|
260
|
+
free (table);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
void *
|
|
264
|
+
ffi_closure_alloc (size_t size, void **code)
|
|
265
|
+
{
|
|
266
|
+
/* Create the closure */
|
|
267
|
+
ffi_closure *closure = malloc (size);
|
|
268
|
+
if (closure == NULL)
|
|
269
|
+
return NULL;
|
|
270
|
+
|
|
271
|
+
pthread_mutex_lock (&ffi_trampoline_lock);
|
|
272
|
+
|
|
273
|
+
/* Check for an active trampoline table with available entries. */
|
|
274
|
+
ffi_trampoline_table *table = ffi_trampoline_tables;
|
|
275
|
+
if (table == NULL || table->free_list == NULL)
|
|
276
|
+
{
|
|
277
|
+
table = ffi_trampoline_table_alloc ();
|
|
278
|
+
if (table == NULL)
|
|
279
|
+
{
|
|
280
|
+
pthread_mutex_unlock (&ffi_trampoline_lock);
|
|
281
|
+
free (closure);
|
|
282
|
+
return NULL;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* Insert the new table at the top of the list */
|
|
286
|
+
table->next = ffi_trampoline_tables;
|
|
287
|
+
if (table->next != NULL)
|
|
288
|
+
table->next->prev = table;
|
|
289
|
+
|
|
290
|
+
ffi_trampoline_tables = table;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/* Claim the free entry */
|
|
294
|
+
ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
|
|
295
|
+
ffi_trampoline_tables->free_list = entry->next;
|
|
296
|
+
ffi_trampoline_tables->free_count--;
|
|
297
|
+
entry->next = NULL;
|
|
298
|
+
|
|
299
|
+
pthread_mutex_unlock (&ffi_trampoline_lock);
|
|
300
|
+
|
|
301
|
+
/* Initialize the return values */
|
|
302
|
+
*code = entry->trampoline;
|
|
303
|
+
closure->trampoline_table = table;
|
|
304
|
+
closure->trampoline_table_entry = entry;
|
|
305
|
+
|
|
306
|
+
return closure;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
void
|
|
310
|
+
ffi_closure_free (void *ptr)
|
|
311
|
+
{
|
|
312
|
+
ffi_closure *closure = ptr;
|
|
313
|
+
|
|
314
|
+
pthread_mutex_lock (&ffi_trampoline_lock);
|
|
315
|
+
|
|
316
|
+
/* Fetch the table and entry references */
|
|
317
|
+
ffi_trampoline_table *table = closure->trampoline_table;
|
|
318
|
+
ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
|
|
319
|
+
|
|
320
|
+
/* Return the entry to the free list */
|
|
321
|
+
entry->next = table->free_list;
|
|
322
|
+
table->free_list = entry;
|
|
323
|
+
table->free_count++;
|
|
324
|
+
|
|
325
|
+
/* If all trampolines within this table are free, and at least one other table exists, deallocate
|
|
326
|
+
* the table */
|
|
327
|
+
if (table->free_count == FFI_TRAMPOLINE_COUNT
|
|
328
|
+
&& ffi_trampoline_tables != table)
|
|
329
|
+
{
|
|
330
|
+
ffi_trampoline_table_free (table);
|
|
331
|
+
}
|
|
332
|
+
else if (ffi_trampoline_tables != table)
|
|
333
|
+
{
|
|
334
|
+
/* Otherwise, bump this table to the top of the list */
|
|
335
|
+
table->prev = NULL;
|
|
336
|
+
table->next = ffi_trampoline_tables;
|
|
337
|
+
if (ffi_trampoline_tables != NULL)
|
|
338
|
+
ffi_trampoline_tables->prev = table;
|
|
339
|
+
|
|
340
|
+
ffi_trampoline_tables = table;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
pthread_mutex_unlock (&ffi_trampoline_lock);
|
|
344
|
+
|
|
345
|
+
/* Free the closure */
|
|
346
|
+
free (closure);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
#endif
|
|
68
350
|
|
|
69
351
|
// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
|
|
70
352
|
|
|
71
|
-
#
|
|
353
|
+
#elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
|
|
72
354
|
|
|
73
355
|
#define USE_LOCKS 1
|
|
74
356
|
#define USE_DL_PREFIX 1
|
|
@@ -94,14 +376,6 @@
|
|
|
94
376
|
/* Don't allocate more than a page unless needed. */
|
|
95
377
|
#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
|
|
96
378
|
|
|
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
379
|
#include <sys/types.h>
|
|
106
380
|
#include <sys/stat.h>
|
|
107
381
|
#include <fcntl.h>
|
|
@@ -172,6 +446,41 @@ selinux_enabled_check (void)
|
|
|
172
446
|
|
|
173
447
|
#endif /* !FFI_MMAP_EXEC_SELINUX */
|
|
174
448
|
|
|
449
|
+
/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
|
|
450
|
+
#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
|
|
451
|
+
#include <stdlib.h>
|
|
452
|
+
|
|
453
|
+
static int emutramp_enabled = -1;
|
|
454
|
+
|
|
455
|
+
static int
|
|
456
|
+
emutramp_enabled_check (void)
|
|
457
|
+
{
|
|
458
|
+
char *buf = NULL;
|
|
459
|
+
size_t len = 0;
|
|
460
|
+
FILE *f;
|
|
461
|
+
int ret;
|
|
462
|
+
f = fopen ("/proc/self/status", "r");
|
|
463
|
+
if (f == NULL)
|
|
464
|
+
return 0;
|
|
465
|
+
ret = 0;
|
|
466
|
+
|
|
467
|
+
while (getline (&buf, &len, f) != -1)
|
|
468
|
+
if (!strncmp (buf, "PaX:", 4))
|
|
469
|
+
{
|
|
470
|
+
char emutramp;
|
|
471
|
+
if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
|
|
472
|
+
ret = (emutramp == 'E');
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
free (buf);
|
|
476
|
+
fclose (f);
|
|
477
|
+
return ret;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
|
|
481
|
+
: (emutramp_enabled = emutramp_enabled_check ()))
|
|
482
|
+
#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
|
|
483
|
+
|
|
175
484
|
#elif defined (__CYGWIN__) || defined(__INTERIX)
|
|
176
485
|
|
|
177
486
|
#include <sys/mman.h>
|
|
@@ -181,6 +490,10 @@ selinux_enabled_check (void)
|
|
|
181
490
|
|
|
182
491
|
#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
|
|
183
492
|
|
|
493
|
+
#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
|
|
494
|
+
#define is_emutramp_enabled() 0
|
|
495
|
+
#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
|
|
496
|
+
|
|
184
497
|
/* Declare all functions defined in dlmalloc.c as static. */
|
|
185
498
|
static void *dlmalloc(size_t);
|
|
186
499
|
static void dlfree(void*);
|
|
@@ -226,9 +539,15 @@ static size_t execsize = 0;
|
|
|
226
539
|
|
|
227
540
|
/* Open a temporary file name, and immediately unlink it. */
|
|
228
541
|
static int
|
|
229
|
-
open_temp_exec_file_name (char *name)
|
|
542
|
+
open_temp_exec_file_name (char *name, int flags)
|
|
230
543
|
{
|
|
231
|
-
int fd
|
|
544
|
+
int fd;
|
|
545
|
+
|
|
546
|
+
#ifdef HAVE_MKOSTEMP
|
|
547
|
+
fd = mkostemp (name, flags);
|
|
548
|
+
#else
|
|
549
|
+
fd = mkstemp (name);
|
|
550
|
+
#endif
|
|
232
551
|
|
|
233
552
|
if (fd != -1)
|
|
234
553
|
unlink (name);
|
|
@@ -241,8 +560,30 @@ static int
|
|
|
241
560
|
open_temp_exec_file_dir (const char *dir)
|
|
242
561
|
{
|
|
243
562
|
static const char suffix[] = "/ffiXXXXXX";
|
|
244
|
-
int lendir
|
|
245
|
-
char *tempname
|
|
563
|
+
int lendir, flags;
|
|
564
|
+
char *tempname;
|
|
565
|
+
#ifdef O_TMPFILE
|
|
566
|
+
int fd;
|
|
567
|
+
#endif
|
|
568
|
+
|
|
569
|
+
#ifdef O_CLOEXEC
|
|
570
|
+
flags = O_CLOEXEC;
|
|
571
|
+
#else
|
|
572
|
+
flags = 0;
|
|
573
|
+
#endif
|
|
574
|
+
|
|
575
|
+
#ifdef O_TMPFILE
|
|
576
|
+
fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700);
|
|
577
|
+
/* If the running system does not support the O_TMPFILE flag then retry without it. */
|
|
578
|
+
if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) {
|
|
579
|
+
return fd;
|
|
580
|
+
} else {
|
|
581
|
+
errno = 0;
|
|
582
|
+
}
|
|
583
|
+
#endif
|
|
584
|
+
|
|
585
|
+
lendir = (int) strlen (dir);
|
|
586
|
+
tempname = __builtin_alloca (lendir + sizeof (suffix));
|
|
246
587
|
|
|
247
588
|
if (!tempname)
|
|
248
589
|
return -1;
|
|
@@ -250,7 +591,7 @@ open_temp_exec_file_dir (const char *dir)
|
|
|
250
591
|
memcpy (tempname, dir, lendir);
|
|
251
592
|
memcpy (tempname + lendir, suffix, sizeof (suffix));
|
|
252
593
|
|
|
253
|
-
return open_temp_exec_file_name (tempname);
|
|
594
|
+
return open_temp_exec_file_name (tempname, flags);
|
|
254
595
|
}
|
|
255
596
|
|
|
256
597
|
/* Open a temporary file in the directory in the named environment
|
|
@@ -359,7 +700,7 @@ open_temp_exec_file_opts_next (void)
|
|
|
359
700
|
}
|
|
360
701
|
|
|
361
702
|
/* Return a file descriptor of a temporary zero-sized file in a
|
|
362
|
-
writable and
|
|
703
|
+
writable and executable filesystem. */
|
|
363
704
|
static int
|
|
364
705
|
open_temp_exec_file (void)
|
|
365
706
|
{
|
|
@@ -454,9 +795,11 @@ dlmmap (void *start, size_t length, int prot,
|
|
|
454
795
|
&& flags == (MAP_PRIVATE | MAP_ANONYMOUS)
|
|
455
796
|
&& fd == -1 && offset == 0);
|
|
456
797
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
798
|
+
if (execfd == -1 && is_emutramp_enabled ())
|
|
799
|
+
{
|
|
800
|
+
ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
|
|
801
|
+
return ptr;
|
|
802
|
+
}
|
|
460
803
|
|
|
461
804
|
if (execfd == -1 && !is_selinux_enabled ())
|
|
462
805
|
{
|
|
@@ -497,10 +840,6 @@ dlmunmap (void *start, size_t length)
|
|
|
497
840
|
msegmentptr seg = segment_holding (gm, start);
|
|
498
841
|
void *code;
|
|
499
842
|
|
|
500
|
-
#if FFI_CLOSURE_TEST
|
|
501
|
-
printf ("unmapping %zi\n", length);
|
|
502
|
-
#endif
|
|
503
|
-
|
|
504
843
|
if (seg && (code = add_segment_exec_offset (start, seg)) != start)
|
|
505
844
|
{
|
|
506
845
|
int ret = munmap (code, length);
|
|
@@ -569,26 +908,6 @@ ffi_closure_free (void *ptr)
|
|
|
569
908
|
dlfree (ptr);
|
|
570
909
|
}
|
|
571
910
|
|
|
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
911
|
# else /* ! FFI_MMAP_EXEC_WRIT */
|
|
593
912
|
|
|
594
913
|
/* On many systems, memory returned by malloc is writable and
|
|
@@ -613,3 +932,5 @@ ffi_closure_free (void *ptr)
|
|
|
613
932
|
|
|
614
933
|
# endif /* ! FFI_MMAP_EXEC_WRIT */
|
|
615
934
|
#endif /* FFI_CLOSURES */
|
|
935
|
+
|
|
936
|
+
#endif /* NetBSD with PROT_MPROTECT */
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
#include <ffi.h>
|
|
30
30
|
#include <ffi_common.h>
|
|
31
31
|
|
|
32
|
-
#define STACK_ARG_SIZE(x)
|
|
32
|
+
#define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG)
|
|
33
33
|
|
|
34
34
|
static ffi_status
|
|
35
35
|
initialize_aggregate_packed_struct (ffi_type * arg)
|
|
@@ -153,21 +153,24 @@ ffi_prep_args (char *stack, extended_cif * ecif)
|
|
|
153
153
|
return (struct_count);
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
ffi_status
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
156
|
+
ffi_status FFI_HIDDEN
|
|
157
|
+
ffi_prep_cif_core (ffi_cif * cif,
|
|
158
|
+
ffi_abi abi, unsigned int isvariadic,
|
|
159
|
+
unsigned int nfixedargs, unsigned int ntotalargs,
|
|
160
|
+
ffi_type * rtype, ffi_type ** atypes)
|
|
160
161
|
{
|
|
161
162
|
unsigned bytes = 0;
|
|
162
163
|
unsigned int i;
|
|
163
164
|
ffi_type **ptr;
|
|
164
165
|
|
|
165
166
|
FFI_ASSERT (cif != NULL);
|
|
167
|
+
FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
|
|
168
|
+
FFI_ASSERT(nfixedargs <= ntotalargs);
|
|
166
169
|
FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
|
|
167
170
|
|
|
168
171
|
cif->abi = abi;
|
|
169
172
|
cif->arg_types = atypes;
|
|
170
|
-
cif->nargs =
|
|
173
|
+
cif->nargs = ntotalargs;
|
|
171
174
|
cif->rtype = rtype;
|
|
172
175
|
|
|
173
176
|
cif->flags = 0;
|
|
@@ -187,7 +190,7 @@ ffi_prep_cif (ffi_cif * cif,
|
|
|
187
190
|
FFI_ASSERT_VALID_TYPE (*ptr);
|
|
188
191
|
|
|
189
192
|
if (((*ptr)->alignment - 1) & bytes)
|
|
190
|
-
bytes =
|
|
193
|
+
bytes = FFI_ALIGN (bytes, (*ptr)->alignment);
|
|
191
194
|
if ((*ptr)->type == FFI_TYPE_STRUCT)
|
|
192
195
|
{
|
|
193
196
|
if ((*ptr)->size > 8)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* -----------------------------------------------------------------*-C-*-
|
|
2
|
-
ffitarget.h - Copyright (c)
|
|
2
|
+
ffitarget.h - Copyright (c) 2012 Anthony Green
|
|
3
|
+
Copyright (c) 1996-2003 Red Hat, Inc.
|
|
3
4
|
Target configuration macros for CRIS.
|
|
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;
|
|
@@ -54,6 +54,11 @@ void ffi_type_test(ffi_type *a, char *file, int line)
|
|
|
54
54
|
FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line);
|
|
55
55
|
FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line);
|
|
56
56
|
FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line);
|
|
57
|
-
FFI_ASSERT_AT(a->type != FFI_TYPE_STRUCT
|
|
57
|
+
FFI_ASSERT_AT((a->type != FFI_TYPE_STRUCT && a->type != FFI_TYPE_COMPLEX)
|
|
58
|
+
|| a->elements != NULL, file, line);
|
|
59
|
+
FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX
|
|
60
|
+
|| (a->elements != NULL
|
|
61
|
+
&& a->elements[0] != NULL && a->elements[1] == NULL),
|
|
62
|
+
file, line);
|
|
58
63
|
|
|
59
64
|
}
|
|
@@ -438,6 +438,11 @@ DEFAULT_MMAP_THRESHOLD default: 256K
|
|
|
438
438
|
|
|
439
439
|
*/
|
|
440
440
|
|
|
441
|
+
#if defined __linux__ && !defined _GNU_SOURCE
|
|
442
|
+
/* mremap() on Linux requires this via sys/mman.h */
|
|
443
|
+
#define _GNU_SOURCE 1
|
|
444
|
+
#endif
|
|
445
|
+
|
|
441
446
|
#ifndef WIN32
|
|
442
447
|
#ifdef _WIN32
|
|
443
448
|
#define WIN32 1
|
|
@@ -1255,7 +1260,7 @@ extern void* sbrk(ptrdiff_t);
|
|
|
1255
1260
|
#define SIZE_T_BITSIZE (sizeof(size_t) << 3)
|
|
1256
1261
|
|
|
1257
1262
|
/* Some constants coerced to size_t */
|
|
1258
|
-
/* Annoying but necessary to avoid errors on some
|
|
1263
|
+
/* Annoying but necessary to avoid errors on some platforms */
|
|
1259
1264
|
#define SIZE_T_ZERO ((size_t)0)
|
|
1260
1265
|
#define SIZE_T_ONE ((size_t)1)
|
|
1261
1266
|
#define SIZE_T_TWO ((size_t)2)
|
|
@@ -1409,7 +1414,7 @@ static int win32munmap(void* ptr, size_t size) {
|
|
|
1409
1414
|
#define CALL_MORECORE(S) MFAIL
|
|
1410
1415
|
#endif /* HAVE_MORECORE */
|
|
1411
1416
|
|
|
1412
|
-
/* mstate bit set if
|
|
1417
|
+
/* mstate bit set if contiguous morecore disabled or failed */
|
|
1413
1418
|
#define USE_NONCONTIGUOUS_BIT (4U)
|
|
1414
1419
|
|
|
1415
1420
|
/* segment bit set in create_mspace_with_base */
|
|
@@ -1661,7 +1666,7 @@ struct malloc_chunk {
|
|
|
1661
1666
|
typedef struct malloc_chunk mchunk;
|
|
1662
1667
|
typedef struct malloc_chunk* mchunkptr;
|
|
1663
1668
|
typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */
|
|
1664
|
-
typedef
|
|
1669
|
+
typedef size_t bindex_t; /* Described below */
|
|
1665
1670
|
typedef unsigned int binmap_t; /* Described below */
|
|
1666
1671
|
typedef unsigned int flag_t; /* The type of various bit flag sets */
|
|
1667
1672
|
|
|
@@ -2291,7 +2296,7 @@ static size_t traverse_and_check(mstate m);
|
|
|
2291
2296
|
#define treebin_at(M,i) (&((M)->treebins[i]))
|
|
2292
2297
|
|
|
2293
2298
|
/* assign tree index for size S to variable I */
|
|
2294
|
-
#if defined(__GNUC__) && defined(
|
|
2299
|
+
#if defined(__GNUC__) && defined(__i386__)
|
|
2295
2300
|
#define compute_tree_index(S, I)\
|
|
2296
2301
|
{\
|
|
2297
2302
|
size_t X = S >> TREEBIN_SHIFT;\
|
|
@@ -2356,7 +2361,7 @@ static size_t traverse_and_check(mstate m);
|
|
|
2356
2361
|
|
|
2357
2362
|
/* index corresponding to given bit */
|
|
2358
2363
|
|
|
2359
|
-
#if defined(__GNUC__) && defined(
|
|
2364
|
+
#if defined(__GNUC__) && defined(__i386__)
|
|
2360
2365
|
#define compute_bit2idx(X, I)\
|
|
2361
2366
|
{\
|
|
2362
2367
|
unsigned int J;\
|
|
@@ -3090,8 +3095,8 @@ static void internal_malloc_stats(mstate m) {
|
|
|
3090
3095
|
and choose its bk node as its replacement.
|
|
3091
3096
|
2. If x was the last node of its size, but not a leaf node, it must
|
|
3092
3097
|
be replaced with a leaf node (not merely one with an open left or
|
|
3093
|
-
right), to make sure that lefts and rights of
|
|
3094
|
-
correspond properly to bit masks. We use the rightmost
|
|
3098
|
+
right), to make sure that lefts and rights of descendants
|
|
3099
|
+
correspond properly to bit masks. We use the rightmost descendant
|
|
3095
3100
|
of x. We could use any other leaf, but this is easy to locate and
|
|
3096
3101
|
tends to counteract removal of leftmosts elsewhere, and so keeps
|
|
3097
3102
|
paths shorter than minimally guaranteed. This doesn't loop much
|
|
@@ -3388,7 +3393,7 @@ static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
|
|
|
3388
3393
|
*ss = m->seg; /* Push current record */
|
|
3389
3394
|
m->seg.base = tbase;
|
|
3390
3395
|
m->seg.size = tsize;
|
|
3391
|
-
set_segment_flags(&m->seg, mmapped);
|
|
3396
|
+
(void)set_segment_flags(&m->seg, mmapped);
|
|
3392
3397
|
m->seg.next = ss;
|
|
3393
3398
|
|
|
3394
3399
|
/* Insert trailing fenceposts */
|
|
@@ -3548,7 +3553,7 @@ static void* sys_alloc(mstate m, size_t nb) {
|
|
|
3548
3553
|
if (!is_initialized(m)) { /* first-time initialization */
|
|
3549
3554
|
m->seg.base = m->least_addr = tbase;
|
|
3550
3555
|
m->seg.size = tsize;
|
|
3551
|
-
set_segment_flags(&m->seg, mmap_flag);
|
|
3556
|
+
(void)set_segment_flags(&m->seg, mmap_flag);
|
|
3552
3557
|
m->magic = mparams.magic;
|
|
3553
3558
|
init_bins(m);
|
|
3554
3559
|
if (is_global(m))
|
|
@@ -5091,10 +5096,10 @@ History:
|
|
|
5091
5096
|
Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
|
|
5092
5097
|
* Use last_remainder in more cases.
|
|
5093
5098
|
* Pack bins using idea from colin@nyx10.cs.du.edu
|
|
5094
|
-
* Use ordered bins instead of best-fit
|
|
5099
|
+
* Use ordered bins instead of best-fit threshold
|
|
5095
5100
|
* Eliminate block-local decls to simplify tracing and debugging.
|
|
5096
5101
|
* Support another case of realloc via move into top
|
|
5097
|
-
* Fix error
|
|
5102
|
+
* Fix error occurring when initial sbrk_base not word-aligned.
|
|
5098
5103
|
* Rely on page size for units instead of SBRK_UNIT to
|
|
5099
5104
|
avoid surprises about sbrk alignment conventions.
|
|
5100
5105
|
* Add mallinfo, mallopt. Thanks to Raymond Nijssen
|